Отключить подготовленные операторы для каждого запроса в DBIx::Class с Postgres

У меня есть несколько запросов, которые выполняются намного медленнее при использовании подготовленных операторов в 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] });

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

Любые идеи?


person pmeidl    schedule 18.10.2011    source источник


Ответы (1)


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

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