Java 当有一些更新时,单例模式会产生一些问题

Java 当有一些更新时,单例模式会产生一些问题,java,oracle,database-design,oracle11g,ejb-3.1,Java,Oracle,Database Design,Oracle11g,Ejb 3.1,我们有一个Oracle数据库,其中保存了一些城市和城市的数据 地点等 我们有一个可以处理这些数据的网络系统 我们还有一个桌面客户端应用程序,它正在处理这些问题 数据 为了提高桌面应用程序的性能,减少对DAO层的无用请求,我们在桌面应用程序中实现了一些单例类,以便在用户打开其桌面应用程序后只获取一次所提到的城市、地方等数据 最近,我们收到了客户的一个请求,为什么当客户机桌面应用程序处于运行状态时,我们看不到我们使用web应用程序所做的更改。他们抱怨为什么必须关闭桌面应用程序,然后再次打开它才能看到

我们有一个Oracle数据库,其中保存了一些城市和城市的数据 地点等

我们有一个可以处理这些数据的网络系统

我们还有一个桌面客户端应用程序,它正在处理这些问题 数据

为了提高桌面应用程序的性能,减少对DAO层的无用请求,我们在桌面应用程序中实现了一些单例类,以便在用户打开其桌面应用程序后只获取一次所提到的城市、地方等数据

最近,我们收到了客户的一个请求,为什么当客户机桌面应用程序处于运行状态时,我们看不到我们使用web应用程序所做的更改。他们抱怨为什么必须关闭桌面应用程序,然后再次打开它才能看到更改

我们知道问题出在那些单例类上,但我们不想改变它们,因为当它们不存在时,我们的系统会有巨大的开销。为了解决这个问题,我们考虑了多种解决方案:

  • 在数据库中创建一个表,该表的整数列名类似于我们的数据列(城市、地点等),并在更新时自动增加值,以便使用它跟踪更改(轻量级解决方案)
  • 使用数据库功能
  • 每当发生更新时通知客户端应用程序的通知系统
  • 数据库中的缓存机制,缓存最近更改的表,并在用户有类似请求时为其提供服务
  • 以下是我们的堆栈:

    • 我们的桌面应用程序是swing应用程序
    • 我们的Web应用程序是JSF
    • JSF和swing的业务层都是EJB
    • JSF和swing的Dao层都是Eclipse链接

    您认为解决此问题的最佳做法是什么?

    Oracle有一个名为“数据库更改通知”的功能,可用于在更改表时收到通知。看起来此功能非常适合满足您的需求。指向该文档的链接为

    简而言之,它的工作方式是,桌面应用程序中的JDBC瘦驱动程序将打开一个端口,Oracle数据库将连接到该端口,并使用此连接在数据更改时推送通知。然后通过事件/侦听器API获得回调,并可以刷新缓存


    此通知机制专为主要读取的数据而设计,换句话说,数据不会不断更改,否则就不值得缓存数据。

    您的解决方案#3似乎是我的最佳选择,如果数据不经常更改,问题是我们有单独的系统,我们不知道如何实现这一点。我们也不想把“我们不知道如何实现这个”作为StackOverflow的主题,一个简单的解决方案怎么样。添加一个类似于浏览器的
    REFRESH
    按钮,用于重新加载数据的最后状态。这将解决为什么他们必须关闭桌面应用程序并再次打开它的抱怨,并且不需要更改数据捕获、通知等。扩展@MarmiteBomber:如果您使用单例,您可以在刷新时轻松“重新初始化”单例(即运行相同的“on startupt”代码)。这样,您可以模拟程序重启,但用户永远不会注意到。我们使用另一种方法来解决此问题,但您的解决方案是一个干净、体面的解决方案,值得接受!