监控mysql的变化
Posted
技术标签:
【中文标题】监控mysql的变化【英文标题】:monitoring mysql for changes 【发布时间】:2010-12-14 09:02:28 【问题描述】:我有一个通过休眠使用 mysql 数据库的 Java 应用程序。数据库真正用作持久层:在程序初始加载时读取数据库,然后将记录保存在内存中。
但是,我们增加了额外的复杂性,其中另一个进程也可能更改数据库,如果更改反映在 Java 应用程序上会很好。然而,我并不特别喜欢每隔几秒就查询一次数据库的拉机制,尤其是数据库很少更新。
有没有办法让回调来监听数据库的变化?触发器会有帮助吗?
【问题讨论】:
可以考虑 postgres 而不是 mysql。有数据库更改的 LISTEN/NOTIFY 事件。 【参考方案1】:或者更改这两个应用程序,使 Java 应用程序真正成为 MySQL 数据库的所有者,并将其作为服务公开。您正在按照您的建议在数据库级别耦合这两个应用程序。
如果您有一个数据所有者,您可以将架构更改等隐藏在服务接口后面。您还可以使用发布/订阅机制来提醒相关方有关数据库更改的信息。如果这些事情对您很重要,我会重新考虑让另一个应用程序直接访问 MySQL。
【讨论】:
+1。这让我印象深刻,是架构上最合理的解决方案。【参考方案2】:有没有办法让回调来监听数据库的变化?触发器会有帮助吗?
据我所知,这样的事情不存在,我认为触发器不会有帮助。您可能想在 SO 上查看类似的question。
因此,我将在 Java 应用程序级别公开一个钩子(在 webapp 的情况下它可能是一个简单的 servlet),以便在数据库更新后通知它并让它使其缓存无效。
【讨论】:
这就是我现在正在做的事情。但是,我只是希望将管理界面(例如 phpMySQL 等)重用于小任务。【参考方案3】:另一种方法是使用自编译的 MySQL 服务器和该项目的补丁
ProjectPage External Language Stored Procedures
查看这篇博文了解更详细的介绍
Calling Java code in MySQL
【讨论】:
【参考方案4】:一个选项是跟踪binary logs(或设置复制从属)并查找与您的应用程序相关的更改。这可能是一个相当复杂的解决方案。
另一种方法是在相关表中添加一个“last_updated”索引列(您甚至可以让 mysql 自动更新它)并轮询自上次检查以来的更改。查询应该非常便宜。
【讨论】:
【参考方案5】:您可以使用memcached 或Ehcache 等外部缓存,而不是在Java 应用程序的内存空间中缓存数据库内容。当任一进程从数据库更新(或读取)时,也让它更新 memcached。
这样,每当任何一个进程更新数据库时,它的更新都会在另一个进程读取的缓存中。
【讨论】:
谢谢,但是内存中的结构不是缓存,memcached 不合适。以上是关于监控mysql的变化的主要内容,如果未能解决你的问题,请参考以下文章