我有一个 PHP 脚本来监听由 PostgreSQL 触发器触发的 NOTIFY。当我的脚本“听到”通知时,它会在此循环中执行其他命令,例如 SELECT、UPDATE、DELETE 等...
Eg.: $conn->exec('LISTEN "notify_hello"');
while (1) {
$result = "";
// wait for one Notify 10seconds instead of using sleep(10)
$result = $conn->pgsqlGetNotify(PDO::FETCH_ASSOC, 10000);
if ( $result ) {
$stmt = $conn->prepare ( 'SELECT * FROM table' );
...
}
...
}
我的问题与编程或如何使用无关LISTEN
,而是直接与数据库有关。
目前我利用与数据库的已经打开的连接来执行循环内的其他 DQL/DML 操作,我的问题是,如果我可以使用这个已经打开的连接,因为理论上它正忙于监视 PostgreSQLNOTIFY
资源的通知,或者如果每当我运行 DQL/DML 命令并在执行操作后终止它们时,我应该创建一个新连接吗?
只要您对一个接一个地执行请求的单个线程感到满意,您当前的方法就没有问题。您不会因为在运行某些 SQL 语句时收到通知而丢失通知。
如果您希望多个线程同时执行请求,您可以为此启动一个新连接和一个新线程。但是,只为单个请求打开数据库连接是很浪费的。更好的解决方案是让多个工作人员都有各自的数据库连接,然后将任务分配给当前空闲的某个工作人员。