2014-10-07 143 views
0

我正在用Swing作为GUI开发Java桌面应用程序。该应用程序包含每秒钟从数据库查询以使数据库同步界面的服务。我们都知道,用这种方式,表现是敌人。实现数据库监听器

我想要实现的是,通过psql(Postgres命令行)更改数据库所做的每个更改,例如,应该通知我的应用程序更新UI。这样,性能可能会得到优化。

谢谢!

+0

到目前为止你做了什么?当你说'数据库'时,你说数据在你的数据库或你的数据库的结构? – AndreDuarte 2014-10-07 16:28:09

+0

您的要求非常模糊。您是否想要捕捉任何更改,包括由psql等外部事件引起的更改,还是通过某些中央服务器应用程序完成的更改? – radai 2014-10-07 16:29:12

+3

http://jdbc.postgresql.org/documentation/head/listennotify.html – 2014-10-07 16:36:15

回答

3

正如@a_horse_with_no_name所指出的那样,PostgreSQL支持异步通知通道。

您应该create a trigger,可能在plpgsql,在您希望监视的表上。这个触发器fires a NOTIFY当表更改时,可选地包括更改的数据其自身。

通知通道上的应用程序LISTENprocesses any asynchronous notifications it receives

请注意,发送空查询是有效的,您应该这样做而不是SELECT 1。例如:

stmt.execute(""); 

IIRC即使这是可选的,如果你不使用SSL,有一种方法可以纯粹的客户端轮询。但我不记得它是什么,所以这不是真正有用的。

您可以确定使用触发器维护的更改列表表格或使用通知上的有效内容确切更改了哪些内容。或者如果它很小,您可以简单地重新阅读整个表格。

+0

这就是我所需要的。谢谢!在指定的表下创建触发器在Postgres中是一件好事。我现在意识到这可以节省大量的开发和性能时间。每秒查询一次会导致连接池中泛滥。但从技术上讲,我还不知道触发器是否有缺点。也许我会检查是否有。 – 2014-10-08 04:18:32

+0

@EriezeLagera一个只发送一个“NOTIFY”的触发器非常轻便。如果您维护一个更改历史记录表,它会更贵一些,但仍然不是很激烈。 – 2014-10-08 04:28:32