[libpostgresql-jdbc-java] 05/24: backpatched Statement.isClosed() implementation of PGPoolingDataSource with some performance improvements. #180

Emmanuel Bourg ebourg-guest at moszumanska.debian.org
Mon Jan 9 21:17:39 UTC 2017


This is an automated email from the git hooks/post-receive script.

ebourg-guest pushed a commit to tag REL9_3_1103
in repository libpostgresql-jdbc-java.

commit bf8da8acad9f0a598429ee32964f66db8e461712
Author: Dave Cramer <dave.cramer at credativ.ca>
Date:   Fri Sep 12 15:48:17 2014 +0000

    backpatched Statement.isClosed() implementation of PGPoolingDataSource with some performance improvements. #180
---
 .../ds/jdbc23/AbstractJdbc23PooledConnection.java  | 142 ++++++++++-----------
 org/postgresql/util/GT.java                        |  10 +-
 src/pom/pom.xml                                    |   3 +-
 3 files changed, 77 insertions(+), 78 deletions(-)

diff --git a/org/postgresql/ds/jdbc23/AbstractJdbc23PooledConnection.java b/org/postgresql/ds/jdbc23/AbstractJdbc23PooledConnection.java
index 4ce1b3a..9fa83ff 100644
--- a/org/postgresql/ds/jdbc23/AbstractJdbc23PooledConnection.java
+++ b/org/postgresql/ds/jdbc23/AbstractJdbc23PooledConnection.java
@@ -27,7 +27,7 @@ import org.postgresql.util.PSQLState;
  */
 public abstract class AbstractJdbc23PooledConnection
 {
-    private List listeners = new LinkedList();
+    private final List<ConnectionEventListener> listeners = new LinkedList<ConnectionEventListener>();
     private Connection con;
     private ConnectionHandler last;
     private final boolean autoCommit;
@@ -78,7 +78,7 @@ public abstract class AbstractJdbc23PooledConnection
                 {
                     con.rollback();
                 }
-                catch (SQLException e)
+                catch (SQLException ignored)
                 {
                 }
             }
@@ -129,7 +129,7 @@ public abstract class AbstractJdbc23PooledConnection
                     {
                         con.rollback();
                     }
-                    catch (SQLException e)
+                    catch (SQLException ignored)
                     {
                     }
                 }
