gpt4 book ai didi

java - 如何避免在 Swing 桌面应用程序中使用 JPA 延迟加载阻止 EDT

转载 作者:搜寻专家 更新时间:2023-10-30 21:08:59 24 4
gpt4 key购买 nike

我正在为在 Swing 桌面应用程序中实际使用 JPA(Hibernate、EclipseLink 等)而苦苦挣扎。

JPA 似乎是个好主意,但它依赖延迟加载来提高效率。延迟加载要求实体管理器在实体 bean 的生命周期内存在,并且无法控制用于加载的线程或在 EDT 继续处理其他事情时以任何方式在后台进行加载。访问恰好在 EDT 上延迟加载的属性将阻止您的应用程序的 UI 访问数据库,甚至没有机会设置繁忙的游标。如果应用程序在 wifi/3G 或慢速互联网上运行,可能会使它看起来像崩溃了。

为了避免延迟加载导致 EDT 停滞,我必须使用分离的实体。然后,如果我真的需要惰性属性的值,我的所有组件(即使是那些应该不知道数据库的组件)都必须准备好处理延迟加载异常或使用 PersistenceUtil 来测试属性状态。它们必须将实体分派(dispatch)回数据库工作线程进行合并,并在分离并再次返回之前加载属性。

为了提高效率,我的组件需要提前知道需要 bean 的哪些属性。

因此,您将看到所有这些 Shiny 的教程,演示如何使用 JPA 在 NetBeans 平台、Eclipse RCP、Swing 应用程序框架等上创建一个简单的 CRUD 应用程序,但实际上演示的方法违反了基本的 Swing 实践(不'阻止 EDT)并且在现实世界中完全不可行。

(此处有更多详细信息:http://soapyfrogs.blogspot.com/2010/07/jpa-and-hibernateeclipselinkopenjpaetc.html)

有一些相关问题的回答有些帮助,但没有一个真正涵盖 edt 阻塞/延迟加载/实体管理器生命周期管理问题。

Lazy/Eager loading strategies in remoting cases (JPA)

其他人是如何解决这个问题的?我尝试在桌面应用程序中使用 JPA 是不是找错了树?还是我缺少明显的解决方案?在使用 JPA 进行透明数据库访问的同时,您如何避免阻止 EDT 并保持您的应用响应?

最佳答案

我只将 JPA 与嵌入式数据库一起使用,其中 EDT 的延迟不是问题。在 JDBC 上下文中,我使用了 SwingWorker使用 GUI 通知处理后台处理。我还没有用 JPA 尝试过,但这是一个简单的 JDBC example .

附录:感谢@Ash 提到这个 SwingWorker bug .解决方法是 build from source一直submitted .

关于java - 如何避免在 Swing 桌面应用程序中使用 JPA 延迟加载阻止 EDT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3305591/

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