/** * Alipay.com Inc. * Copyright (c) 2004-2012 All Rights Reserved. */ package com.alipay.zdal.datasource.resource.adapter.jdbc.vendor; import java.io.Serializable; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.SQLException; import org.apache.log4j.Logger; import com.alipay.zdal.datasource.resource.adapter.jdbc.ValidConnectionChecker; import com.alipay.zdal.datasource.resource.util.NestedRuntimeException; /** * Implements check valid connection sql * * @author ���� * @version $Id: OracleValidConnectionChecker.java, v 0.1 2014-1-6 ����05:32:47 Exp $ */ public class OracleValidConnectionChecker implements ValidConnectionChecker, Serializable { private static final long serialVersionUID = -2227528634302168877L; private static final Logger log = Logger .getLogger(OracleValidConnectionChecker.class); private Method ping; // The timeout (apparently the timeout is ignored?) private static Object[] params = new Object[] { new Integer(5000) }; /** * */ public OracleValidConnectionChecker() { try { Class oracleConnection = Thread.currentThread().getContextClassLoader().loadClass( "oracle.jdbc.driver.OracleConnection"); ping = oracleConnection.getMethod("pingDatabase", new Class[] { Integer.TYPE }); } catch (Exception e) { throw new NestedRuntimeException("Unable to resolve pingDatabase method:", e); } } /** * @see com.alipay.zdal.datasource.resource.adapter.jdbc.ValidConnectionChecker#isValidConnection(java.sql.Connection) */ public SQLException isValidConnection(Connection c) { try { Integer status = (Integer) ping.invoke(c, params); // Error if (status.intValue() < 0) return new SQLException("pingDatabase failed status=" + status); } catch (Exception e) { // What do we do here? Assume it is a misconfiguration log.warn("Unexpected error in pingDatabase", e); } // OK return null; } }