]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
patch to notify listeners on error from Csaba Nagy
authorDave Cramer <davec@fastcrypt.com>
Tue, 25 Mar 2003 02:46:23 +0000 (02:46 +0000)
committerDave Cramer <davec@fastcrypt.com>
Tue, 25 Mar 2003 02:46:23 +0000 (02:46 +0000)
src/interfaces/jdbc/org/postgresql/jdbc2/optional/PooledConnectionImpl.java

index 4970240a030883e83487022ca925f288e25efaf9..2a5190e0e614424f2059611743d796032bce6a4b 100644 (file)
@@ -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);
                 }