当前位置: 首页 > 面试题库 >

在*多线程* Swing应用程序中使用Hibernate进行会话管理

司徒炎彬
2023-03-14
问题内容

我目前正在开发我的一个(相当大的)宠物项目,这是一个Swing应用程序,它本质上需要多线程。几乎所有用户交互都可能通过Internet从某些远程服务器获取数据,因为我既不能控制这些服务器,也不能控制Internet本身,因此不可避免的是需要较长的响应时间。EDT忙时,Swing
UI显然无法重绘自身,因此所有远程服务器调用都需要由后台线程执行。

我的问题:

后台线程获取的数据被本地(内存)数据库中的数据“丰富”(远程服务器返回对本地数据库中数据的ID
/引用)。最终,这些数据将传递到EDT,并成为视图模型的一部分。某些实体此时尚未完全初始化(启用了延迟提取),因此用户可能会通过例如滚动JTable来触发延迟提取。由于hibernate会话已关闭,因此将触发LazyInitializationException。我不知道用户何时可能触发延迟获取,因此按需创建会话/附加分离的对象在这里不起作用。

我通过以下方式“解决”了这个问题:

  • 对整个应用程序使用单个(同步的,因为Session实例不是线程安全的)Session
  • 完全禁用延迟获取

在这种情况下,应用程序的性能受到了极大的损害(有时接近无法使用)。速度下降主要是由于每个查询现在获取的对象过多。

我目前正在考虑将应用程序的设计更改为“每线程会话”,并将非EDT线程获取的所有实体迁移到EDT线程的Session(类似于Hibernate论坛上的此帖子)。

旁注:与数据库更新有关的任何问题都不适用,因为所有数据库实体都是只读的(参考数据)。

关于在这种情况下如何将Hibernate 延迟加载一起使用的其他想法?


问题答案:

不要在数据API中公开会话本身。您仍然可以懒惰地执行此操作,只需确保每次都
“数据”线程中进行水化处理。您可以使用一个代码块(可运行的或某种命令类可能是Java可以在这里为您提供最好的Java功能),该代码块由执行“数据”线程异步加载的代码所包装。当您使用UI代码时,(当然在UI线程上)字段会由数据服务发布某种“数据就绪”事件。然后,您可以从UI中的事件使用中获取数据。



 类似资料:
  • 问题内容: 您如何在Java Desktop Swing应用程序中进行Hibernate会话管理?您是否使用一个会话?多个会议? 以下是有关此主题的一些参考资料: http://www.hibernate.org/333.html http://blog.schauderhaft.de/2008/09/28/hibernate-sessions-in-two-tier-rich-client-ap

  • 问题内容: 我正在尝试将Hibernate用于多线程应用程序,其中每个线程都检索一个对象并将其插入表中。我的代码如下所示。我每个线程都有本地hibernate会话对象,在每个InsertData中,我都执行beginTransaction和commit。 我面临的问题是很多次我收到“ org.hibernate.TransactionException:不支持嵌套事务” 由于我是hibernate

  • 我在GWT应用程序中使用hibernate,其中我有一个单独的客户机/服务/业务/dao层。 服务/业务层使用dao层获取/更新用于请求处理的模型。问题是,我遵循DOA类方法中打开/关闭hibernate会话的反模式。 一般的Hibernate指南似乎建议,我们应该有一个请求范围的会话。这可以在几个地方完成,比如servlet过滤器或服务层。我们可以打开会话并将其注入到DAO层,并在完成请求之前在

  • 我有一个Android应用程序,我可以在其中向一个servlet发送多部分post。但我要把电话限制在每5分钟一次。有了web表单,我就可以使用cookie了。对于android应用程序,它不是这样工作的。我怎么才能让它工作呢?

  • 问题内容: 我正在创建一个连接到Web服务器的Swing应用程序,并运行一些servlet(由我自己创建)。用户第一次连接时,会获得一个“ playerID”,该“ playerID”将保存在他的servlet会话中。当我尝试从Swing应用程序再次调用servlet时,似乎无法识别“ PlyaerID”。我正在拨打一个简单的电话以获得PlayerID。Servlet识别这种类型的请求,并发送带有

  • 问题内容: 我正在构建一个系统,其中来自客户端的每个请求都会在服务器端生成多个线程。然后,每个线程都使用一个或多个DAO(某些DAO可以同时被多个线程使用)。Spring 将所有DAO注入()到我的线程类中。每个DAO也接受注射。 什么是在这些多个DAO之间管理Hibernate会话的正确方法,这样我就不会因多线程环境而遇到问题(例如,来自不同线程的几个DAO试图同时使用同一会话)? 我在Hibe