监视mysql的变化

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

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

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

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

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

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

据我所知,这样的事情不存在,我认为触发器不会有所帮助。 您可能想在此处查看此类似问题 。

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

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

ProjectPage外部语言存储过程

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

在MySQL中调用Java代码

一种选择是尾随二进制日志 (或设置复制从属)并查找与您的应用程序相关的更改。 这可能是一个非常复杂的解决方案。

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

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

这样,无论何时任一进程更新数据库,其更新都将在其他进程读取的缓存中。