我正在使用Mojolicious和一个名为pgAsync的插件来监听从Postgres数据库NOTIFY
发出的事件。我目前拥有的代码运行良好,但我看到数据库连接的数量只会不断增加。
后端
#!/usr/bin/env perl
use Mojolicious::Lite;
use Mojo::IOLoop;
use Mojolicious::Plugin::PgAsync;
app->secret('awdawdawdawd');
plugin PgAsync => {dbi => ['dbi:Pg:dbname=;host=;port=;', '', '', {AutoCommit => 0, RaiseError => 1}]};
any '/api/listen' => sub {
my $self = shift;
my $saved_tx = $self->tx;
Mojo::IOLoop->stream($self->tx->connection)->timeout(300);
$self->res->headers->add('Content-Type' => 'text/event-stream');
$self->res->headers->add('Cache-Control' => 'no-cache');
$self->res->headers->add('Access-Control-Allow-Origin' => '*');
# required for IE
$self->write(" " x 2048);
$self->write("\nretry: 2000\n\n");
my $drain_cb;
$drain_cb = sub {
my $c = shift;
$c->render_later;
$c->tx($saved_tx);
$c->pg_listen('foo', sub {
my $notify = shift;
my $payload = $notify->{payload};
$c->write("id:1\ndata:$payload\n\n", $drain_cb);
});
};
$self->pg_listen('foo', sub {
my $notify = shift;
my $payload = $notify->{payload};
$self->tx($saved_tx);
$self->write("id:1\ndata:$payload\n\n", $drain_cb);
});
};
app->start;
正如你所看到的,我需要做一些hackery来让它按照我的意愿工作。 pg_listen
似乎每次通话后都未定义回调。当我pg_listen
再次调用时,这导致了一个错误(因为它未定义),我不得不修改PgAsync::Db.pm的第 34 行来添加一个检查:
$self->callback->($notify_hash, $notify_hash);
->到->
$self->callback->($notify_hash, $notify_hash) if defined $self->callback
前端
我正在使用带有EventSource对象的 JavaScript 来监听来自 Mojolicious 脚本的推送通知:
var es = new EventSource("/api/listen");
var listener = function (event) {
console.log(event.data);
};
es.addEventListener("open", listener);
es.addEventListener("message", listener);
es.addEventListener("error", listener);
问题
仔细观察,这个系统似乎在不断地创建更多的数据库连接:
从无到有,有1个数据库连接,这是我在看有多少个数据库连接
select count(*) from pg_stat_activity;
我开始 morbo 和 Mojolicious 脚本与
DEBUG_PG=1 morbo mojopush.pl
. 现在有2个数据库连接(第一个是我在psql,第二个是morbo)我用 EventSource 对象打开网页。它使用内容类型正确设置
GET
请求text/event-stream
并保持连接打开。现在有 3 个数据库连接我进入 psql 并发送
NOTIFY foo, 'test'
,Mojo 脚本检测到它,网页显示“test.txt”。仍然有 3 个数据库连接。我刷新页面,现在有 4 个数据库连接。我等待 300 秒不活动超时,然后创建另一个数据库连接,导致 5 个连接。
如果有人可以帮助我指出正确的方向,那将不胜感激!