我想使用 eclipse 链接设置隔离级别,
我尝试了这两种方法来做到这一点:
-
java.sql.Connection
mgr = EMF.get().createEntityManager();
tx = mgr.getTransaction();
tx.begin();
java.sql.Connection connection = mgr.unwrap(java.sql.Connection.class);
connection.setTransactionIsolation(java.sql.Connection.TRANSACTION_READ_COMMITTED);
System.out.println("Connection: "+connection.getTransactionIsolation());
//prints TRANSACTION_READ_COMMITED as expected
org.eclipse.persistence.sessions.DatabaseLogin databaseLogin = new DatabaseLogin();
System.out.println("DatabaseLoging: "+databaseLogin.getTransactionIsolation());
//prints -1, representing transaction isolation is not set
-
DatabaseLogin setTransationIsolation 方法 http://wiki.eclipse.org/Using_Advanced_Unit_of_Work_API_(ELUG)#DatabaseLogin_Method_setTransactionIsolation
mgr = EMF.get().createEntityManager();
tx = mgr.getTransaction();
tx.begin();
org.eclipse.persistence.sessions.DatabaseLogin databaseLogin = new DatabaseLogin();
databaseLogin.setTransactionIsolation(DatabaseLogin.TRANSACTION_READ_COMMITTED);
System.out.println("DatabaseLoging: "+databaseLogin.getTransactionIsolation());
//prints TRANSACTION_READ_COMMITED as expected
java.sql.Connection connection = mgr.unwrap(java.sql.Connection.class);
System.out.println("Connection: "+connection.getTransactionIsolation());
//prints TRANSACTION_REPEATABLE_READ
正如您所看到的,getTransacationIsolation() 方法的返回值之间存在一些不一致。我的问题是,在这两种情况下真正设置了哪种事务隔离?我知道 eclipse link 默认情况下使用不同的连接进行读取和写入操作,DatabaseLogin.setTransactionIsolation 应该为两个连接设置隔离级别,那么为什么 Connection.getTransactionIsolation 仍然返回另一个隔离级别?
我正在使用应用程序范围的 EntityManager、JPA 2.0、EclipseLink 2.5.2。
如果有更好的设置事务隔离的方法,请告诉我。
在使用 eclipse link 稍作停顿后,我终于找到了如何设置事务隔离级别。
正如 @Chris 中正确提到的他的回答 https://stackoverflow.com/a/31627782/2205582我需要获得DatabaseLogin
由会话使用。经过对 Eclipse 链接会话的小型研究后,我发现我可以更改Session
我自己的财产SessionCustomizer
,参见下面的代码:
package com.filip.blabla;
import org.eclipse.persistence.sessions.DatabaseLogin;
import org.eclipse.persistence.sessions.Session;
import org.eclipse.persistence.sessions.factories.SessionCustomizer;
public class DFSessionCustomizer implements SessionCustomizer {
@Override
public void customize(Session session) throws Exception {
DatabaseLogin databaseLogin = (DatabaseLogin) session.getDatasourceLogin();
databaseLogin.setTransactionIsolation(DatabaseLogin.TRANSACTION_READ_COMMITTED);
}
}
在 persistence.xml 中设置 SessionCustomizer
<property name="eclipselink.session.customizer" value="com.filip.blabla.DFSessionCustomizer"/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)