您如何在Java Desktop Swing应用程序中进行Hibernate会话管理?您是否使用一个会话?多个会议?
以下是有关此主题的一些参考资料:
单节。当您需要执行一组操作(例如,在对话框的“确定”按钮后更新数据)时启动事务,最后提交tx。但是,该连接一直处于打开状态(因为它是同一会话),因此Hib和RDBMS都可以使用所有缓存机会。
如果连接断开,实现透明的会话重新打开也是一个好主意-用户倾向于长时间打开应用程序,即使周末重新启动数据库服务器,它也应星期一继续工作。
更新资料
Jens Schauder提供了使用多个会话的理由:对会话进行部分(不需要的)更新。好吧,这取决于您使用Hibernate的方式。
假设我们打开了两个对话框(如Jens的博客示例中所示)。如果用户单击一个单选框,然后我们立即更新与此单选框关联的Hibernate实体,则当用户单击“取消”时,我们会遇到麻烦-
会话已经更新。
如我所见,正确的方法是仅更新对话框变量(非Hibernate对象)。然后,当用户单击“确定”时,我们开始一个事务,合并更新的对象,然后提交该事务。没有垃圾被保存到会话中。
MyHibernateUtils.begin();
Settings settings = DaoSettings.load();
// update setttings here
DaoSettings.save(settings);
MyHibernateUtils.commit();
如果我们实现了关注点的清晰分离,则稍后可以通过简单更改MyHibernateUtils.begin()实现来切换到多个会话。
至于可能的内存泄漏,那么…
Transaction.commit()调用Session.flush()(AFAIK也将其清除缓存)。同样,可以通过调用Session.setCacheMode()来手动控制缓存策略。
问题内容: 我目前正在开发我的一个(相当大的)宠物项目,这是一个Swing应用程序,它本质上需要多线程。几乎所有用户交互都可能通过Internet从某些远程服务器获取数据,因为我既不能控制这些服务器,也不能控制Internet本身,因此不可避免的是需要较长的响应时间。EDT忙时,Swing UI显然无法重绘自身,因此所有远程服务器调用都需要由后台线程执行。 我的问题: 后台线程获取的数据被本地(内
我在GWT应用程序中使用hibernate,其中我有一个单独的客户机/服务/业务/dao层。 服务/业务层使用dao层获取/更新用于请求处理的模型。问题是,我遵循DOA类方法中打开/关闭hibernate会话的反模式。 一般的Hibernate指南似乎建议,我们应该有一个请求范围的会话。这可以在几个地方完成,比如servlet过滤器或服务层。我们可以打开会话并将其注入到DAO层,并在完成请求之前在
问题内容: 我正在创建一个连接到Web服务器的Swing应用程序,并运行一些servlet(由我自己创建)。用户第一次连接时,会获得一个“ playerID”,该“ playerID”将保存在他的servlet会话中。当我尝试从Swing应用程序再次调用servlet时,似乎无法识别“ PlyaerID”。我正在拨打一个简单的电话以获得PlayerID。Servlet识别这种类型的请求,并发送带有
我有一个Android应用程序,我可以在其中向一个servlet发送多部分post。但我要把电话限制在每5分钟一次。有了web表单,我就可以使用cookie了。对于android应用程序,它不是这样工作的。我怎么才能让它工作呢?
在使用HikariCP dataSource的Spring Boot应用程序中,我使用helper类执行了HQL查询: 它工作正常,但是当我开始广泛使用类时,应用程序启动冻结,因为Hibernate会话随机关闭,事务等待30秒(HikariCP事务的默认超时值),然后get会话关闭错误(如果我使用getCurrentSession()而不是openSesssion(),则currentPersis
Javaworld Hibernate入门教程状态: 会话的实例是轻量级的,并且创建和销毁的成本很低。这很重要,因为您的应用程序需要一直创建和销毁会话,也许是在每次请求时。Hibernate会话不是线程安全的,根据设计,一次只能由一个线程使用。 由于Tomcat在多个线程中处理HTTP请求,因此线程安全在Web应用程序中是非常必要的。因此,我在回答中读到: 会话应该是每个方法的局部变量。通过这样做