[jboss-cvs] JBossAS SVN: r79144 - branches/JBPAPP_4_2_0_GA_CP/connector/src/main/org/jboss/resource/adapter/jdbc/vendor.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Oct 6 07:43:56 EDT 2008


Author: jesper.pedersen
Date: 2008-10-06 07:43:56 -0400 (Mon, 06 Oct 2008)
New Revision: 79144

Added:
   branches/JBPAPP_4_2_0_GA_CP/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/MySQLReplicationValidConnectionChecker.java
Modified:
   branches/JBPAPP_4_2_0_GA_CP/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/MySQLValidConnectionChecker.java
   branches/JBPAPP_4_2_0_GA_CP/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/OracleValidConnectionChecker.java
Log:
[JBPAPP-1253] Fix ValidConnectionChecker serialization

Added: branches/JBPAPP_4_2_0_GA_CP/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/MySQLReplicationValidConnectionChecker.java
===================================================================
--- branches/JBPAPP_4_2_0_GA_CP/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/MySQLReplicationValidConnectionChecker.java	                        (rev 0)
+++ branches/JBPAPP_4_2_0_GA_CP/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/MySQLReplicationValidConnectionChecker.java	2008-10-06 11:43:56 UTC (rev 79144)
@@ -0,0 +1,261 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.resource.adapter.jdbc.vendor;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.lang.reflect.Method;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import org.jboss.logging.Logger;
+import org.jboss.resource.adapter.jdbc.ValidConnectionChecker;
+
+/**
+ * <p>This class is an implementation of ValidConnectionChecker for MySQL
+ * ReplicatedDriver. It supports both isValid and ping methods on the 
+ * connection object.
+ * 
+ * <p>Please note that the isValid method requires java 6 classes to be present.
+ * 
+ * <p>The code was inspired by MySQLValidConnectionChecker. See it's javadoc for
+ * authors info. This code is released under the LGPL license.
+ * 
+ * @author Luc Boudreau (lucboudreau att gmail dott com)
+ *
+ */
+public class MySQLReplicationValidConnectionChecker implements ValidConnectionChecker, Serializable
+{
+   /**
+    * Serial version ID
+    */
+   private static final long serialVersionUID = 2658231045989623858L;
+
+   /**
+    * Tells if the connection supports the isValid method.
+    * (Java 6 only)
+    */
+   private boolean driverHasIsValidMethod;
+	
+   private transient Method isValid;
+
+   /**
+    * Tells if the connection supports the ping method.
+    */
+   private boolean driverHasPingMethod;
+
+   private transient Method ping;
+
+   /**
+    * Classname of the supported connection
+    */
+   protected final static String CONNECTION_CLASS = "com.mysql.jdbc.ReplicationConnection";
+	
+   /**
+    * Log access object
+    */
+   private static transient Logger log;
+	
+   // The timeout (apparently the timeout is ignored?)
+   private static Object[] timeoutParam = new Object[] {};
+
+   /**
+    * Initiates the ValidConnectionChecker implementation.
+    */
+   public MySQLReplicationValidConnectionChecker() 
+   {
+      try
+      {
+         initPing();
+      }
+      catch (Exception e)
+      {
+         log.warn("Cannot find the driver class defined in CONNECTION_CLASS.  Will use 'SELECT 1' instead.", e);
+      }
+   }
+		
+   /* (non-Javadoc)
+    * @see org.jboss.resource.adapter.jdbc.ValidConnectionChecker#isValidConnection(java.sql.Connection)
+    */
+   public SQLException isValidConnection(Connection c) 
+   {
+      if (driverHasIsValidMethod)
+      {
+         try 
+         {
+            isValid.invoke(c, timeoutParam);
+         } 
+         catch (Exception e) 
+         {
+            if (e instanceof SQLException)
+            {
+               return (SQLException) e;
+            }
+            else
+            {
+               log.warn("Unexpected error in ping", e);
+               return new SQLException("ping failed: " + e.toString());
+            }
+         }
+      }
+      else if (driverHasPingMethod) 
+      {
+         //if there is a ping method then use it
+         try
+         {
+            ping.invoke(c, timeoutParam);
+         }
+         catch (Exception e)
+         {
+            if (e instanceof SQLException)
+            {
+               return (SQLException) e;
+            }
+            else
+            {
+               log.warn("Unexpected error in ping", e);
+               return new SQLException("ping failed: " + e.toString());
+            }
+         }
+      } 
+      else 
+      {
+         //otherwise just use a 'SELECT 1' statement
+			
+         Statement stmt = null;
+         ResultSet rs = null;
+         
+         try
+         {
+            stmt = c.createStatement();
+            rs = stmt.executeQuery("SELECT 1");
+         }
+         catch (Exception e)
+         {
+            if (e instanceof SQLException)
+            {
+               return (SQLException) e;
+            }
+            else 
+            {
+               log.warn("Unexpected error in ping (SELECT 1)", e);
+               return new SQLException("ping (SELECT 1) failed: " + e.toString());
+            }
+            
+         }
+         finally
+         {
+            // Cleanup everything and make sure to handle
+            // sql exceptions occuring
+            try
+            {
+               if (rs != null) 
+                  rs.close();
+            }
+            catch (SQLException e)
+            {
+            }
+            try
+            {
+               if (stmt != null) 
+                  stmt.close();
+            }
+            catch (SQLException e)
+            {
+            }
+         }
+      }
+      return null;
+   }
+
+
+   private void initPing() throws ClassNotFoundException, NoSuchMethodException
+   {
+      driverHasIsValidMethod = false;
+      driverHasPingMethod = false;
+
+      log = Logger.getLogger(MySQLReplicationValidConnectionChecker.class);
+
+      // Load connection class
+      Class mysqlConnection = Thread.currentThread().getContextClassLoader().loadClass( CONNECTION_CLASS  );
+			
+      // Check for Java 6 compatibility and use isValid on the connection
+      try 
+      {
+         isValid = mysqlConnection.getMethod("isValid", new Class[] {});
+         driverHasIsValidMethod = true;
+      } 
+      catch (NoSuchMethodException e) 
+      {
+         // Notify someone
+         log.info("Cannot resolve com.mysq.jdbc.ReplicationConnection.isValid method. Fallback to ping.", e);
+      } 
+      catch (SecurityException e) 
+      {
+         // Notify someone
+         log.info("Cannot resolve com.mysq.jdbc.ReplicationConnection.isValid method. Fallback to ping.", e);
+      }
+					
+      if (!driverHasIsValidMethod)
+      {
+         try
+         {
+            // Check for ping method
+            ping = mysqlConnection.getMethod("ping", new Class[] {});
+            driverHasPingMethod = true;
+         }
+         catch (NoSuchMethodException e) 
+         {
+            // Notify someone
+            log.warn("Cannot resolve com.mysq.jdbc.ReplicationConnection.ping method. Will use 'SELECT 1' instead.", e);	
+         } 
+         catch (SecurityException e)
+         {
+            // Notify someone
+            log.info("Cannot resolve com.mysq.jdbc.ReplicationConnection.ping method. Will use 'SELECT 1' instead.", e);
+         }   
+      }
+   }
+
+   private void writeObject(ObjectOutputStream stream) throws IOException
+   {
+      // nothing
+   }
+
+   private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException
+   {
+      try
+      {
+         initPing();
+      }
+      catch (Exception e)
+      {
+         IOException ioe = new IOException("Unable to resolve ping method: " + e.getMessage());
+         ioe.initCause(e);
+         throw ioe;
+      }
+   }
+}

