在 eclipselink 中设置隔离级别
Set Isolation level in eclipselink
我想使用 eclipse 设置隔离级别 link,
我尝试了这两种方法:
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 method
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() 方法的 return 值之间存在一些不一致。我的问题是,在这两种情况下真正设置了哪种事务隔离?我知道 eclipse link 默认使用不同的连接进行读写操作,DatabaseLogin.setTransactionIsolation 应该为两个连接设置隔离级别,所以为什么 Connection.getTransactionIsolation 仍然 return 另一个隔离级别 ?
我正在使用应用程序范围的 EntityManager、JPA 2.0、EclipseLink 2.5.2。
如果有更好的方式设置事务隔离,请告诉我。
databaseLogin class 是一个内部对象,EclipseLink 使用它来配置访问数据库的方式,以及用于配置这些连接的设置。您直接对连接所做的任何更改都不会反映在 DatabaseLogin 实例中。
只是创建一个新的 DatabaseLoging 实例不会让您访问持久性单元正在使用的设置。您需要获取 EntityManager/EMF 下的会话正在使用的 DatabaseLogin。
在使用 eclipse link 稍作停顿后,我终于找到了如何设置事务隔离级别。
正如@Chris 在 中正确提到的那样,我需要获得会话使用的 DatabaseLogin
。在对我发现的 eclipse link 会话进行小规模研究后,我可以在自己的 SessionCustomizer
中更改 Session
属性,请参见下面的代码:
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"/>
我想使用 eclipse 设置隔离级别 link,
我尝试了这两种方法:
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 method
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() 方法的 return 值之间存在一些不一致。我的问题是,在这两种情况下真正设置了哪种事务隔离?我知道 eclipse link 默认使用不同的连接进行读写操作,DatabaseLogin.setTransactionIsolation 应该为两个连接设置隔离级别,所以为什么 Connection.getTransactionIsolation 仍然 return 另一个隔离级别 ?
我正在使用应用程序范围的 EntityManager、JPA 2.0、EclipseLink 2.5.2。
如果有更好的方式设置事务隔离,请告诉我。
databaseLogin class 是一个内部对象,EclipseLink 使用它来配置访问数据库的方式,以及用于配置这些连接的设置。您直接对连接所做的任何更改都不会反映在 DatabaseLogin 实例中。
只是创建一个新的 DatabaseLoging 实例不会让您访问持久性单元正在使用的设置。您需要获取 EntityManager/EMF 下的会话正在使用的 DatabaseLogin。
在使用 eclipse link 稍作停顿后,我终于找到了如何设置事务隔离级别。
正如@Chris 在 DatabaseLogin
。在对我发现的 eclipse link 会话进行小规模研究后,我可以在自己的 SessionCustomizer
中更改 Session
属性,请参见下面的代码:
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"/>