Fil*_*ipR 4 jpa eclipselink isolation-level
我想使用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
Run Code Online (Sandbox Code Playgroud)DatabaseLogin setTransationIsolation方法
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
Run Code Online (Sandbox Code Playgroud)如您所见,getTransacationIsolation()方法的返回值之间存在一些不一致.我的问题是,在两种情况下都确实设置了哪种事务隔离?我知道默认情况下eclipse链接使用不同的连接进行读写操作,DatabaseLogin.setTransactionIsolation应该为两个连接设置隔离级别,那么为什么Connection.getTransactionIsolation仍然返回另一个隔离级别?
我正在使用应用程序范围的EntityManager,JPA 2.0,EclipseLink 2.5.2.
如果有更好的方法设置事务隔离,请告诉我.
在使用eclipse链接暂停一小段时间后,我终于找到了如何设置事务隔离级别.
正如@Chris在他的回答中正确提到的,我需要获得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);
}
}
Run Code Online (Sandbox Code Playgroud)
在persistence.xml中设置SessionCustomizer
<property name="eclipselink.session.customizer" value="com.filip.blabla.DFSessionCustomizer"/>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2498 次 |
| 最近记录: |