【发布时间】:2010-12-12 11:24:42
【问题描述】:
我目前正在处理我的一个(相当大的)宠物项目,一个 Swing 应用程序,它本质上需要是多线程的。几乎所有的用户交互都可能通过互联网从一些远程服务器获取数据,因为我既不控制这些服务器也不控制互联网本身,因此长响应时间是不可避免的。 Swing UI 显然无法在 EDT 忙碌时重新绘制自身,因此所有远程服务器调用都需要由后台线程执行。
我的问题:
后台线程获取的数据通过来自本地(内存中)数据库的数据“丰富”(远程服务器返回本地数据库中数据的 ID/引用)。这些数据后来最终被传递到 EDT,在那里它成为视图模型的一部分。某些实体此时尚未完全初始化(启用延迟获取),因此用户可能会触发延迟获取,例如在 JTable 中滚动。由于休眠会话已经关闭,这将触发 LazyInitializationException。我不知道用户何时会触发延迟获取,因此按需创建会话/附加分离的对象在这里不起作用。
我通过以下方式“解决”了这个问题:
- 为整个应用程序使用单个(同步,因为 Session 实例不是线程安全的)Session
- 完全禁用延迟获取
虽然这可行,但应用程序的性能受到很大影响(有时几乎无法使用)。速度变慢主要是由于每个查询现在要获取大量对象。
我目前正在考虑将应用程序的设计更改为“每线程会话”并将非 EDT 线程获取的所有实体迁移到 EDT 线程的 Session(类似于 this posting on the Hibernate forums)。
旁注:任何与数据库更新相关的问题都不适用,因为所有数据库实体都是只读的(参考数据)。
关于在这种情况下如何使用 Hibernate with 延迟加载的任何其他想法?
【问题讨论】:
标签: java multithreading hibernate swing