001: /*
002: Copyright (C) 2002-2005 MySQL AB
003:
004: This program is free software; you can redistribute it and/or modify
005: it under the terms of version 2 of the GNU General Public License as
006: published by the Free Software Foundation.
007:
008: There are special exceptions to the terms and conditions of the GPL
009: as it is applied to this software. View the full text of the
010: exception in file EXCEPTIONS-CONNECTOR-J in the directory of this
011: software distribution.
012:
013: This program is distributed in the hope that it will be useful,
014: but WITHOUT ANY WARRANTY; without even the implied warranty of
015: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
016: GNU General Public License for more details.
017:
018: You should have received a copy of the GNU General Public License
019: along with this program; if not, write to the Free Software
020: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
021:
022: */
023: package com.mysql.jdbc.integration.c3p0;
024:
025: import java.lang.reflect.Method;
026: import java.sql.Connection;
027: import java.sql.SQLException;
028: import java.sql.Statement;
029:
030: import com.mchange.v2.c3p0.C3P0ProxyConnection;
031: import com.mchange.v2.c3p0.QueryConnectionTester;
032: import com.mysql.jdbc.CommunicationsException;
033:
034: /**
035: * ConnectionTester for C3P0 connection pool that uses the more efficient
036: * COM_PING method of testing connection 'liveness' for MySQL, and 'sorts'
037: * exceptions based on SQLState or class of 'CommunicationsException' for
038: * handling exceptions.
039: *
040: * @version $Id: MysqlConnectionTester.java,v 1.1.2.1 2005/05/13 18:58:39
041: * mmatthews Exp $
042: */
043: public final class MysqlConnectionTester implements
044: QueryConnectionTester {
045:
046: private static final long serialVersionUID = 3256444690067896368L;
047:
048: private static final Object[] NO_ARGS_ARRAY = new Object[0];
049:
050: private Method pingMethod;
051:
052: public MysqlConnectionTester() {
053: try {
054: pingMethod = com.mysql.jdbc.Connection.class.getMethod(
055: "ping", null);
056: } catch (Exception ex) {
057: // punt, we have no way to recover, other than we now use 'SELECT 1'
058: // for
059: // handling the connection testing.
060: }
061: }
062:
063: /*
064: * (non-Javadoc)
065: *
066: * @see com.mchange.v2.c3p0.ConnectionTester#activeCheckConnection(java.sql.Connection)
067: */
068: public int activeCheckConnection(Connection con) {
069: try {
070: if (pingMethod != null) {
071: if (con instanceof com.mysql.jdbc.Connection) {
072: // We've been passed an instance of a MySQL connection --
073: // no need for reflection
074: ((com.mysql.jdbc.Connection) con).ping();
075: } else {
076: // Assume the connection is a C3P0 proxy
077: C3P0ProxyConnection castCon = (C3P0ProxyConnection) con;
078: castCon.rawConnectionOperation(pingMethod,
079: C3P0ProxyConnection.RAW_CONNECTION,
080: NO_ARGS_ARRAY);
081: }
082: } else {
083: Statement pingStatement = null;
084:
085: try {
086: pingStatement = con.createStatement();
087: pingStatement.executeQuery("SELECT 1").close();
088: } finally {
089: if (pingStatement != null) {
090: pingStatement.close();
091: }
092: }
093: }
094:
095: return CONNECTION_IS_OKAY;
096: } catch (Exception ex) {
097: return CONNECTION_IS_INVALID;
098: }
099: }
100:
101: /*
102: * (non-Javadoc)
103: *
104: * @see com.mchange.v2.c3p0.ConnectionTester#statusOnException(java.sql.Connection,
105: * java.lang.Throwable)
106: */
107: public int statusOnException(Connection arg0, Throwable throwable) {
108: if (throwable instanceof CommunicationsException
109: || "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException"
110: .equals(throwable.getClass().getName())) {
111: return CONNECTION_IS_INVALID;
112: }
113:
114: if (throwable instanceof SQLException) {
115: String sqlState = ((SQLException) throwable).getSQLState();
116:
117: if (sqlState != null && sqlState.startsWith("08")) {
118: return CONNECTION_IS_INVALID;
119: }
120:
121: return CONNECTION_IS_OKAY;
122: }
123:
124: // Runtime/Unchecked?
125:
126: return CONNECTION_IS_INVALID;
127: }
128:
129: /*
130: * (non-Javadoc)
131: *
132: * @see com.mchange.v2.c3p0.QueryConnectionTester#activeCheckConnection(java.sql.Connection,
133: * java.lang.String)
134: */
135: public int activeCheckConnection(Connection arg0, String arg1) {
136: return CONNECTION_IS_OKAY;
137: }
138: }
|