gpt4 book ai didi

java - Autowired Hibernate 模板在线程中使用时丢失 session

转载 作者:行者123 更新时间:2023-11-30 07:19:25 30 4
gpt4 key购买 nike

我正在开发一个 spring hibenrate 应用程序,但卡在了某个点上。我只有 1 个 Controller 只有一项服务。服务更新数据库中的数据并将其更新后的id返回给客户端并启动线程。

    final Template template = templateBL.getTemplateById(Long.valueOf(templateId));

Long templateStatusId = templateBL.updateTemplateStatus(template);
Thread thread = new Thread(templateBL.setTemplate(template, templateStatusId));
thread.start();
return templateStatusId;

在 thread.start() 上我得到这个错误

Exception in thread "Thread-8" org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72)
at org.hibernate.impl.SessionImpl.getBatcher(SessionImpl.java:297)
at org.hibernate.loader.Loader.doQuery(Loader.java:770)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
at org.hibernate.loader.Loader.loadCollection(Loader.java:2082)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:62)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:628)
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:83)
at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1853)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:369)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)
at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:272)

我正在使用 hibernate 模板 Autowiring 并在我的 DAO 层上应用@transactional。我的配置是:

 <bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">false</prop>
<!-- currently set to UPDATE -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

我没有得到可能会出错的地方。请帮忙。

最佳答案

Hibernate session 不是线程安全的,不能被多个线程使用。如果您启动一个新线程,这个新线程应该从 session 工厂获取一个新 session 。如果您将一个实体传递给一个新线程,您应该首先从 session 中分离该实体。

否则,正如您的代码所做的那样,任何初始化惰性集合的尝试都将调用 session 中的方法。要么关闭 session (从第一个线程开始),导致出现异常,要么不会,但随后您将在两个线程之间共享 session ,这将导致各种随机问题。

关于java - Autowired Hibernate 模板在线程中使用时丢失 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14686141/

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