Skip to content

Commit

Permalink
change oracle valid connection impl
Browse files Browse the repository at this point in the history
  • Loading branch information
wenshao committed Dec 2, 2014
1 parent 427bea8 commit 0480471
Showing 1 changed file with 21 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,48 +15,35 @@
*/
package com.alibaba.druid.pool.vendor;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import com.alibaba.druid.pool.DruidPooledConnection;
import com.alibaba.druid.pool.ValidConnectionChecker;
import com.alibaba.druid.pool.ValidConnectionCheckerAdapter;
import com.alibaba.druid.proxy.jdbc.ConnectionProxy;
import com.alibaba.druid.support.logging.Log;
import com.alibaba.druid.support.logging.LogFactory;
import com.alibaba.druid.util.JdbcUtils;
import com.alibaba.druid.util.Utils;

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 java.util.Properties;

public class OracleValidConnectionChecker extends ValidConnectionCheckerAdapter implements ValidConnectionChecker, Serializable {

private static final long serialVersionUID = -2227528634302168877L;
private static final long serialVersionUID = -2227528634302168877L;

private static final Log LOG = LogFactory.getLog(OracleValidConnectionChecker.class);

private static final Log LOG = LogFactory.getLog(OracleValidConnectionChecker.class);
private int timeout = 1;

private final Class<?> clazz;
private final Method ping;
private final static Object[] params = new Object[] { new Integer(5000) };
private String defaultValidateQuery = "SELECT 'x' FROM DUAL";

public OracleValidConnectionChecker(){
try {
clazz = Utils.loadClass("oracle.jdbc.driver.OracleConnection");
if (clazz != null) {
ping = clazz.getMethod("pingDatabase", new Class[] { Integer.TYPE });
} else {
ping = null;
}
} catch (Exception e) {
throw new RuntimeException("Unable to resolve pingDatabase method:", e);
}

configFromProperties(System.getProperties());
}

@Override
public void configFromProperties(Properties properties) {
String property = properties.getProperty("druid.oracle.pingTimeout");
Expand All @@ -65,12 +52,16 @@ public void configFromProperties(Properties properties) {
setTimeout(value);
}
}
public void setTimeout(int timeout) {
params[0] = timeout;

public void setTimeout(int seconds) {
this.timeout = seconds;
}

public boolean isValidConnection(Connection conn, String validateQuery, int validationQueryTimeout) {
if (validateQuery == null || validateQuery.isEmpty()) {
validateQuery = this.defaultValidateQuery;
}

try {
if (conn.isClosed()) {
return false;
Expand All @@ -89,18 +80,11 @@ public boolean isValidConnection(Connection conn, String validateQuery, int vali
conn = ((ConnectionProxy) conn).getRawObject();
}

// unwrap
if (clazz != null && clazz.isAssignableFrom(conn.getClass())) {
Integer status = (Integer) ping.invoke(conn, params);

// Error
return status >= 0;
}

Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
stmt.setQueryTimeout(timeout);
rs = stmt.executeQuery(validateQuery);
return true;
} catch (SQLException e) {
Expand Down

0 comments on commit 0480471

Please sign in to comment.