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

拉胡尔:

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

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

由于我是新来的冬眠者,所以我不知道自己在做什么是否正确?请让我知道在多线程应用中使用休眠的正确方法是什么,以及如何避免上述异常。

谢谢

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();
}
}

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

杰森C:

使用每线程会话对象,只要您不在多个线程之间共享会话对象,就可以了。

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

没有看到您的映射BlogPost很难分辨,但是如果您告诉Hibernate使用该id字段作为主键,并且您正在使用本机生成器作为主键,那么您要做的就是:

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(),不保证在刷新会话之前就设置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()私有或可见。如果另一个类显式设置ID(再次假定本机生成器和id为主键),则很可能是实现错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在多线程应用程序中使用语言环境以提高性能

在*多线程* Swing应用程序中使用Hibernate进行会话管理

如何在多线程应用程序中存储线程

golang是否可以在多线程应用程序中使用?

在多线程应用程序中使用Firedac

如何在IntelliJ中调试多线程应用程序?

如何在多线程应用程序中达到100%的CPU使用率?

如何使用多线程使我的应用程序更快

如何在基于 Web 的实时应用程序中使用多线程,我可以获得一些场景吗

是否可以在多线程应用程序中使用HashMap <T>?

在多线程应用程序中使用基于openssl的pbkdf2

在多线程应用程序中使用gorm的最佳方法是什么?

在多线程应用程序中使用静态变量安全吗?

如何在Swift中使用多线程

UWP Windows-10:如何在商店应用程序中使用线程本地存储API

如何在多线程应用程序中将GIL用于字典?

多线程应用程序如何在多处理器系统中工作

GHC如何在多线程应用程序中强制执行评估?

如何为多线程应用程序创建测试环境

如何管理多线程C#应用程序

如何正常退出多线程应用程序?

如何管理 Python Tkinter 应用程序多线程

JavaFX应用程序使用多线程落后

使用Java登录多线程应用程序

在多线程应用程序中安全使用迭代器

使用多线程时,应用程序意外关闭

在多线程应用程序中应如何使用StackExchange.Redis IDatabase对象?

如何使用MPI创建一个单进程但多线程的MFC GUI应用程序?

Qt5:如何使用qDebug()登录文件,多线程应用程序