aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc2/optional/PooledConnectionImpl.java49
1 files changed, 32 insertions, 17 deletions
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/optional/PooledConnectionImpl.java b/src/interfaces/jdbc/org/postgresql/jdbc2/optional/PooledConnectionImpl.java
index 4970240a030..2a5190e0e61 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc2/optional/PooledConnectionImpl.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc2/optional/PooledConnectionImpl.java
@@ -13,7 +13,8 @@ import org.postgresql.PGConnection;
* @see ConnectionPool
*
* @author Aaron Mulder (ammulder@chariotsolutions.com)
- * @version $Revision: 1.6 $
+ * @author Csaba Nagy (ncsaba@yahoo.com)
+ * @version $Revision: 1.7 $
*/
public class PooledConnectionImpl implements PooledConnection
{
@@ -95,33 +96,47 @@ public class PooledConnectionImpl implements PooledConnection
{
if (con == null)
{
- throw new SQLException("This PooledConnection has already been closed!");
+ // Before throwing the exception, let's notify the registered listeners about the error
+ final SQLException sqlException = new SQLException("This PooledConnection has already been closed!");
+ fireConnectionFatalError(sqlException);
+ throw sqlException;
}
- // Only one connection can be open at a time from this PooledConnection. See JDBC 2.0 Optional Package spec section 6.2.3
- if (last != null)
+ // If any error occures while opening a new connection, the listeners
+ // have to be notified. This gives a chance to connection pools to
+ // elliminate bad pooled connections.
+ try
{
- last.close();
- if (!con.getAutoCommit())
+ // Only one connection can be open at a time from this PooledConnection. See JDBC 2.0 Optional Package spec section 6.2.3
+ if (last != null)
{
- try
+ last.close();
+ if (!con.getAutoCommit())
{
- con.rollback();
+ try
+ {
+ con.rollback();
+ }
+ catch (SQLException e)
+ {}
}
- catch (SQLException e)
- {}
+ con.clearWarnings();
}
- con.clearWarnings();
+ con.setAutoCommit(autoCommit);
+ }
+ catch (SQLException sqlException)
+ {
+ fireConnectionFatalError(sqlException);
+ throw (SQLException)sqlException.fillInStackTrace();
}
- con.setAutoCommit(autoCommit);
ConnectionHandler handler = new ConnectionHandler(con);
last = handler;
Connection con = (Connection)Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{Connection.class, PGConnection.class}, handler);
- last.setProxy(con);
- return con;
+ last.setProxy(con);
+ return con;
}
/**
- * Used to fire a connection event to all listeners.
+ * Used to fire a connection closed event to all listeners.
*/
void fireConnectionClosed()
{
@@ -140,7 +155,7 @@ public class PooledConnectionImpl implements PooledConnection
}
/**
- * Used to fire a connection event to all listeners.
+ * Used to fire a connection error event to all listeners.
*/
void fireConnectionFatalError(SQLException e)
{
@@ -363,7 +378,7 @@ public class PooledConnectionImpl implements PooledConnection
}
else
{
- try
+ try
{
return method.invoke(st, args);
}