[Pgpool-general] Problems using pgpool, perl DBI,
and prepared statements
Paul Rogers
progers at technologyimaging.com
Wed Jan 25 22:45:11 GMT 2006
I'm also having problems using prepared statements with pgPool. The
JDBC error returned is "ERROR: prepared statement "S_1" already
exists". However, it only appears after the first few queries. And if
I retry the query it appears to work after several attempts. Regular,
non-prepared, statements also produce the same error. Adding
'DEALLOCATE S_1', in the application or the reset query list,
produces this error: "ERROR: prepared statement "s_1" does not exist".
Test program output:
Connection: 1
Prepared statement: one
Connection: 2
Prepared statement: two
Connection: 3
ERROR: prepared statement "S_1" already exists
Connection: 4
ERROR: prepared statement "S_1" already exists
Connection: 5
Prepared statement: five
Test program source:
import java.sql.*;
class JavaReplicationTest {
public static void main(String args[]) {
Connection db = null;
for(int i=1; i <= 5; i++) {
try {
Class.forName("org.postgresql.Driver");
db = DriverManager.getConnection(
"jdbc:postgresql://192.168.1.101:9999/replication_test",
"user",
"password");
db.setAutoCommit(false);
db.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
System.out.println("Connection: " + i);
PreparedStatement ps = db.prepareStatement(
"SELECT description FROM replication_test WHERE id = ?;",
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
ps.clearParameters();
ps.setInt(1, i);
ResultSet result = ps.executeQuery();
result.next();
System.out.println(" Prepared statement: " + result.getString
(1));
result.close();
ps.close();
db.close();
} // END TRY
catch(SQLException e) {
System.out.println(" " + e.getMessage());
}
} // END FOR
} // END METHOD main
} // END CLASS
> What happening here is, pgpool does not close actual DB connection
> when $dbh->disconnect gets executed. This is the nature of connection
> pooling. You need to DEALLOCATGE before $dbh->disconnect. Instead of
> issuing DEALLOCATGE explicitely, you could add "DEALLOCATE dbpg_1" to
> "reset_query_list" in pgpool.conf. Example:
>
> reset_query_list = 'ABORT; RESET ALL; SET SESSION AUTHORIZATION
> DEFAULT; DEALLOCATE dbpg_1'
>
> > I'm trying out pgpool for the first time, and I'm getting errors
> like
> > this in my Perl application:
> >
> > DBD::Pg::st execute failed: ERROR: prepared statement "dbdpg_1"
> already
> > exists
> >
> > In the sample program below, I get no errors if I create just one DB
> > handle (set $mode to 'one-connection'). However, if the DB
> handle is
> > connected and disconnected around each query (set $mode to
> > 'multiple-connections'), I get the error on the second
> iteration. If
> > the program is changed to do just one iteration, it always
> succeeds --
> > until it has been run one more time than there are pgpool connection
> > processes running. It seems that the query can be prepared only
> once
> > through any given pgpool process ....
> >
> > I'm using pgpool 2.6.5, PostgreSQL 8.1, Perl 5.8.6, DBI 1.48,
> DBD::Pg
> > 1.43, on Mac OS X 10.4.3.
> >
> > I feel that I must be missing something obvious.
> >
> > Thanks,
> > Kevin Murphy
> >
More information about the Pgpool-general
mailing list