【问题标题】:inbuilt cache mechanism in java [closed]java中的内置缓存机制[关闭]
【发布时间】:2015-03-01 10:20:18
【问题描述】:

我必须缓存 oracle 数据库更改通知和查询结果,并使用它来更新另一个 oracle 数据库中的另一个表。对我之前的question 的回答建议我使用缓存,但我不确定 java 中是否有内置缓存机制,或者我必须使用一些外部框架/库来实现这一点?

注意:我正在使用 oracle jdbc 来获取结果。

例如:如果用户通过 sql developer 或通过命令提示符手动更新表,则应缓存来自 oracle 数据库的结果 change-notifications

【问题讨论】:

  • 数据库和操作系统都应该已经缓存了查询。我不确定您为什么要在外部进行缓存。您需要将数据传输到第二个数据库吗?除非您真的必须这样做,否则不要过于复杂。
  • 您无法获得结果。因此,根据您之前的问题,有问题的缓存是第二个数据库。你已经创建了它,所以不需要做任何事情。如果您已经传输了数据,则无需执行任何操作。
  • 天哪.. 如果我已经传输了数据,那我为什么要在这里发布问题。您是否正确阅读了我的问题?我有没有提到我已经将数据传输到第二个数据库的任何地方
  • @a_horse_with_no_name 我已经阅读了该链接。它讨论了 java 程序中的 resultSet 缓存,但是如果用户通过命令提示符更新表呢?那么结果将不会被缓存。
  • @a_horse_with_no_name 看看更新后的问题。您提供的链接很棒,我已经看过了,但是同一链接中的实现示例是 仅通过 java 程序查询 - 这不适合实时

标签: java jakarta-ee caching jdbc


【解决方案1】:

Java JDBC API本身中没有内置缓存机制。

Oracle JDBC 驱动程序(显然)支持结果集的客户端缓存,但我看不出这有什么帮助:

  • 它缓存结果集,而不是插入和删除。

  • 它只缓存由当前客户端 JVM 完成的查询/结果集,而不是从其他客户端 JVM ......或其他类型的客户端完成的任何事情。

  • AFAIK,没有用于检查缓存内容的公共 API,如果您要使用缓存进行镜像更新,您将需要它。

事实上,我认为缓存根本不是正确的方法。缓存的大小是有限的,并且会丢弃(驱逐)旧条目。缓存(通常)不知道其他东西取决于条目,直到它们被镜像后才被驱逐。因此,如果更新发生的速度快于镜像的速度,我希望基于缓存的解决方案能够释放更新。


我认为最好的方法是在服务器端设置 Oracle 数据库复制。有大量关于这方面的 Oracle 文档......我不是专家。

在某些情况下,使用“ha-jdbc”(或类似的)进行客户端复制会起作用。但是,所有数据库客户端都需要使用该库,而这在您的用例中被排除在外。

最后,有可能实现一个使用 Oracle 数据库更新通知的复制器。然而,它看起来很复杂并且可能很昂贵。 (我希望 Oracle 的本机复制性能更高。)

【讨论】:

  • "它只缓存当前客户端 JVM 完成的查询" - Oracle 还支持服务器端查询缓存。
  • 但它仍然只是一个QUERY缓存?对吗?
  • 是的,我看不出有任何理由缓存其他任何东西。缓存插入和删除有什么意义?查询的结果被缓存,如果基础表中有任何变化,查询缓存将失效,并且下次运行查询时它会重新填充缓存(对于服务器端缓存和 客户端缓存)。如果缓存插入和删除,则还需要在客户端手动重新实现插入和删除的整个数据库逻辑。
  • @a_horse_with_no_name - 关键是 OP 想要将更新复制到另一个数据库。现在我认为缓存根本不是正确的方法......而且缓存插入/删除没有意义的事实支持我的论点。
  • @a_horse_with_no_name 你的评论有点像我在寻找。我也想缓存插入和删除。当用户通过命令提示符更新表时,生成的 DBChangenotification(Change Events) 我必须缓存在 java 程序中。现在是我必须使用服务器端缓存还是客户端?如果我使用服务器端缓存,那么我猜 DBChangenotifications 没有任何意义。
猜你喜欢
  • 2013-01-12
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 2017-04-17
  • 2010-12-28
  • 2015-06-23
相关资源
最近更新 更多