@@ -163,10 +163,9 @@ public abstract class AbstractJdbc23PooledConnection
     {
         ConnectionEvent evt = null;
         // Copy the listener list so the listener can remove itself during this method call
-        ConnectionEventListener[] local = (ConnectionEventListener[]) listeners.toArray(new ConnectionEventListener[listeners.size()]);
-        for (int i = 0; i < local.length; i++)
+        ConnectionEventListener[] local = listeners.toArray(new ConnectionEventListener[listeners.size()]);
+        for (ConnectionEventListener listener : local )
         {
-            ConnectionEventListener listener = local[i];
             if (evt == null)
             {
                 evt = createConnectionEvent(null);
@@ -182,10 +181,9 @@ public abstract class AbstractJdbc23PooledConnection
     {
         ConnectionEvent evt = null;
         // Copy the listener list so the listener can remove itself during this method call
-        ConnectionEventListener[] local = (ConnectionEventListener[])listeners.toArray(new ConnectionEventListener[listeners.size()]);
-        for (int i = 0; i < local.length; i++)
+        ConnectionEventListener[] local = listeners.toArray(new ConnectionEventListener[listeners.size()]);
+        for (ConnectionEventListener listener : local )
         {
-            ConnectionEventListener listener = local[i];
             if (evt == null)
             {
                 evt = createConnectionEvent(e);
@@ -219,8 +217,8 @@ public abstract class AbstractJdbc23PooledConnection
         if (state.length() < 2) // no class info, assume fatal
             return true;
 
-        for (int i = 0; i < fatalClasses.length; ++i)
-            if (state.startsWith(fatalClasses[i]))
+        for ( String fatalClass : fatalClasses )
+            if (state.startsWith(fatalClass))
                 return true; // fatal
 
         return false;
@@ -261,41 +259,37 @@ public abstract class AbstractJdbc23PooledConnection
         public Object invoke(Object proxy, Method method, Object[] args)
         throws Throwable
         {
+	    final String methodName=method.getName();
             // From Object
             if (method.getDeclaringClass().getName().equals("java.lang.Object"))
             {
-                if (method.getName().equals("toString"))
+                if (methodName.equals("toString"))
                 {
                     return "Pooled connection wrapping physical connection " + con;
                 }
-                if (method.getName().equals("equals"))
+                if (methodName.equals("equals"))
                 {
-                    return new Boolean(proxy == args[0]);
+                    return proxy == args[0];
                 }
-                if (method.getName().equals("hashCode"))
+                if (methodName.equals("hashCode"))
                 {
-                    return new Integer(System.identityHashCode(proxy));
+                    return System.identityHashCode(proxy);
                 }
                 try
                 {
                     return method.invoke(con, args);
                 }
-                catch (InvocationTargetException e)
+                catch (InvocationTargetException ite)
                 {
-                    throw e.getTargetException();
+                    throw ite.getTargetException();
                 }
             }
             // All the rest is from the Connection or PGConnection interface
-            if (method.getName().equals("isClosed"))
+            if (methodName.equals("isClosed"))
             {
-                return con == null ? Boolean.TRUE : Boolean.FALSE;
+                return con == null || con.isClosed();
             }
-            if (con == null && !method.getName().equals("close"))
-            {
-                throw new PSQLException(automatic ? GT.tr("Connection has been closed automatically because a new connection was opened for the same PooledConnection or the PooledConnection has been closed.") : GT.tr("Connection has been closed."),
-                                        PSQLState.CONNECTION_DOES_NOT_EXIST);
-            }
-            if (method.getName().equals("close"))
+            if (methodName.equals("close"))
             {
                 // we are already closed and a double close
                 // is not an error.
@@ -303,18 +297,21 @@ public abstract class AbstractJdbc23PooledConnection
                     return null;
 
                 SQLException ex = null;
-                if (!isXA && !con.getAutoCommit())
+		if (!con.isClosed())
                 {
-                    try
-                    {
+		   if (!isXA && !con.getAutoCommit())
+                   {
+                      try
+                      {
                         con.rollback();
-                    }
-                    catch (SQLException e)
-                    {
-                        ex = e;
-                    }
+                      }
+                      catch (SQLException ignored)
+                      {
+                        ex = ignored;
+                      }
+                   }
+                   con.clearWarnings();
                 }
-                con.clearWarnings();
                 con = null;
                 this.proxy = null;
                 last = null;
@@ -325,22 +322,26 @@ public abstract class AbstractJdbc23PooledConnection
                 }
                 return null;
             }
-            
+            if (con == null || con.isClosed())
+            {
+                throw new PSQLException(automatic ? GT.tr("Connection has been closed automatically because a new connection was opened for the same PooledConnection or the PooledConnection has been closed.") : GT.tr("Connection has been closed."),
+                        PSQLState.CONNECTION_DOES_NOT_EXIST);
+            }
+
             // From here on in, we invoke via reflection, catch exceptions,
             // and check if they're fatal before rethrowing.
-
-            try {            
-                if (method.getName().equals("createStatement"))
+            try {
+                if (methodName.equals("createStatement"))
                 {
                     Statement st = (Statement)method.invoke(con, args);
                     return Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{Statement.class, org.postgresql.PGStatement.class}, new StatementHandler(this, st));
                 }
-                else if (method.getName().equals("prepareCall"))
+                else if (methodName.equals("prepareCall"))
                 {
                     Statement st = (Statement)method.invoke(con, args);
                     return Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{CallableStatement.class, org.postgresql.PGStatement.class}, new StatementHandler(this, st));
                 }
-                else if (method.getName().equals("prepareStatement"))
+                else if (methodName.equals("prepareStatement"))
                 {
                     Statement st = (Statement)method.invoke(con, args);
                     return Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{PreparedStatement.class, org.postgresql.PGStatement.class}, new StatementHandler(this, st));
@@ -349,10 +350,10 @@ public abstract class AbstractJdbc23PooledConnection
                 {
                     return method.invoke(con, args);
                 }
-            } catch (InvocationTargetException e) {
-                Throwable te = e.getTargetException();
+            } catch (final InvocationTargetException ite) {
+                final Throwable te = ite.getTargetException();
                 if (te instanceof SQLException)
-                    fireConnectionError((SQLException)te); // Tell listeners about exception if it's fatal
+                    fireConnectionError((SQLException) te); // Tell listeners about exception if it's fatal
                 throw te;
             }
         }
@@ -392,69 +393,68 @@ public abstract class AbstractJdbc23PooledConnection
      * Connection proxy for the getConnection method.
      */
     private class StatementHandler implements InvocationHandler {
-        private AbstractJdbc23PooledConnection.ConnectionHandler con;
+        private ConnectionHandler con;
         private Statement st;
 
-        public StatementHandler(AbstractJdbc23PooledConnection.ConnectionHandler con, Statement st) {
+        public StatementHandler(ConnectionHandler con, Statement st) {
             this.con = con;
             this.st = st;
         }
         public Object invoke(Object proxy, Method method, Object[] args)
         throws Throwable
         {
+            final String methodName = method.getName();
             // From Object
             if (method.getDeclaringClass().getName().equals("java.lang.Object"))
             {
-                if (method.getName().equals("toString"))
+                if (methodName.equals("toString"))
                 {
                     return "Pooled statement wrapping physical statement " + st;
                 }
-                if (method.getName().equals("hashCode"))
+                if (methodName.equals("hashCode"))
                 {
-                    return new Integer(System.identityHashCode(proxy));
+                    return System.identityHashCode(proxy);
                 }
-                if (method.getName().equals("equals"))
+                if (methodName.equals("equals"))
                 {
-                    return new Boolean(proxy == args[0]);
+                    return proxy == args[0];
                 }
                 return method.invoke(st, args);
             }
+
             // All the rest is from the Statement interface
-            if (method.getName().equals("close"))
+            if (methodName.equals("isClosed"))
             {
-                // closing an already closed object is a no-op
-                if (st == null || con.isClosed())
+                return st == null || st.isClosed();
+            }
+            if (methodName.equals("close"))
+            {
+                if (st == null || st.isClosed())
                     return null;
-
-                try
-                {
-                    st.close();
-                }
-                finally
-                {
-                    con = null;
-                    st = null;
-                }
+                con = null;
+                final Statement oldSt = st;
+                st = null;
+                oldSt.close();
                 return null;
             }
-            if (st == null || con.isClosed())
+            if (st == null || st.isClosed())
             {
                 throw new PSQLException(GT.tr("Statement has been closed."),
-                                        PSQLState.OBJECT_NOT_IN_STATE);
+                        PSQLState.OBJECT_NOT_IN_STATE);
             }
-            
-            if (method.getName().equals("getConnection"))
+            if (methodName.equals("getConnection"))
             {
                 return con.getProxy(); // the proxied connection, not a physical connection
             }
 
+            // Delegate the call to the proxied Statement.
             try
             {
                 return method.invoke(st, args);
-            } catch (InvocationTargetException e) {
-                Throwable te = e.getTargetException();
+            } catch (final InvocationTargetException ite) {
+                final Throwable te = ite.getTargetException();
                 if (te instanceof SQLException)
-                    fireConnectionError((SQLException)te); // Tell listeners about exception if it's fatal
+                    fireConnectionError((SQLException) te); // Tell listeners about exception if it's fatal
                 throw te;
             }
         }
diff --git a/org/postgresql/util/GT.java b/org/postgresql/util/GT.java
index fbda0ae..90bbc28 100644
--- a/org/postgresql/util/GT.java
+++ b/org/postgresql/util/GT.java
@@ -8,8 +8,8 @@
 package org.postgresql.util;
 
 import java.text.MessageFormat;
-import java.util.ResourceBundle;
 import java.util.MissingResourceException;
+import java.util.ResourceBundle;
 
 /**
  * This class provides a wrapper around a gettext message catalog that
@@ -24,15 +24,15 @@ public class GT {
     private final static GT _gt = new GT();
     private final static Object noargs[] = new Object[0];
 
-    public final static String tr(String message) {
+    public static String tr(String message) {
         return _gt.translate(message, null);
     }
 
-    public final static String tr(String message, Object arg) {
+    public static String tr(String message, Object arg) {
         return _gt.translate(message, new Object[]{arg});
     }
 
-    public final static String tr(String message, Object args[]) {
+    public static String tr(String message, Object args[]) {
         return _gt.translate(message, args);
     }
 
@@ -51,7 +51,7 @@ public class GT {
         }
     }
 
-    private final String translate(String message, Object args[])
+    private String translate(String message, Object args[])
     {
         if (_bundle != null && message != null)
         {
diff --git a/src/pom/pom.xml b/src/pom/pom.xml
index 4dabcd2..91d4783 100644
--- a/src/pom/pom.xml
+++ b/src/pom/pom.xml
@@ -31,8 +31,7 @@
     </licenses>
     <scm>
         <connection>scm:git:git at github.com:pgjdbc/pgjdbc.git</connection>
-        <developerConnection>scm:git:git at github.com:pgjdbc/pgjdbc.git</developerConnection>
-        <url>git at github.com:pgjdbc/pgjdbc.git</url>
+        <url>https://github.com/pgjdbc/pgjdbc</url>
     </scm>
     <distributionManagement>
       <repository>

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/libpostgresql-jdbc-java.git



More information about the pkg-java-commits mailing list