天天看点

Java:JPA中几种比较好的设置数据库连接事务隔离级别的方法

在使用JPA时,有时候需要设置连接的事务隔离级别,以下几种方法可供参考。

目录

1).直接在DataSource上设置

2).如果底层用的是Hibernate的实现

3).如果底层用的是eclipseLink的实现

1).直接在DataSource上设置

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的实现

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"/>
           

另外,直接设置java.sql.Connection是不行的:

java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);
connection.setTransactionIsolation(java.sql.Connection.TRANSACTION_READ_COMMITTED);