Commit 9e29b32e authored by Dave Cramer's avatar Dave Cramer

patch to notify listeners on error from Csaba Nagy

parent f1792b93
......@@ -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);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment