gpt4 book ai didi

java - 如何在多线程应用程序中使用 Hibernate?

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:04 30 4
gpt4 key购买 nike

我正在尝试将 Hibernate 用于多线程应用程序,其中每个线程检索一个对象并尝试将其插入到表中。我的代码如下所示。每个线程都有本地 hibernate Session 对象,在每个 InsertData 中我都执行 beginTransaction 和提交。

我面临的问题是很多时候我得到“org.hibernate.TransactionException:不支持嵌套事务”

由于我是 hibernate 新手,所以我不知道我在做什么是否正确?请告诉我在多线程应用程序中使用 hibernate 的正确方法是什么以及如何避免上述异常。

谢谢

public class Worker extends Thread {
private Session session = null;

Worker() {
SessionFactory sf = HibernateUtil.getSessionFactory(); // Singleton
session = sf.openSession();
session.setFlushMode(FlushMode.ALWAYS);
}

public void run() {
// Some loop which will run thousand of times
for (....)
{
InsertData(b);
}
session.close();
}

// BlogPost Table has (pk = id AutoGenerated), dateTime, blogdescription etc.
private void InsertData(BlogPost b) {
session.beginTransaction();
Long id = (Long) session.save(b);
b.setId(id);
session.getTransaction().commit();
}
}

我的 hibernate 配置文件有 c3p0.min_size=10c3p0.max_size=20

最佳答案

使用 session-objects-per-thread,只要您不在多个线程之间共享 session 对象,就可以了。

您收到的错误与您的多线程使用或 session 管理无关。您对 session.save() 的使用以及明确设置 ID 不太正确。

在没有看到 BlogPost 的映射的情况下很难判断,但是如果您已经告诉 Hibernate 使用 id 字段作为主键,并且您正在使用 native 主键生成器,您需要做的就是:

session.beginTransaction();
session.persist(b);
session.flush(); // only needed if flush mode is "manual"
session.getTransaction().commit();

Hibernate 会为你填写 ID,persist() 会导致插入发生在事务的范围内(save() 不关心事务).如果您的刷新模式未设置为手动,则无需调用 flush(),因为 Transaction.commit() 会为您处理。

请注意,使用 persist() 时,不能保证在刷新 session 之前设置 BlogPost 的 ID,这适合您在此处使用。

优雅地处理错误:

try {
session.beginTransaction();
try {
session.persist(b);
session.flush(); // only needed if flush mode is "manual"
session.getTransaction().commit();
} catch (Exception x) {
session.getTransaction().rollback();
// log the error
}
} catch (Exception x) {
// log the error
}

顺便说一句,我建议将 BlogPost.setId() 设置为私有(private)或包可见。如果另一个类显式设置 ID(再次假设 native 生成器,并将 id 作为主键),则很可能是实现错误。

关于java - 如何在多线程应用程序中使用 Hibernate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18215370/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com