Java 当有一些更新时,单例模式会产生一些问题
我们有一个Oracle数据库,其中保存了一些城市和城市的数据 地点等 我们有一个可以处理这些数据的网络系统 我们还有一个桌面客户端应用程序,它正在处理这些问题 数据 为了提高桌面应用程序的性能,减少对DAO层的无用请求,我们在桌面应用程序中实现了一些单例类,以便在用户打开其桌面应用程序后只获取一次所提到的城市、地方等数据 最近,我们收到了客户的一个请求,为什么当客户机桌面应用程序处于运行状态时,我们看不到我们使用web应用程序所做的更改。他们抱怨为什么必须关闭桌面应用程序,然后再次打开它才能看到更改 我们知道问题出在那些单例类上,但我们不想改变它们,因为当它们不存在时,我们的系统会有巨大的开销。为了解决这个问题,我们考虑了多种解决方案:Java 当有一些更新时,单例模式会产生一些问题,java,oracle,database-design,oracle11g,ejb-3.1,Java,Oracle,Database Design,Oracle11g,Ejb 3.1,我们有一个Oracle数据库,其中保存了一些城市和城市的数据 地点等 我们有一个可以处理这些数据的网络系统 我们还有一个桌面客户端应用程序,它正在处理这些问题 数据 为了提高桌面应用程序的性能,减少对DAO层的无用请求,我们在桌面应用程序中实现了一些单例类,以便在用户打开其桌面应用程序后只获取一次所提到的城市、地方等数据 最近,我们收到了客户的一个请求,为什么当客户机桌面应用程序处于运行状态时,我们看不到我们使用web应用程序所做的更改。他们抱怨为什么必须关闭桌面应用程序,然后再次打开它才能看到
- 我们的桌面应用程序是swing应用程序
- 我们的Web应用程序是JSF
- JSF和swing的业务层都是EJB
- JSF和swing的Dao层都是Eclipse链接
您认为解决此问题的最佳做法是什么?Oracle有一个名为“数据库更改通知”的功能,可用于在更改表时收到通知。看起来此功能非常适合满足您的需求。指向该文档的链接为 简而言之,它的工作方式是,桌面应用程序中的JDBC瘦驱动程序将打开一个端口,Oracle数据库将连接到该端口,并使用此连接在数据更改时推送通知。然后通过事件/侦听器API获得回调,并可以刷新缓存
此通知机制专为主要读取的数据而设计,换句话说,数据不会不断更改,否则就不值得缓存数据。您的解决方案#3似乎是我的最佳选择,如果数据不经常更改,问题是我们有单独的系统,我们不知道如何实现这一点。我们也不想把“我们不知道如何实现这个”作为StackOverflow的主题,一个简单的解决方案怎么样。添加一个类似于浏览器的
REFRESH
按钮,用于重新加载数据的最后状态。这将解决为什么他们必须关闭桌面应用程序并再次打开它的抱怨,并且不需要更改数据捕获、通知等。扩展@MarmiteBomber:如果您使用单例,您可以在刷新时轻松“重新初始化”单例(即运行相同的“on startupt”代码)。这样,您可以模拟程序重启,但用户永远不会注意到。我们使用另一种方法来解决此问题,但您的解决方案是一个干净、体面的解决方案,值得接受!