【问题标题】:Java Large number of transaction object cachingJava 大量事务对象缓存
【发布时间】:2012-11-15 21:10:31
【问题描述】:

我正在寻找在内存中缓存大量简单事务性 pojo 结构的最佳解决方案。外部应用程序在 oracle 数据库上的 3-4 个表上发生事务。另一种应用是商业智能类型,它基于数据库中的事务评估更新的 pojos(映射到表)并应用各种业务规则。

Hibernate 解决方案依赖于同一服务器上的事务;在我们的例子中,事务发生在其他地方,并且不确定是否可以查询缓存的对象。

问题:

  1. 是否有 oracle jdbc API 会在 java 端触发更新事件?
  2. 哪种缓存解决方案支持 #1,
  3. 缓存的对象可以查询吗?

【问题讨论】:

    标签: java caching


    【解决方案1】:

    Oracle 数据库支持 Java 触发器,因此理论上您可以自己实现类似的功能,请参阅 this guide。理论上,您的 Java 触发器可以调用您正在使用的任何分布式缓存解决方案的客户端库,以更新或驱逐过时的条目。

    Oracle 也有自己的缓存解决方案,称为Coherence。它可能内置了这样的集成,或者至少值得一试。搜索“java分布式缓存”寻找一些替代方案。

    据我所知,Hibernate 不支持查询存储在其缓存中的对象。

    但是,如果您单独缓存整个对象集合,那么有一些库可以让您对这些集合执行类似 SQL 的查询:

    • LambdaJ - 支持高级查询,但速度不快
    • CQEngine - 支持典型查询,速度极快

    顺便说一句,我是 CQEngine 的作者。我喜欢这两个库。但请原谅我对我自己的轻微偏见:)

    【讨论】:

    • 如何在 CQEngine 中为可为空的列创建索引?
    • 使用 SimpleNullableAttribute 或 MultiValueNullableAttribute 而不是普通的。你可以找到JavaDocshere
    • 查询运行速度惊人...我加载了 350K 对象,并使用 IN、CONTAINS 子句执行了一些简单的查询...不到 10-18 毫秒!!! .... 抱歉继续讨论 CQEngine,最后一个问题如何保持缓存与 DB 同步?如果我使用来自 oracle 数据库的更改通知?我必须手动检测和更新缓存中的记录吗?
    • 如您所知,如果您在 CQEngine 的 IndexedCollection 中添加/删除对象,它将自动更新其索引。但是 CQEngine 对缓存一无所知。然而,大多数分布式缓存允许您注册侦听器,以便在将对象添加到缓存中/从缓存中删除时收到通知。因此,一个解决方案是像往常一样简单地将对象存储在缓存中(并且您的触发器使它们与数据库保持同步),在每台服务器的缓存之外维护一个单独的 IndexedCollection 实例,并对侦听器进行编程以添加/删除根据需要从 IndexedCollection 中获取。
    • 感谢您的宝贵意见。我将使用 Oracle Change Notification、quartz 和 CQEngine 进行尝试。
    猜你喜欢
    • 2012-11-17
    • 2010-09-18
    • 2016-02-21
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    相关资源
    最近更新 更多