Hibernate SessionFactory,动态设置TransactionIsolationLevel
Hibernate SessionFactory, setTransactionIsolationLevel on the fly
所以,
休眠 SessionFactory
可用。
现在,在 java.sql.Connection
上有一个方法 connection.setTransactionIsolation
。
现在,您可以从 sessionFactory openSession()
或 getCurrentSession()
从那里,我们可以做:
session.doWork(connection -> { ... connection.setTransactionIsolation ... } )
然而,我的记忆告诉我这已经太迟了。
实际上可能需要在 Session
创建之前执行 connection.setTransactionIsolation
。
这不是真的吗?
此外,setReadOnly
也有相同的要求。
现在,要在创建会话之前获取连接,有以下答案:
但这需要 datasource
.
那么有没有一个可以从 SessionFactory
得到 datasource
,所以我可以从我目前拥有的创建这个逻辑?
编辑
敬请注意,请勿说出 S.P.R.I.N.G 或 A.N.N.O.T.A.T.I.O.N.S。
“事务隔离”属性 具有“连接”级别,这就是为什么您必须在创建连接后应用它,而不是在事务级别或(如所有连接的一般规则)在 SessionFactory 上.
考虑到您要执行的操作,您实际上有两种不同的选项来设置事务隔离。
最常用、最干净、最推荐的方法是设置特定的休眠模式 属性,如下所示:
<property name="hibernate.connection.isolation">2</property>
具体情况下,值2对应“READ COMMITTED”。
否则,您可以尝试从 Session
获取连接实例,如以下代码:
Session session = sessionFactory.getSession();
try {
session.connection().setTransactionIsolation(2);
} catch (HibernateException | SQLException e) {
e.printStackTrace();
}
请记住,以上是一种非常肮脏的方法,并且不能保证它有效。此外,org.hibernate.Session
的方法 connection()
已弃用,因此您不应使用它。
然而,我个人用于一些单元测试(作为实验)并且效果很好。
所以,
休眠 SessionFactory
可用。
现在,在 java.sql.Connection
上有一个方法 connection.setTransactionIsolation
。
现在,您可以从 sessionFactory openSession()
或 getCurrentSession()
从那里,我们可以做:
session.doWork(connection -> { ... connection.setTransactionIsolation ... } )
然而,我的记忆告诉我这已经太迟了。
实际上可能需要在 Session
创建之前执行 connection.setTransactionIsolation
。
这不是真的吗?
此外,setReadOnly
也有相同的要求。
现在,要在创建会话之前获取连接,有以下答案:
但这需要 datasource
.
那么有没有一个可以从 SessionFactory
得到 datasource
,所以我可以从我目前拥有的创建这个逻辑?
编辑
敬请注意,请勿说出 S.P.R.I.N.G 或 A.N.N.O.T.A.T.I.O.N.S。
“事务隔离”属性 具有“连接”级别,这就是为什么您必须在创建连接后应用它,而不是在事务级别或(如所有连接的一般规则)在 SessionFactory 上.
考虑到您要执行的操作,您实际上有两种不同的选项来设置事务隔离。
最常用、最干净、最推荐的方法是设置特定的休眠模式 属性,如下所示:
<property name="hibernate.connection.isolation">2</property>
具体情况下,值2对应“READ COMMITTED”。
否则,您可以尝试从 Session
获取连接实例,如以下代码:
Session session = sessionFactory.getSession();
try {
session.connection().setTransactionIsolation(2);
} catch (HibernateException | SQLException e) {
e.printStackTrace();
}
请记住,以上是一种非常肮脏的方法,并且不能保证它有效。此外,org.hibernate.Session
的方法 connection()
已弃用,因此您不应使用它。
然而,我个人用于一些单元测试(作为实验)并且效果很好。