JPA中幾種比較好的設定資料庫連線事務隔離級別的方法
阿新 • • 發佈:2019-02-07
在使用JPA時,有時候需要設定連線的事務隔離級別,以下幾種方法可供參考。
DataSource source = (javax.sql.DataSource) jndiCntxt.lookup("java:comp/env/jdbc/myds");
Connection con = source.getConnection( );
con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
如果DataSource是在spring中配置的,則可以在spring中設定<bean id="gf.dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <property name="maxTotal" value="${jdbc.maxConn}"/> <property name="DefaultTransactionIsolation" value="1"/> </bean>
2).如果底層用的是Hibernate的實現:
org.hibernate.Session session = (Session)entityManager.getDelegate();
Connection connection = session.connection();
connection.setTransactionIsolation(Connection.READ_UNCOMMITTED);
3).如果底層用的是eclipseLink的實現:
在persistence.xml中設定SessionCustomizerimport 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); } }
<property name="eclipselink.session.customizer" value="com.filip.blabla.DFSessionCustomizer"/>
另外,直接設定java.sql.Connection是不行的:
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class); connection.setTransactionIsolation(java.sql.Connection.TRANSACTION_READ_COMMITTED);