Modified: branches/JBPAPP_4_2_0_GA_CP/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/MySQLValidConnectionChecker.java
===================================================================
--- branches/JBPAPP_4_2_0_GA_CP/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/MySQLValidConnectionChecker.java	2008-10-06 11:30:19 UTC (rev 79143)
+++ branches/JBPAPP_4_2_0_GA_CP/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/MySQLValidConnectionChecker.java	2008-10-06 11:43:56 UTC (rev 79144)
@@ -21,6 +21,9 @@
  */
 package org.jboss.resource.adapter.jdbc.vendor;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.lang.reflect.Method;
 import java.sql.Connection;
@@ -43,66 +46,123 @@
  * @version $Revision$
  */
 public class MySQLValidConnectionChecker implements ValidConnectionChecker, Serializable {
-	private static final long serialVersionUID = -2227528634302168878L;
 
-	private static final Logger log = Logger.getLogger(MySQLValidConnectionChecker.class);
 
-	private Method ping;
-	private boolean driverHasPingMethod = false;
+   private static transient Logger log;
+    
+   private static final long serialVersionUID = 1323747853035005642L;
 
-	// The timeout (apparently the timeout is ignored?)
-	private static Object[] params = new Object[] {};
+   private boolean driverHasPingMethod;
 
-	public MySQLValidConnectionChecker() {
-		try {
-			Class mysqlConnection = Thread.currentThread().getContextClassLoader().loadClass("com.mysql.jdbc.Connection");
-			ping = mysqlConnection.getMethod("ping", new Class[] {});
-			if (ping != null) {
-				driverHasPingMethod = true;
-			}
-		} catch (Exception e) {
-			log.warn("Cannot resolve com.mysq.jdbc.Connection.ping method.  Will use 'SELECT 1' instead.", e);
-		}
-	}
+   // The timeout (apparently the timeout is ignored?)
+   private static Object[] params = new Object[] {};
+   
+   private transient Method ping;
+   
+   public MySQLValidConnectionChecker()
+   {
+      try
+      {
+         initPing();
+      }
+      catch (Exception e)
+      {
+         log.warn("Cannot resolve com.mysq.jdbc.Connection.ping method.  Will use 'SELECT 1' instead.", e);
+      }
+   }
 
-	public SQLException isValidConnection(Connection c) {
-		//if there is a ping method then use it, otherwise just use a 'SELECT 1' statement
-		if (driverHasPingMethod) {
-			try {
-				ping.invoke(c, params);
-			} catch (Exception e) {
-				if (e instanceof SQLException) {
-					return (SQLException) e;
-				} else {
-					log.warn("Unexpected error in ping", e);
-					return new SQLException("ping failed: " + e.toString());
-				}
-			}
-			
-		} else {
-			
-			Statement stmt = null;
-                        ResultSet rs = null;
-			try {
-				stmt = c.createStatement();
-				rs = stmt.executeQuery("SELECT 1");
-			} catch (Exception e) {
-				if (e instanceof SQLException) {
-					return (SQLException) e;
-				} else {
-					log.warn("Unexpected error in ping (SELECT 1)", e);
-					return new SQLException("ping (SELECT 1) failed: " + e.toString());
-				}	
-			} finally {
-				//cleanup the Statment
-				try {
-                                        if (rs != null) rs.close();
-					if (stmt != null) stmt.close();
-				} catch (SQLException e) {
-				}
-			}
-			
-		}
-		return null;
-	}
+   public SQLException isValidConnection(Connection c)
+   {
+      //if there is a ping method then use it, otherwise just use a 'SELECT 1' statement
+      if (driverHasPingMethod)
+      {
+         try
+         {
+            ping.invoke(c, params);
+         }
+         catch (Exception e)
+         {
+            if (e instanceof SQLException)
+            {
+               return (SQLException) e;
+            }
+            else
+            {
+               log.warn("Unexpected error in ping", e);
+               return new SQLException("ping failed: " + e.toString());
+            }
+         }
+      }
+      else
+      {
+         Statement stmt = null;
+         ResultSet rs = null;
+         try
+         {
+            stmt = c.createStatement();
+            rs = stmt.executeQuery("SELECT 1");
+         }
+         catch (Exception e)
+         {
+            if (e instanceof SQLException)
+            {
+               return (SQLException) e;
+            }
+            else
+            {
+               log.warn("Unexpected error in ping (SELECT 1)", e);
+               return new SQLException("ping (SELECT 1) failed: " + e.toString());
+            }
+         }
+         finally
+         {
+            //cleanup the Statment
+            try
+            {
+               if (rs != null)
+                  rs.close();
+               
+               if (stmt != null)
+                  stmt.close();
+            }
+            catch (SQLException ignore)
+            {
+            
+            }
+         }
+      }
+      return null;
+   }
+
+   private void initPing() throws ClassNotFoundException, NoSuchMethodException
+   {
+      log = Logger.getLogger(MySQLValidConnectionChecker.class);
+      driverHasPingMethod = false;
+
+      Class mysqlConnection = Thread.currentThread().getContextClassLoader().loadClass("com.mysql.jdbc.Connection");
+      ping = mysqlConnection.getMethod("ping", new Class[] {});
+      if (ping != null)
+      {
+         driverHasPingMethod = true;
+      }
+   }
+
+   private void writeObject(ObjectOutputStream stream) throws IOException
+   {
+      // nothing
+   }
+
+   private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException
+   {
+      try
+      {
+         initPing();
+      }
+      catch (Exception e)
+      {
+         IOException ioe = new IOException("Unable to resolve ping method: " + e.getMessage());
+         ioe.initCause(e);
+         throw ioe;
+      }
+   }
 }

