Way*_*der 4 java mysql orm caching hibernate
请原谅我这个问题,但到目前为止我无法通过我的研究找到任何解决方案.(至少没有任何帮助过我)
我的情况:
我的问题:
我知道hibernate 1级缓存负责这种行为(顺便说一下lvl 2缓存不活跃).
到目前为止我尝试过的
我已经阅读了很多内容并尝试了几种方法,例如在各个地方调用session.clear().这经常给我"会话已关闭"的例外并没有帮助我(虽然我读到人们提到这有助于他们的问题)
我试图确保会话总是在最后关闭,但这并没有解决问题,以及我读到我不需要手动关闭会话,无论如何,在我使用transaction.commit()之后(我听说这是每个请求模式的会话标准)
我尝试关闭我的sessionfactory并在每次我的计算服务需要搜索数据库时重新打开它.如果我也在我的Web服务上执行此操作,这部分工作并且可能已满,但这对我来说似乎不是一个非常好的解决方案(也是内存消耗,不是吗?)
我尝试添加
<property name ="hibernate.connection.isolation"> 2 </ property>
到我的hibernate.cfg.xml,但这也只是部分工作.使用这个我的计算服务完成了计算任务,但每次通过Web服务上传新数据时,他的更改都会被覆盖.因此,检测到新的上传,但是一旦到达新的上传,所有已分析的文档将再次被分析.
我一直在考虑管理会话的方式是否不正确.我的类DAO有两个方法,它们在事务的每个开头和每个结尾都被调用.
public abstract class DAO {
/**
* Returns the current hibernate session. Also takes care that there's
* always an open hibernate transaction when needed.
*
* @return Current hibernate session
*/
public static Session getSession() {
Session currentSession = HibernateUtil.getSessionFactory()
.getCurrentSession();
if (!currentSession.getTransaction().isActive()) {
currentSession.beginTransaction();
}
return currentSession;
}
/**
* Closes the current hibernate session, if there is one.
*/
public static void closeSession() {
Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
if (sess.getTransaction().isActive()) {
sess.getTransaction().commit();
}
ThreadLocalSessionContext.unbind(HibernateUtil.getSessionFactory());
}
}
Run Code Online (Sandbox Code Playgroud)
我也读过一些关于使用hibernate的乐观锁定的东西,但我不确定这是否能解决我的问题.我读到如果缓存对象不是数据库中的缓存对象,乐观锁定只会抛出异常.但它是否还加载(刷新)缓存呢?
你是如何在你的休眠中处理这个问题的?你有什么建议我可以做什么或做什么我甚至在我的DAO级别做错了什么?我也对代码示例感到高兴.再说一遍:我希望每个进程都知道另一个进程在数据库中所做的更改.(如果可以的话,我甚至会禁用第一个缓存,但因为这是不可能的)
非常感谢每一个答案,并认为你与我分享
附加的对象实例仅存Session在于Hibernate中.如果正确终止事务和会话,将清除1级缓存.您使用什么模式进行会话管理?会话中的视图?
我问这个,因为你的问题在我看来就像会话终止问题.
编辑:
我的代码中没有看到Session.close()或至少Session.disconnect().据我所知,unbind()并不是自动的.
| 归档时间: |
|
| 查看次数: |
2274 次 |
| 最近记录: |