-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

> Newer versions of DBD::Pg and PostgreSQL support a feature called
> "server side prepares", which is supposed to give a significant
> performance boost in some cases.
>
> However, when deploying it on mod_perl on a busy website, I quickly saw
> a lot of this kind of error:
>
> prepared statement "dbdpg_7" already exists

Server-side prepare statements exists on a per-connection basis, and
have been causing some problems for applications that do funky things
with connections, such as pgpool. However, when mod_perl is involved,
the problem is usually caused by connecting to a database *before*
forking children, which is almost always a Bad Thing. In short, the
children have no way of coordinating with each other about the names
being used, as their parent dbh handles have been cloned.

I put a workaround for this problem into the next version of DBD::Pg -
it will be available in the upcoming version 1.50. If you want to try it
out before then, you can try patching up dbdimp.c yourself like so:

- -       /* Name is simply "dbdpg_#" */
- -       sprintf(imp_sth->prepare_name,"dbdpg_%d", imp_dbh->prepare_number);

+       /* Name is simply "dbdpg_PID_#" */
+       sprintf(imp_sth->prepare_name,"dbdpg_%d_%d", getpid(), 
imp_dbh->prepare_number);

I've still no idea how to cure the pgpool problem, but this will probably
help your mod_perl one. The other option is to simply turn off the
server-side prepares by adding pg_server_prepare => 0 to the connection
attributes, or via the database handle.

- --
Greg Sabino Mullane [EMAIL PROTECTED]
End Point Corporation http://www.endpoint.com
PGP Key: 0x14964AC8 200608051821
http://biglumber.com/x/web?pk=2529DF6AB8F79407E94445B4BC9B906714964AC8
-----BEGIN PGP SIGNATURE-----

iD8DBQFE1RrDvJuQZxSWSsgRAmOoAJ4oPavBM79VbPUk3sGX9Y+cVgoRUwCdFg9p
VXomfEWLrUvIcPGAqcKDOfk=
=gLol
-----END PGP SIGNATURE-----


Reply via email to