Отключите подготовленные операторы для каждого запроса в DBIx :: Class с Postgres - PullRequest
1 голос
/ 18 октября 2011

У меня есть несколько запросов, которые намного медленнее при использовании подготовленных операторов в Postgres (это известная проблема, см. http://www.postgresql.org/docs/current/static/sql-prepare.html).. Поэтому я хочу отключить подготовку операторов для этих запросов.

в DBIx :: Class, я могу отключить подготовленные операторы глобально при подключении к базе данных, передав параметр "pg_server_prepare => 0" в connect_info. но я не вижу, как изменить это для существующего соединения. учитывая DBIx :: Class :: Schema, я попробовал это:

$schema->storage->connect_info->[0]->{'pg_server_prepare'} = 0;

если я регистрирую connect_info после этого вызова, я вижу новое значение для этого параметра, но драйвер базы данных все еще использует подготовленные операторы. Я также пытался отключить и переподключить

$schema->storage->connect_info->[0]->{'pg_server_prepare'} = 0;
$schema->storage->disconnect;
$schema->connect(@{ $schema->storage->connect_info->[0] });

но это тоже не помогло.

есть идеи?

1 Ответ

1 голос
/ 25 октября 2011

Я не использую DBD :: Pg, так что я не могу сказать наверняка, но это может работать:

$schema->storage->dbh_do(sub {
    my (undef, $dbh) = @_;
    local $dbh->{pg_server_prepare} = 0;
    # now do anything with $dbh you want
});
...