gpt4 book ai didi

java - 在*多线程* Swing 应用程序中使用 Hibernate 进行 session 管理

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:35:16 24 4
gpt4 key购买 nike

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

我的问题:

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

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

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

虽然这行得通,但应用程序的性能却受到很大影响(有时几乎无法使用)。速度变慢的主要原因是现在每个查询都获取了大量对象。

我目前正在考虑将应用程序的设计更改为“每线程 session ”并将非 EDT 线程获取的所有实体迁移到 EDT 线程的 session (类似于 this posting on the Hibernate forums )。

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

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

最佳答案

不要在您的数据 API 中公开 session 本身。您仍然可以懒惰地执行此操作,只需确保每次都从“数据”线程完成水合作用。您可以使用一个 block (不幸的是,可运行的或某种命令类可能是 Java 在这里可以为您做的最好的),它由执行从“数据”线程异步加载的代码包装。当您在 UI 代码中时,(当然是在 UI 线程上)字段某种由数据服务发布的“数据已准备好”事件。然后,您可以从 UI 中的事件使用中获取数据。

关于java - 在*多线程* Swing 应用程序中使用 Hibernate 进行 session 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1664446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com