监视mysql的变化

时间:2009-11-08 13:55:36

标签: java mysql hibernate orm triggers

我有一个通过hibernate使用MySQL数据库的Java应用程序。数据库实际上用作持久层:在程序的初始加载时读取数据库,然后将记录保存在内存中。

但是,我们正在增加额外的复杂性,其他进程也可能会更改数据库,并且更改反映在Java应用程序上会很好。然而,我并不是特别喜欢每隔几秒就拉动机制来查询数据库,特别是数据库很少更新。

有没有办法让回调来监听数据库更改?触发器会有帮助吗?

5 个答案:

答案 0 :(得分:5)

或者更改两个应用程序,以便Java应用程序真正成为MySQL数据库的所有者并将其作为服务公开。您正在通过执行您提出的建议将数据库级别的两个应用程序耦合在一起。

如果您拥有数据的所有者,则可以在服务界面后隐藏架构更改等。您还可以使用发布/订阅机制来向相关方提醒有关数据库更改的信息。如果这些事情对您很重要,我会重新考虑让另一个应用程序直接访问MySQL。

答案 1 :(得分:2)

另一种方法是使用自编译的MySQL服务器和该项目的补丁

ProjectPage External Language Stored Procedures

查看此博客文章以获取更详细的介绍

Calling Java code in MySQL

答案 2 :(得分:2)

  

有没有办法让回调来监听数据库更改?触发器会有帮助吗?

据我所知,这样的事情不存在,我认为触发器不会有所帮助。你可能想在SO上检查这个类似的question

因此,我在Java应用程序级别公开了一个钩子(在webapp的情况下它可能是一个简单的servlet),在更新数据库后通知它并使其缓存无效。

答案 3 :(得分:0)

一个选项是尾binary logs(或设置复制从属)并查找与您的应用程序相关的更改。这可能是一个非常复杂的解决方案。

另一种方法是将“last_updated”索引列添加到相关表中(您甚至可以让mysql自动更新)并轮询自上次检查后的更改。查询应该非常便宜。

答案 4 :(得分:0)

您可以使用memcachedEhcache等外部缓存,而不是在Java应用程序的内存空间中缓存数据库内容。当任一进程从数据库更新(或读取)时,也要更新memcached。

这样,只要任一进程更新数据库,其更新将在其他进程读取的缓存中。