Java 监视mysql的更改

Java 监视mysql的更改,java,mysql,hibernate,orm,triggers,Java,Mysql,Hibernate,Orm,Triggers,我有一个通过hibernate使用MySQL数据库的Java应用程序。数据库实际上用作持久层:在程序的初始加载时读取数据库,然后将记录保存在内存中 但是,我们增加了额外的复杂性,另一个进程可能也会更改数据库,如果这些更改能够反映在Java应用程序上,那就太好了。然而,我并不特别喜欢每隔几秒钟拉动机制来查询数据库,尤其是数据库很少更新 有没有一种方法可以使用回调来侦听数据库更改?触发器是否有帮助?一个选项是尾部(或设置复制从机)并查找与应用程序相关的更改。这可能是一个相当复杂的解决方案 另一种方法

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

但是,我们增加了额外的复杂性,另一个进程可能也会更改数据库,如果这些更改能够反映在Java应用程序上,那就太好了。然而,我并不特别喜欢每隔几秒钟拉动机制来查询数据库,尤其是数据库很少更新


有没有一种方法可以使用回调来侦听数据库更改?触发器是否有帮助?

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


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

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

查看这篇博文,了解更详细的介绍

有没有一种方法可以使用回调来侦听数据库更改?触发器会有帮助吗

据我所知,这样的事情是不存在的,我不认为触发器会有帮助。你可能想在这里检查一下类似的东西


因此,我将在Java应用程序级别公开一个钩子(对于webapp,它可能是一个简单的servlet),在数据库更新后通知它,并让它使其缓存失效

您可以使用类似或的外部缓存,而不是将数据库内容缓存在Java应用程序的内存空间中。当进程更新(或读取)数据库时,让它也更新memcached


这样,每当一个进程更新数据库时,它的更新都会在另一个进程读取的缓存中。

或者更改两个应用程序,使Java应用程序真正成为MySQL数据库的所有者,并将其作为服务公开。您正在按照您的建议在数据库级别耦合这两个应用程序


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

这就是我现在要做的。然而,我只是希望重用一个管理界面(如phpMySQL等),用于小任务。这对我来说是最具架构性的解决方案。谢谢,但是内存结构不是缓存,Mimcache不合适。可以考虑MySQL上的POSTRGRESs。具有数据库更改的侦听/通知事件。