【发布时间】:2013-11-27 21:01:36
【问题描述】:
我正在使用 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;
如您所见,我需要做一些小技巧才能让它按我的意愿工作。 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;查看有多少数据库连接我用
DEBUG_PG=1 morbo mojopush.pl启动 morbo 和 Mojolicious 脚本。现在有2个数据库连接(第一个是psql中的me,第二个是morbo)我用 EventSource 对象打开网页。它使用
text/event-stream的内容类型正确设置GET请求并保持连接打开。现在有 3 个数据库连接我进入psql并发送
NOTIFY foo, 'test',Mojo脚本检测到它,网页显示'test.还有 3 个 db 连接。我刷新页面,现在有 4 个数据库连接。我等待 300 秒不活动超时,然后创建另一个数据库连接,导致 5 个连接。
如果有人能帮助我指出正确的方向,那将不胜感激!
【问题讨论】:
标签: perl postgresql mojolicious event-stream