Modified: branches/JBPAPP_4_2_0_GA_CP/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/OracleValidConnectionChecker.java
===================================================================
--- branches/JBPAPP_4_2_0_GA_CP/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/OracleValidConnectionChecker.java	2008-10-06 11:30:19 UTC (rev 79143)
+++ branches/JBPAPP_4_2_0_GA_CP/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/OracleValidConnectionChecker.java	2008-10-06 11:43:56 UTC (rev 79144)
@@ -21,6 +21,9 @@
  */
 package org.jboss.resource.adapter.jdbc.vendor;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.lang.reflect.Method;
 import java.sql.Connection;
@@ -39,21 +42,20 @@
 public class OracleValidConnectionChecker
    implements ValidConnectionChecker, Serializable
 {
-   private static final long serialVersionUID = -2227528634302168877L;
+   private static final long serialVersionUID = 5379340663276548636L;
 
-   private static final Logger log = Logger.getLogger(OracleValidConnectionChecker.class);
+   private static transient Logger log;
 
-   private Method ping;
-
    // The timeout (apparently the timeout is ignored?)
    private static Object[] params = new Object[] { new Integer(5000) };
 
+   private transient Method ping;
+
    public OracleValidConnectionChecker()
    {
       try
       {
-         Class oracleConnection = Thread.currentThread().getContextClassLoader().loadClass("oracle.jdbc.driver.OracleConnection");
-         ping = oracleConnection.getMethod("pingDatabase", new Class[] { Integer.TYPE });
+         initPing();
       }
       catch (Exception e)
       {
@@ -68,7 +70,7 @@
          Integer status = (Integer) ping.invoke(c, params);
 
          // Error
-         if (status.intValue() < 0)
+         if (status == null || status.intValue() < 0)
             return new SQLException("pingDatabase failed status=" + status);
       }
       catch (Exception e)
@@ -80,4 +82,31 @@
       // OK
       return null;
    }
+
+   private void initPing() throws ClassNotFoundException, NoSuchMethodException
+   {
+      log = Logger.getLogger(OracleValidConnectionChecker.class);
+
+      Class oracleConnection = Thread.currentThread().getContextClassLoader().loadClass("oracle.jdbc.driver.OracleConnection");
+      ping = oracleConnection.getMethod("pingDatabase", new Class[] { Integer.TYPE });
+   }
+
+   private void writeObject(ObjectOutputStream stream) throws IOException
+   {
+      // nothing
+   }
+
+   private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException
+   {
+      try
+      {
+         initPing();
+      }
+      catch (Exception e)
+      {
+         IOException ioe = new IOException("Unable to resolve pingDatabase method: " + e.getMessage());
+         ioe.initCause(e);
+         throw ioe;
+      }
+   }
 }




More information about the jboss-cvs-commits mailing list