Spring Framework
  1. Spring Framework
  2. SPR-7753

Spring disables shared cache in EclipseLink

    Details

    • Type: Improvement Improvement
    • Status: Open
    • Priority: Major Major
    • Resolution: Unresolved
    • Affects Version/s: None
    • Fix Version/s: General Backlog
    • Component/s: None
    • Labels:
      None
    • Last commented by a User:
      true

      Description

      In the EclipseLinkJpaDialect Spring does the following,

      @Override
      public Object beginTransaction(EntityManager entityManager, TransactionDefinition definition)
      throws PersistenceException, SQLException, TransactionException {

      super.beginTransaction(entityManager, definition);
      if (!definition.isReadOnly() && !this.lazyDatabaseTransaction)

      { // This is the magic bit. As with the existing Spring TopLink integration, // begin an early transaction to force EclipseLink to get a JDBC Connection // so that Spring can manage transactions with JDBC as well as EclipseLink. UnitOfWork uow = (UnitOfWork) getSession(entityManager); uow.beginEarlyTransaction(); }

      // Could return the UOW, if there were any advantage in having it later.
      return null;
      }

      This is done to force EclipseLink to read through a transactional connection, so that it can see changes made directly through JDBC. But it has the side-affect of effectively disabling the shared cache in EclipseLink.

      EclipseLink will no longer cache any objects read because a transactional connection is being used.

      Which connection is used is configurable in EclipseLink by the user, so Spring should not be forcing any setting on the user, and not be using an internal API to do it.

      The correct way to enable this is either to set the persistence unit property,
      "eclipselink.jdbc.exclusive-connection.mode"="Always" (will allow a shared cache)

      or
      "eclipselink.transaction.join-existing"="true" (does not allow a shared cache)

      If Spring desires different functionality than the EclipseLink defaults (not sure it should), then it should just default these properties if they have "not" already be configured by the user. This would allow the user to choose if they want caching to work or not.

      Otherwise just remove this code and let the user configure if they wish to allow caching or not.

        Activity

        Hide
        Jorg Heymans added a comment -

        From what i can see EclipseLinkJpaDialect only comes into play when using the JpaTransactionManager, when using JTA above mechanism is not active.

        Show
        Jorg Heymans added a comment - From what i can see EclipseLinkJpaDialect only comes into play when using the JpaTransactionManager, when using JTA above mechanism is not active.

          People

          • Assignee:
            Juergen Hoeller
            Reporter:
            James Sutherland
            Last updater:
            Jorg Heymans
          • Votes:
            1 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:
              Days since last comment:
              1 year, 10 weeks, 5 days ago