【问题标题】:Hibernate SessionFactory, setTransactionIsolationLevel on the flyHibernate SessionFactory, setTransactionIsolationLevel on the fly
【发布时间】:2021-06-10 13:14:14
【问题描述】:

所以,

hibernate SessionFactory 可用。

现在,java.sql.Connection 上有一个方法 connection.setTransactionIsolation。

现在,您可以在 sessionFactory 中 openSession() 或 getCurrentSession()

从那里,我们可以做到:

session.doWork(connection -> { ... connection.setTransactionIsolation ... } )

但是,我的记忆告诉我这已经太晚了。

实际上可能需要在 Session 创建之前执行 connection.setTransactionIsolation。

这不是真的吗?

此外,setReadOnly 也有同样的要求。

现在,要在创建会话之前获得连接,有以下答案:

https://stackoverflow.com/a/29844998/961018

但这需要datasource。

那么有没有一个,可以从SessionFactory 获得datasource,所以我可以从我目前拥有的逻辑中创建这个逻辑?

编辑

请不要说出 S.P.R.I.N.G 或 A.N.N.O.T.A.T.I.O.N.S. 等字眼

【问题讨论】:

    标签: java hibernate jdbc


    【解决方案1】:

    “事务隔离”属性具有“连接”级别,这就是为什么您必须在创建连接后应用它,而不是在事务级别或 SessionFactory 上(如所有连接的一般规则)。

    考虑到您要执行的操作,实际上您有两个不同的选项来设置事务隔离。

    最常用、干净和推荐的一种是通过设置特定的hibernate属性,如下所示:

    <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()方法已经被废弃了,所以你不应该使用它。

    但是,我个人用于一些单元测试(作为实验)并且效果很好。

    【讨论】:

    • 是的,connection() 方法不再存在,但既然它对你有用,doWork 在这里应该可以正常工作。否则我可能会转换为 SessionImpl 我猜目标是在实际创建事务之前完成它。我知道全局设置,我只是尝试为每个事务/连接启用它,而不是全局设置。
    • 在问题描述的链接中,他们实际上是在创建会话之前设置这些属性。我不确定那时是否为时已晚。
    • 确实如此。实际上,我可以这样做,因为在我的公司中,我们仍在使用 hibernate core 3.3.1GA,并且该方法存在,尽管已弃用。假设我仍然准时并且幸运地以编程方式做到了:)
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 2011-10-22
    • 2010-12-18
    • 2016-02-06
    • 2018-06-16
    • 2011-05-27
    • 1970-01-01
    • 2019-08-05
    相关资源
    最近更新 更多