【问题标题】:Singleton pattern is produced some problems when there are some updates当有一些更新时,单例模式会产生一些问题
【发布时间】:2017-06-12 02:53:06
【问题描述】:

我们有一个 Oracle 数据库,其中包含一些城市和 地点等。

我们有一个可以操作这些数据的网络系统。

我们还有一个桌面客户端应用程序正在使用这些 数据。

为了提高我们的桌面应用程序性能并减少对 DAO 层的无用请求,我们在桌面应用程序中实现了一些 Singleton 类来获取提到的城市、地点等在用户打开他/她的桌面应用程序之后,只有一次数据。

最近我们收到了客户的请求,为什么当客户端桌面应用程序上线并启动并运行时,我们看不到我们使用 Web 应用程序所做的更改。他们抱怨为什么必须关闭桌面应用并再次打开才能看到更改。

我们知道问题出在那些 Singleton 类,但我们不想更改它们,因为当它们不存在时,我们的系统会产生巨大的开销.为了解决这个问题,我们考虑了多种解决方案:

  1. 在数据库中创建一个表,其整数列名称类似于我们的数据列(城市、地点等),并在有更新时自动递增值以使用它跟踪更改(轻量级解决方案)
  2. 使用数据库功能
  3. 一个通知系统,在发生更新时通知客户端应用程序。
  4. 数据库内部的一种缓存机制,用于缓存那些最近更改的表并在我们的用户有类似请求时为他们提供服务

这是我们的堆栈:

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

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

【问题讨论】:

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

标签: java oracle database-design oracle11g ejb-3.1


【解决方案1】:

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

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

这种通知机制是为主要读取的数据而设计的,换句话说,那些不会不断变化的数据,否则无论如何都不值得缓存数据。

【讨论】:

  • 我们使用另一种方法来解决这个问题,但您的解决方案是一个干净而体面的解决方案,值得被接受!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多