更改数据库表时对JAVA Web应用程序的推断

时间:2013-12-18 12:33:24

标签: java mysql sql quartz-scheduler

我知道很多人会通过查看标题来解决这个问题但对我来说很重要。

我有一个要求,我们的Java应用程序应该知道如果DB中有任何表更改(我们使用mysql。)。我现在能想到的最好的是,我写一个触发器,如果​​表'x'被改变,那么我将一条记录插入表'Y'表示'X'表被改变。

现在,在我的java Web应用程序中,我正在考虑通过Quartz调度程序每分钟运行一个线程来检查表'y'中是否有任何新记录,这样我就可以发现表'X'被更改了

这是我需要建议的地方。 1)如何编写在特定表被更改时被触发的sql触发器? 2)我的老板告诉我,每分钟运行一个线程是一个需要考虑的昂贵操作。

除了运行线程以查找是否在DB中更改了表格之外,还有其他选择吗?

我真的需要找到解决这个问题的方法。感谢帮助。

更新:

我有两个网络应用程序说,WA1和WA2都和DBS共享同一个数据库。如果用户在WA2中执行操作,则DBS表会被更改(添加新列)。所以,我的WA1应该知道在WA2中执行了一个操作。我想到了上面提到的2点。有没有更好的方法呢?

任何人都可以给我一个mysql触发器,如果​​有一个表说mytbl被改变了会被执行吗?

我一直听说Java Stored Procedures and Triggers和UTL_HTTP.REQUEST,但它适用于Oracle。无论如何都要在MySQL中实现这个目标吗?

5 个答案:

答案 0 :(得分:1)

我的简单解决方案:

  1. 实施每分钟运行一次的石英调度程序作业。注意石英是一个有效的线程池,所以它取决于你如何使它成为最便宜的。
  2. 在作业中,交叉检查信息模式,使用任何允许您比较列中差异的机制。希望将其保持在亚秒级......
  3. 只是我的两分钱的想法

答案 1 :(得分:0)

最简单的解决方案是让改变MySQL表的人运行Java应用程序。

假设您不能这样做,您可以阅读MySQL binary log以查看描述数据库更改的“事件”,例如表创建操作或表数据更改。你必须经常运行你的线程。也许每小时一次。

答案 2 :(得分:0)

嗯,我不确定你的要求和数据库设计,或者它是否适合你,但正如我认为在WA1中无论代码负责改变你的桌子,你自己都可以写一些代码来亲密你的WA2表示添加了哪些列以及添加了哪些表。如果两个应用程序都使用相同的技术,则可以生成一个简单的请求,以便wA2相应地运行,否则可以使用Web服务。

Edit: DataBase用于持久性存储,不建议使用DataBase用于多个应用程序之间的通信。对于多个应用程序之间的通信,应该使用Web-Services / Rest。

答案 3 :(得分:0)

看看这个项目: Q4M

这是一个基于MySql的消息引擎 仍然处于早期阶段,但它应该足以满足您的要求。

答案 4 :(得分:0)

尝试查看JPA / Hibernate监听器。可能是一个好的开始。我做了一些谷歌搜索:https://code.google.com/p/simplejpa/wiki/EntityListeners,或者这里:http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/listeners.html