[jboss-cvs] JBossAS SVN: r67903 - in branches/Branch_4_2: connector/src/main/org/jboss/resource/adapter/jdbc/vendor and 1 other directory.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Dec 4 13:03:30 EST 2007
Author: adrian at jboss.org
Date: 2007-12-04 13:03:30 -0500 (Tue, 04 Dec 2007)
New Revision: 67903
Added:
branches/Branch_4_2/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/MySQLReplicationValidConnectionChecker.java
Modified:
branches/Branch_4_2/build/docs/copyright.txt
Log:
[JBAS-5035] - ValidConnectionChecker for MySQL ReplicationDriver contributed by Luc Boudreau
Modified: branches/Branch_4_2/build/docs/copyright.txt
===================================================================
--- branches/Branch_4_2/build/docs/copyright.txt 2007-12-04 18:03:17 UTC (rev 67902)
+++ branches/Branch_4_2/build/docs/copyright.txt 2007-12-04 18:03:30 UTC (rev 67903)
@@ -112,7 +112,7 @@
gropi Tobias Frech
mattmunz Matthew Munz
stormy_sky,schaefera Andreas Schaefer
-peter_f Peter Fagerlund
+peter_f Peter Fagerlunds
sparre,osh Ole Husgaard
bartmann Michael Bartmann
lsanders Larry Sanderson
@@ -152,7 +152,8 @@
dmcnair Dewayne McNair
vladimir Vladimir Ivanovic
joel Joel Phillips
+Luc Boudreau(JIRA) Luc Boudreau
-------------------------------------------------------------------------------
* JBoss is a registered trademark of Red Hat Middleware LLC.
-
\ No newline at end of file
+
Added: branches/Branch_4_2/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/MySQLReplicationValidConnectionChecker.java
===================================================================
--- branches/Branch_4_2/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/MySQLReplicationValidConnectionChecker.java (rev 0)
+++ branches/Branch_4_2/connector/src/main/org/jboss/resource/adapter/jdbc/vendor/MySQLReplicationValidConnectionChecker.java 2007-12-04 18:03:30 UTC (rev 67903)
@@ -0,0 +1,208 @@
+/*
+ * 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.Serializable;
+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 = false;
+
+ /**
+ * Tells if the connection supports the ping method.
+ */
+ private boolean driverHasPingMethod = false;
+
+ /**
+ * Classname of the supported connection
+ */
+ protected final static String CONNECTION_CLASS = "com.mysql.jdbc.ReplicationConnection";
+
+ /**
+ * Log access object
+ */
+ private static final Logger log = Logger.getLogger(MySQLReplicationValidConnectionChecker.class);
+
+ // The timeout (apparently the timeout is ignored?)
+ private static Object[] timeoutParam = new Object[] {};
+
+ /**
+ * Initiates the ValidConnectionChecker implementation.
+ */
+ public MySQLReplicationValidConnectionChecker()
+ {
+ Class mysqlConnection = null;
+
+ try
+ {
+ // Load connection class
+ mysqlConnection = Thread.currentThread().getContextClassLoader().loadClass( CONNECTION_CLASS );
+
+ // Check for Java 6 compatibility and use isValid on the connection
+ try
+ {
+ 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
+ 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);
+ }
+
+ }
+
+ } catch (ClassNotFoundException e) {
+ log.error("Cannot find the driver class defined in CONNECTION_CLASS", e);
+ }
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.jboss.resource.adapter.jdbc.ValidConnectionChecker#isValidConnection(java.sql.Connection)
+ */
+ public SQLException isValidConnection(Connection c)
+ {
+
+ if (driverHasIsValidMethod)
+ {
+ try {
+ c.getClass().getMethod("isValid", new Class[] {}).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());
+ }
+ }
+ }
+
+ //if there is a ping method then use it, otherwise just use a 'SELECT 1' statement
+ else if (driverHasPingMethod)
+ {
+ try {
+ c.getClass().getMethod("ping", new Class[] {}).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
+ {
+
+ 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) {}
+ finally {
+ try {
+ if (stmt != null) stmt.close();
+ } catch (SQLException e) {}
+ }
+ }
+
+ }
+ return null;
+ }
+
+}
More information about the jboss-cvs-commits
mailing list