| From: | "Matthew Storer" <matthewstorer(at)fastmail(dot)us> | 
|---|---|
| To: | pgsql-jdbc(at)postgresql(dot)org | 
| Subject: | "Something unusual has occured" error using PostgreSQL 8.2 with Apache Commons DBCP 1.2.2 | 
| Date: | 2007-10-23 17:12:16 | 
| Message-ID: | 1193159536.9909.1217408695@webmail.messagingengine.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-jdbc | 
Hi -
I'm getting a rather disturbing exception that I really hope someone can
help me out with.
To start, I'm putting together a Java client-server app, where the
server side talks to a PostgreSQL database via an Apache Commons DBCP
link for connection pooling.  Using the code I've included below, I'm
able to establish a connection, get database metadata, and execute
stored functions perfectly well PROVIDING I DON'T try to call
getConnection() again without closing the first connection beforehand. 
(but it seems to me that doing that ought to work alright, because if I
call getConnection() a second time, shouldn't the DBCP code just pull a
new connection from the pool, and not, instead, throw this exception?)
To recap. This works:
Connection conn = ConnectionPool.getConnection();    // this
ConnectionPool class is one I wrote, see below for details
// do stuff with this connection
ConnectionPool.close(conn);                          // simply closes
the connection, catching any exceptions
conn = ConnectionPool.getConnection();               // get another
connection.  this works just fine now that
                                                     // the the
                                                     connection has been
                                                     closed before this
                                                     call
But if I try this, all hell breaks loose on the second call to
getConnection():
Connection conn = ConnectionPool.getConnection();
// do stuff with this connection
Connection conn2 = ConnectionPool.getConnection();   // the exception
below would be thrown inside here
EXCEPTION:
----------
org.postgresql.util.PSQLException: Something unusual has occured to
cause the driver to fail. Please report this exception.
        at org.postgresql.Driver.connect(Driver.java:276)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at
        org.apache.commons.dbcp.DriverManagerConnectionFactory.createConnection(DriverManagerConnectionFactory.java:68)
        at
        org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:294)
        at
        org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:840)
        at
        org.apache.commons.dbcp.PoolingDriver.connect(PoolingDriver.java:176)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at
        myproject.db.ConnectionPool.getConnection(ConnectionPool.java:136)
RELATED CODE:
-------------
This is the code I use to create the connection pool and register the
driver (in my ConnectionPool constructor) - note that this works insofar
as I can connect to the database and get metadata and do queries and
stuff, so I don't think this code is screwy, but who knows?):
	// some unrelated stuff up here
	...
	GenericObjectPool pool = new GenericObjectPool(null);
	pool.setMinIdle(5);
	pool.setMaxIdle(10);
	pool.setMaxActive(30);
	pool.setWhenExhaustedAction(GenericObjectPool.WHEN_EXHAUSTED_BLOCK);
	pool.setMaxWait(1000 * 60 * 5);
	pool.setSoftMinEvictableIdleTimeMillis(1000 * 60 * 30);
	pool.setTimeBetweenEvictionRunsMillis(1000 * 60 * 10);
	Properties props = new Properties();
	props.setProperty("user", "testuser");
	props.setProperty("password", "testpass");
	
	ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
		"jdbc:postgresql://localhost:5432/testdb", props);
	
	PoolableConnectionFactory poolableConnectionFactory = 
		new PoolableConnectionFactory(connectionFactory, 
		pool, null, null, false, false);
	
	PoolingDriver driver = new PoolingDriver();
	driver.registerPool("mydb", pool);
	...
------------------------------------------------------------------------
Now, when I want to retrieve a connection, I call
ConnectionPool.getConnection(), which is where the problem occurs.  Note
that line 136 (from the stack trace above) is the "Connection conn =
DriverManager..." line in the code below:
	public static Connection getConnection() throws SQLException {
		try {
			Connection conn = DriverManager.getConnection(
				"jdbc:apache:commons:dbcp:mydb");
			return conn;
		} catch (SQLException sqle) {
			System.out.println(sqle.getMessage());
			sqle.printStackTrace();
			throw sqle;
		}
	}
------------------------------------
Lastly, here are the versions of the relevant software I'm using:
- PostgreSQL 8.2.4 
- PostgreSQL JDBC driver 8.2-506.jdbc4
- Java 2 SE 1.6.0_02
- Jakarta Commons Pool 1.3
- Jakarta Commons DBCP 1.2.2
- Microsoft Windows XP SP2
On a possibly related note, I read in the Apache Commons DBCP README
that says:
"This release of JDBC compiles with and supports JDK 1.3 (JDBC 2.0) and
JDK 1.4-1.5 (JDBC 3.0). JDK 1.6 (JDBC 4.0) is not supported by this
release."  I'd like to try using PostgreSQL's JDBC3 drivers, but the
site says that if I'm using Java 1.6 I shouldn't use that, but should
use their JDBC4 drivers instead.  Any thoughts?
Thanks a lot for any help you can provide!
Regards,
Matt Storer
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Heikki Linnakangas | 2007-10-23 18:13:53 | Re: "Something unusual has occured" error using PostgreSQL 8.2 with Apache Commons DBCP 1.2.2 | 
| Previous Message | Tom Lane | 2007-10-23 15:59:49 | Re: Chinese database name in URL, can I ? |