在 JPA / EclipsLink EntityManager 中更改隔离级别后进行清理

问题描述 投票:0回答:2

我正在使用自定义事务隔离级别在 JPA (EclipseLink) 中执行事务,我使用以下代码在 JPA 的底层连接上设置了该级别:

EntityManager

如果我在提交事务后尝试将隔离级别重置为旧值,则底层连接为 
// begin transaction entityManager.getTransaction().begin(); // store the old isolation level int isolationLevelOld = entityManager.unwrap(Connection.class).getTransactionIsolation(); // set the desired isolation level for this transaction entityManager.unwrap(Connection.class).setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); [...Queries...] // commit transaction entityManager.getTransaction().commit(); // reset isolation level to the old value (throws NullPointerException) entityManager.unwrap(Connection.class).setTransactionIsolation(isolationLevelOld);

null
返回 null)。我担心,如果我不重置隔离级别,隔离级别较差的连接会泄漏回池中。
更改隔离级别后正确的清理方法是什么?我应该在打电话之前这样做吗

entityManager.unwrap(Connection.class)

    

java jpa transactions eclipselink entitymanager
2个回答
1
投票
commit()

在调用

java.sql.Connection
时返回到池中,因此之后重置隔离级别是不可能的,并且 EclipseLink 通过返回
entityManager.getTransaction().commit();
连接来阻止。

维护对

null

的引用来规避此问题可能会泄漏更改设置的连接,因此我无法接受您的回答 RomanC


我最终创建了两个

Connection

实例。一种创建默认的

EntityManagerFactory
,另一种使用
EntityManagers
:
 创建带有我所需事务级别的连接的 
EntityManagers

SessionCustomizer

参见此处 
在 eclipselink 中设置隔离级别

然后我使用

public static class SessionCustomizer implements org.eclipse.persistence.config.SessionCustomizer { @Override public void customize(Session session) throws Exception { DatabaseLogin databaseLogin = (DatabaseLogin) session.getDatasourceLogin(); databaseLogin.setTransactionIsolation(DatabaseLogin.TRANSACTION_SERIALIZABLE); } } private void init() { entityManagerFactoryRegular = Persistence.createEntityManagerFactory("MyPersitenceRegular"); Map<String, String> props = new HashMap<>(); props.put(PersistenceUnitProperties.SESSION_CUSTOMIZER, SessionCustomizer.class.getName()); entityManagerFactoryTransactionSerializable = Persistence.createEntityManagerFactory("MyPersitenceTransactionSerializable", props); }

提供我需要的任何连接类型。警告:交易不能跨越多个

EntityManagerFactory
EntityManagers
    


0
投票

EntityManagerFactories

	
© www.soinside.com 2019 - 2024. All rights reserved.