Java 无法从数据库中获取正确的数据
我已经编写了从数据库获取数据的代码 当用户单击链接时,将调用下面的操作。它第一次给了我正确的数据。但是如果管理员更新了表数据。然后,下面的代码无法显示表中新更新的数据。如果我多次刷新页面,它会显示新更新的数据。但再次刷新后,它会显示旧数据 我很确定问题出在dao上,或者可能是在行动课堂上。我不知道这背后的问题是什么? 请帮我解决这个问题 BookdetailsDAO.javaJava 无法从数据库中获取正确的数据,java,struts2,Java,Struts2,我已经编写了从数据库获取数据的代码 当用户单击链接时,将调用下面的操作。它第一次给了我正确的数据。但是如果管理员更新了表数据。然后,下面的代码无法显示表中新更新的数据。如果我多次刷新页面,它会显示新更新的数据。但再次刷新后,它会显示旧数据 我很确定问题出在dao上,或者可能是在行动课堂上。我不知道这背后的问题是什么? 请帮我解决这个问题 BookdetailsDAO.java public List findasc(int o,int l) { List list = nu
public List findasc(int o,int l)
{
List list = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
Query q1 = session.createQuery("FROM Bookdetails ORDER BY authLastname ASC");
q1.setFirstResult(o);
q1.setMaxResults(l);
list =q1.list();
} catch (Exception e) {
System.out.println("Exception in findasc() :" + e);
} finally {
try {
session.flush();
session.close();
} catch (Exception e) {
System.out.println("Exception In findasc Resource closing :" + e);
}
}
return list;
}
尝试添加专用提交而不是刷新。当您关闭会话时,Hibernate可能不会立即提交 您还应该尝试读取一个事务中的所有数据。根据您的代码,每次对DAO的调用都会打开一个会话。对属于一起的呼叫重新使用会话
我强烈建议让您的基础架构为您打开、关闭和提交会话。考虑使用注释驱动的方法,例如
尝试添加专用提交而不是刷新。当您关闭会话时,Hibernate可能不会立即提交
您还应该尝试读取一个事务中的所有数据。根据您的代码,每次对DAO的调用都会打开一个会话。对属于一起的呼叫重新使用会话我强烈建议让您的基础架构为您打开、关闭和提交会话。考虑使用注释驱动的方法,例如< P>问题,通过应用此代码解决。
sessionFactory.close();
tx.commit()
session.close()代码>通过应用此代码解决的问题
sessionFactory.close();
tx.commit()
session.close()代码>您尝试过编辑器调试模式吗?你在使用任何类型的缓存吗?@umeshawashi对不起,我不知道编辑器调试模式?我只知道eclipse调试器或使用System.out.print(“”)代码>。我不明白的意思,你在使用任何类型的缓存吗?
是的,我说的是Eclipse调试模式,试试看问题出在哪里,我相信是在Hibernate端,它返回缓存数据,而不是启动任何数据库查询,尝试启用hibernate日志记录,看看到底发生了什么,事务划分在哪里?看起来查询结果正在被缓存。你能显示你的休眠设置吗。。。另外,声明所有这些变量的方式使代码非常不可读。在需要它们之前不要声明它们,并在尽可能小的范围内声明它们(例如,您可以执行int-id=bookobj.getId();
)。@BheshGurung i updated。请检查我的上面,您是否尝试过编辑器调试模式?你在使用任何类型的缓存吗?@umeshawashi对不起,我不知道编辑器调试模式?我只知道eclipse调试器或使用System.out.print(“”)代码>。我不明白的意思,你在使用任何类型的缓存吗?
是的,我说的是Eclipse调试模式,试试看问题出在哪里,我相信是在Hibernate端,它返回缓存数据,而不是启动任何数据库查询,尝试启用hibernate日志记录,看看到底发生了什么,事务划分在哪里?看起来查询结果正在被缓存。你能显示你的休眠设置吗。。。另外,声明所有这些变量的方式使代码非常不可读。在需要它们之前不要声明它们,并在尽可能小的范围内声明它们(例如,您可以执行int-id=bookobj.getId();
)。@BheshGurung i updated。请检查一下,谢谢!但我不明白你解释的是什么。你能根据你的解释给出一些代码吗<代码>您还应该尝试读取一个事务中的所有数据。根据您的代码,每次对DAO的调用都会打开一个会话。将会话重新用于属于一起的呼叫。
??该链接几乎解释了您要执行的操作。特别是,它展示了如何在每个请求中有一个会话。特别让您感兴趣的是“使用普通JDBC进行事务划分”一节,谢谢!但我不明白你解释的是什么。你能根据你的解释给出一些代码吗<代码>您还应该尝试读取一个事务中的所有数据。根据您的代码,每次对DAO的调用都会打开一个会话。将会话重新用于属于一起的呼叫。
??该链接几乎解释了您要执行的操作。特别是,它展示了如何在每个请求中有一个会话。您特别感兴趣的是“使用普通JDBC的事务划分”一节。当sorencito之前说要使用提交时,您为什么要接受自己的答案,这就是您正在做的事情?我之所以接受,是因为sessionFactory.close()代码>是我问题的主要解决方案。sorencito没有说要做sessionFactory.close()代码>。我用谷歌搜索了一下,找到了答案。但是你说接受sorencito的回答,所以现在我接受了他的回答。为什么你接受你自己的回答,而sorencito的回答早些时候说使用提交,这就是你正在做的?我接受了,因为sessionFactory.close()代码>是我问题的主要解决方案。sorencito没有说要做sessionFactory.close()代码>。我用谷歌搜索了一下,找到了答案。但你说接受索伦西的回答,所以现在我接受了他的回答。