【问题标题】:Using Hibernate and JDBC together from different threads从不同的线程一起使用 Hibernate 和 JDBC
【发布时间】:2014-01-06 12:58:55
【问题描述】:

我想在我的应用程序中同时使用 Spring-Hibernate 和 JDBC。

Hibernate 应该从一个线程完成所有更新和写入,而其他线程应该能够从数据库中读取而无需太多同步工作。

那些使用 JDBC 的线程是否会提供正确的结果(如果它们在调用 persist()merge() 后不久从数据库中读取)或者它是否会发生,即 Hibernate 没有刷新任何更新,因此其他线程返回错误的数据库条目?

【问题讨论】:

    标签: java multithreading spring hibernate jdbc


    【解决方案1】:

    “错误”取决于您为连接池设置的隔离级别。

    我认为如果 Hibernate 和 Spring 共享同一个连接池并且您将所有连接的隔离级别设置为 SERIALIZABLE,它就可以工作。

    长时间运行的事务将成为问题。如果你所有的写操作都很快,你就不会阻塞。如果您不快速提交和刷新更新,则读取操作将不得不阻塞并等待或允许“脏读”。

    【讨论】:

    • 我想避免 SERIALIZABLE 隔离级别的性能...但是如果我允许 JDBC 线程的脏读并且不将隔离级别设置为 SERIALIZEABLE 我应该在大多数情况下获得正确的值案例,我说的对吗?编辑:读取只是为了给用户信息,它们并不重要。
    【解决方案2】:

    这取决于。您基本上是在描述一种竞争条件 - 如果您想确保您的读取线程仅在写入线程持续存在后读取,您将不得不研究线程同步方法。

    干杯,

    【讨论】:

    • 是的,我很清楚这一点。我知道我的问题并不完全清楚,但这不是我想要的。
    • 很公平。尽管如此,答案仍然是一样的 - 不能保证除了额外的假设......用例是什么(我很好奇)?
    • 我有一个应用程序有很多现有的查询,这些查询使用普通的 MYSQL over JDBC。我必须执行更新和事务,可能需要相当长的时间,我想使用 Hibernate,因为仅使用 JDBC 在 a** 中是一种痛苦。这些查询并不是很关键,只有用户信息依赖于它们,所以竞争条件取决于用户在获得不完整数据时的反应。
    猜你喜欢
    • 2021-10-12
    • 2011-03-21
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多