Java Spring hibernate多线程

Java Spring hibernate多线程,java,spring,multithreading,hibernate,spring-mvc,Java,Spring,Multithreading,Hibernate,Spring Mvc,我有一个要求,当客户端向数据库添加条目时,应该生成一封电子邮件并发送给用户。我在这里使用spring+hibernate。发送电子邮件将在一个单独的线程中完成,这样客户端就不需要等待电子邮件发送。示例代码段- private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } public void setSe

我有一个要求,当客户端向数据库添加条目时,应该生成一封电子邮件并发送给用户。我在这里使用spring+hibernate。发送电子邮件将在一个单独的线程中完成,这样客户端就不需要等待电子邮件发送。示例代码段-

private SessionFactory sessionFactory;

public SessionFactory getSessionFactory() {
                return sessionFactory;
 }

 public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
 }

 @Override
 @Transactional
 public boolean addEntry()
 {
    Log log = new Log();
    //setters
    Session session = sessionFactory.getCurrentSession();
    session.save(log);

    Thread thread = new Thread(new Runnable() {
        @Override
        @Transactional
        public void run() {
            Session session = sessionFactory.getCurrentSession();
            Query query = session.createQuery(" get employee email query");

            // send email
        }
    });
    thread.start();
    return true;
}
我在会话中获取运行方法中的代码时出错

Exception in thread "Thread-1" org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread

如何使多线程在spring-hibernate应用程序中工作?请帮忙。

显然不是这样的。另外,在应用程序中创建线程基本上是不应该做的事情。创建另一个方法,只需使用
@Async
对其进行注释,并相应地配置
任务执行器。首先插入用户,然后调用发送电子邮件的方法。您可以简单地写入记录并尽快返回给用户。然后,创建一个调度任务,轮询数据库中的新记录,并根据需要发送邮件。如果您每5分钟左右安排一次邮件作业,用户将在合理的时间内收到他们的邮件,并且他们不会阻止电子邮件的发送。@M.Deinum那么您的意思是,如果我使用带有'@Async'注释的方法,主执行将不会等待异步方法结束?(这实际上就是我想要的)主要问题是,我无法在run()方法中使用会话工厂。为什么会这样?因为
@Transactional
在这里没有任何用处。但是我强烈建议不要创建线程,因为JEE规范(在JEE服务器中)基本上禁止创建线程。使用合适的工具。显然不是这样。另外,在应用程序中创建线程基本上是不应该做的事情。创建另一个方法,只需使用
@Async
对其进行注释,并相应地配置
任务执行器。首先插入用户,然后调用发送电子邮件的方法。您可以简单地写入记录并尽快返回给用户。然后,创建一个调度任务,轮询数据库中的新记录,并根据需要发送邮件。如果您每5分钟左右安排一次邮件作业,用户将在合理的时间内收到他们的邮件,并且他们不会阻止电子邮件的发送。@M.Deinum那么您的意思是,如果我使用带有'@Async'注释的方法,主执行将不会等待异步方法结束?(这实际上就是我想要的)主要问题是,我无法在run()方法中使用会话工厂。为什么会这样?因为
@Transactional
在这里没有任何用处。但是我强烈建议不要创建线程,因为JEE规范(在JEE服务器中)基本上禁止创建线程。为此使用适当的工具。