监控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的变化的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据库数据变化实时监控

mysql数据库数据变化实时监控

监控mysql的变化

oracle 怎么 监控数据变化

有一个实时监控的项目,现在我想要在C#代码中监测mysql数据库中一张表的更新变化的情况,

mysql 触发器-监控表字段更新