gpt4 book ai didi

java - 如何处理 Hibernate/Spring 应用程序中的后台线程

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:37:33 25 4
gpt4 key购买 nike

我问我应该如何处理在我的 Hibernate/Spring 网络应用程序中执行涉及数据库的任务的后台线程。

目前我正在使用以下拦截器,所以我可以用@OpenSession 注释我的线程运行方法,并且应该打开一个 session 。例如,这也适用于 RMI 请求或在没有打开 session 的情况下调用的任何其他方法。但是,我不确定代码是否正确,我遇到的问题是有时 session 不会关闭并永远保持打开状态。

@Around("@annotation(openSession)")
public Object processAround(ProceedingJoinPoint pjp, OpenSession openSession) throws Throwable {

boolean boundResource = false;
Session session = null;

// Bind the session to the thread, if not already done
if(TransactionSynchronizationManager.getResource(sessionFactory) == null) {
log.debug("Opening Hibernate Session in method "+pjp.getSignature());

session = SessionFactoryUtils.getSession(sessionFactory, true);
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
boundResource = true;
}

// Invoke the annotated method
Object ret;
try {
ret = pjp.proceed();
}
catch(Throwable t) {
// Rethrows the Exception but makes sure the session will be closed
SessionFactoryUtils.closeSession(session);
log.debug("Closing Hibernate Session in method (Exception thrown) "+pjp.getSignature());
throw t;
}

// If a resourc was bound by this method call, unbind it.
if(boundResource) {
//SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
session.flush();
SessionFactoryUtils.closeSession(session);

log.debug("Closing Hibernate Session in method "+pjp.getSignature());
}

return ret;
}

最佳答案

是的,您建议的解决方案应该可行(我自己也做过类似的事情)。如果您只使用 @Transactional,您将为每个事务获得一个新的 EntityManager,如果您的后台线程有很多事务,这不一定是最佳的。

关于java - 如何处理 Hibernate/Spring 应用程序中的后台线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6375588/

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