当有一些更新时,单例模式会产生一些问题
Singleton pattern is produced some problems when there are some updates
We have an Oracle database which hold data about some cities and
places, etc.
We have a web system which we can manipulate these datas.
We also have a desktop client application which is working with these
data.
为了提高我们的桌面应用程序 性能 并减少对我们的 DAO 层的无用请求,我们实现了一些单例 类在我们的桌面应用程序中,在用户打开 his/her 桌面应用程序后 仅一次 获取提到的城市、地点等数据。
最近我们收到客户的请求,为什么我们看不到我们使用 Web 应用程序所做的更改,当客户端桌面应用程序处于活动状态并且 运行 时。他们抱怨为什么必须关闭桌面应用程序并再次打开它才能看到更改。
我们知道问题出在那些 Singleton 类 但我们不想更改它们,因为它会当它们不存在时,它们会在我们的系统中产生巨大的开销。为了解决问题我们想过多种方案:
- 在数据库中创建一个 table,其整数列名称类似于我们的数据列(城市、地点等),并在有更新时使用它跟踪更改(轻量级解决方案) )
- 使用数据库功能
- 通知系统,每当发生更新时通知客户端应用程序。
- 数据库中的缓存机制,缓存最近更改的 tables 并在用户有类似请求时为他们提供服务
这是我们的堆栈:
- 我们的桌面应用程序是 swing 应用程序
- 我们的 Web 应用程序是 JSF
- 我们的 JSF 和 swing 业务层都是 EJB
- 我们的 JSF 和 swing 的 Dao 层是 Eclipse-Link
您认为解决此问题的最佳做法是什么?
Oracle 有一个称为 "Database Change Notification" 的功能,可用于在 read-mostly 表更改时收到通知。看起来此功能很适合满足您的要求。文档的 link 是 here.
简而言之,它的工作方式是 JDBC 桌面应用程序中的瘦驱动程序将打开一个端口,Oracle 数据库将连接到该端口并使用此连接在数据更改时推送通知。然后您通过 event/listener API 获得回调并可以刷新您的缓存。
此通知机制专为 read-mostly 的数据而设计,换句话说,数据不会经常更改,否则无论如何都不值得缓存数据。
We have an Oracle database which hold data about some cities and places, etc.
We have a web system which we can manipulate these datas.
We also have a desktop client application which is working with these data.
为了提高我们的桌面应用程序 性能 并减少对我们的 DAO 层的无用请求,我们实现了一些单例 类在我们的桌面应用程序中,在用户打开 his/her 桌面应用程序后 仅一次 获取提到的城市、地点等数据。
最近我们收到客户的请求,为什么我们看不到我们使用 Web 应用程序所做的更改,当客户端桌面应用程序处于活动状态并且 运行 时。他们抱怨为什么必须关闭桌面应用程序并再次打开它才能看到更改。
我们知道问题出在那些 Singleton 类 但我们不想更改它们,因为它会当它们不存在时,它们会在我们的系统中产生巨大的开销。为了解决问题我们想过多种方案:
- 在数据库中创建一个 table,其整数列名称类似于我们的数据列(城市、地点等),并在有更新时使用它跟踪更改(轻量级解决方案) )
- 使用数据库功能
- 通知系统,每当发生更新时通知客户端应用程序。
- 数据库中的缓存机制,缓存最近更改的 tables 并在用户有类似请求时为他们提供服务
这是我们的堆栈:
- 我们的桌面应用程序是 swing 应用程序
- 我们的 Web 应用程序是 JSF
- 我们的 JSF 和 swing 业务层都是 EJB
- 我们的 JSF 和 swing 的 Dao 层是 Eclipse-Link
您认为解决此问题的最佳做法是什么?
Oracle 有一个称为 "Database Change Notification" 的功能,可用于在 read-mostly 表更改时收到通知。看起来此功能很适合满足您的要求。文档的 link 是 here.
简而言之,它的工作方式是 JDBC 桌面应用程序中的瘦驱动程序将打开一个端口,Oracle 数据库将连接到该端口并使用此连接在数据更改时推送通知。然后您通过 event/listener API 获得回调并可以刷新您的缓存。
此通知机制专为 read-mostly 的数据而设计,换句话说,数据不会经常更改,否则无论如何都不值得缓存数据。