diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/optional/PooledConnectionImpl.java b/src/interfaces/jdbc/org/postgresql/jdbc2/optional/PooledConnectionImpl.java
index 4970240a030883e83487022ca925f288e25efaf9..2a5190e0e614424f2059611743d796032bce6a4b 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);
                 }