_Connection.java
import java.lang.reflect.*;
import java.sql.*;
/**
* 定义数据库连接的代理类
* @author ShaoJiang
*
*/
public class _Connection implements InvocationHandler {
// 定义连接
private Connection conn = null;
// 定义监控连接创建的语句
private Statement statRef = null;
private PreparedStatement prestatRef = null;
// 是否支持事务标志
private boolean supportTransaction = false;
// 数据库的忙状态
private boolean isFree = false;
// 最后一次访问时间
long lastAccessTime = 0;
// 定义要接管的函数的名字
String CREATESTATE = "createStatement";
String CLOSE = "close";
String PREPARESTATEMENT = "prepareStatement";
String COMMIT = "commit";
String ROLLBACK = "rollback";
/**
* 构造函数,采用私有,防止被直接创建
* @param param 连接参数
*/
private _Connection(ConnectionParam param) {
// 记录日至
try {
// 创建连接
Class.forName(param.getDriver()).newInstance();
conn = DriverManager.getConnection(param.getUrl(), param.getUser(),
param.getPassword());
DatabaseMetaData dm = null;
dm = conn.getMetaData();
// 判断是否支持事务
supportTransaction = dm.supportsTransactions();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* (non-Javadoc) * @see
* java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
* java.lang.reflect.Method, java.lang.Object[])
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object obj = null;
// 判断是否调用了close的方法,如果调用close方法则把连接置为无用状态
if (CLOSE.equals(method.getName())) {
// 设置不使用标志
setIsFree(false);
// 检查是否有后续工作,清除该连接无用资源
if (statRef != null)
statRef.close();
if (prestatRef != null)
prestatRef.close();
return null;
}
// 判断是使用了createStatement语句
if (CREATESTATE.equals(method.getName())) {
obj = method.invoke(conn, args);
statRef = (Statement) obj;// 记录语句
return obj;
}
// 判断是使用了prepareStatement语句
if (PREPARESTATEMENT.equals(method.getName())) {
obj = method.invoke(conn, args);
prestatRef = (PreparedStatement) obj;
return obj;
}
// 如果不支持事务,就不执行该事物的代码
if ((COMMIT.equals(method.getName()) || ROLLBACK.equals(method
.getName())) && (!isSupportTransaction()))
return null;
obj = method.invoke(conn, args);
// 设置最后一次访问时间,以便及时清除超时的连接
lastAccessTime = System.currentTimeMillis();
return obj;
}
/**
* 创建连接
* @param pool 连接池
* @param param 连接参数
* @return 连接
*/
static public _Connection getConnection(ConnectionPool pool,
ConnectionParam param) {
if (pool.isCreate())// 判断是否正确初始化连接池
{
_Connection _conn = new _Connection(param);
return _conn;
} else
return null;
}
public Connection getFreeConnection() {
// 返回数据库连接conn的接管类,以便截住close方法
Connection proxyConn = (Connection) Proxy.newProxyInstance(conn.getClass()
.getClassLoader(), conn.getClass().getInterfaces(), this);
return proxyConn;
}
/**
* 该方法真正的关闭了数据库的连接
* @throws SQLException
*/
void close() throws SQLException {
// 由于类属性conn是没有被接管的连接,因此一旦调用close方法后就直接关闭连接
conn.close();
}
public void setIsFree(boolean value) {
isFree = value;
}
public boolean isFree() {
return isFree;
}
/**
* 判断是否支持事务
* @return boolean
*/
public boolean isSupportTransaction() {
return supportTransaction;
}
}