[Pgpool-general] JDBC autocommit and hanging locks
Mike Bresnahan
gudujarlson at gmail.com
Thu Feb 25 21:34:54 UTC 2010
Correction, I am using postgresql.x86_64 8.3.7-1.fc9 and
postgresql-pgpool-II.x86_64 2.2.2-1.fc9 on Fedora 9.
On Thu, Feb 25, 2010 at 2:41 PM, Mike Bresnahan <gudujarlson at gmail.com> wrote:
> I am using the PostgreSQL 8.4 JDBC driver to connect to a pgpool
> instance in replication mode fronting a pair of PostgreSQL 8.4
> servers. When autocommit is true (the default), select statements
> leave shared locks hanging in PostgreSQL until the connection is
> closed. The following test case illustrates the problem. Test1
> succeeds, but test2 deadlocks. When I look in pg_locks when test2 is
> deadlocked I see that connection1 is holding a shared lock on the
> table "layer". It appears that the autocommit mechanism is not working
> properly when going through pgpool. Any help would be greatly
> appreciated.
>
> import org.junit.*;
> import org.postgresql.jdbc3.Jdbc3PoolingDataSource;
>
> public class PGPoolBugTest {
>
> @Before
> public void before() throws Exception {
> Class.forName("org.postgresql.Driver");
> java.sql.Connection connection =
> java.sql.DriverManager.getConnection("jdbc:postgresql://xxx:9999/yyy",
> "zzz", "qqq");
> java.sql.Statement statement = connection.createStatement();
> statement.executeUpdate("truncate table layer");
> statement.executeUpdate("insert into layer values (1,'foo',1,1)");
> }
>
> @Test
> public void test1() throws Exception {
> java.sql.Connection connection1 =
> java.sql.DriverManager.getConnection("jdbc:postgresql://xxx:9999/yyy",
> "zzz", "qqq");
> java.sql.Connection connection2 =
> java.sql.DriverManager.getConnection("jdbc:postgresql://xxx:9999/yyy",
> "zzz", "qqq");
> connection1.setAutoCommit(false);
> java.sql.Statement statement1 = connection1.createStatement();
> java.sql.Statement statement2 = connection2.createStatement();
> java.sql.ResultSet resultSet1 = statement1.executeQuery("select *
> from layer");
> while (resultSet1.next());
> resultSet1.close();
> statement1.close();
> connection1.commit();
> statement2.executeUpdate("truncate table layer");
> connection1.close();
> connection2.close();
> }
>
> @Test
> public void test2() throws Exception {
> java.sql.Connection connection1 =
> java.sql.DriverManager.getConnection("jdbc:postgresql://xxx:9999/yyy",
> "zzz", "qqq");
> java.sql.Connection connection2 =
> java.sql.DriverManager.getConnection("jdbc:postgresql://xxx:9999/yyy",
> "zzz", "qqq");
> java.sql.Statement statement1 = connection1.createStatement();
> java.sql.Statement statement2 = connection2.createStatement();
> java.sql.ResultSet resultSet1 = statement1.executeQuery("select *
> from layer");
> while (resultSet1.next());
> resultSet1.close();
> statement1.close();
> statement2.executeUpdate("truncate table layer");
> connection1.close();
> connection2.close();
> }
> }
>
More information about the Pgpool-general
mailing list