package org.logicalcobwebs.proxool;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Properties;
import java.util.StringTokenizer;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.RefAddr;
import javax.naming.Reference;
import javax.naming.StringRefAddr;
import javax.naming.spi.ObjectFactory;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ProxoolDataSource
implements DataSource, ObjectFactory
{
private static final Log LOG = LogFactory.getLog(ProxoolDataSource.class);
private int loginTimeout;
private PrintWriter logWriter;
private String alias;//是连接池的别名
private String driver;//数据库驱动
private String fatalSqlExceptionWrapperClass;
private long houseKeepingSleepTime;//保留线程处于睡眠状态的最长时间,house keeper 的职责就是检查各个连接的状态,并判断是否需要销毁或者创建.
//自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒,视乎不允许被赋值;
private String houseKeepingTestSql;// 如果发现了空闲的数据库连接.house keeper 将会用这个语句来测试.这个语句最好非常快的被执行.如果没有定义,测试过程将会被忽略。
private long maximumActiveTime;//如果housekeeper 检测到某个线程的活动时间大于这个数值.它将会杀掉这个线程.所以确认一下你的服务器的带宽.然后定一个合适的值.默认是5分钟
private int maximumConnectionCount;//最大连接数
private long maximumConnectionLifetime;//一个线程的最大寿命.
private int minimumConnectionCount;//最小链接数
private long overloadWithoutRefusalLifetime;//这可以帮助我们确定连接池的状态。如果我们已经拒绝了一个连接在这个设定值(毫秒),然后被认为是超载。默认为60秒。
private String password;//数据库密码
private int prototypeCount;//最少保持的空闲连接数 (默认5个)-->
private long recentlyStartedThreshold;//这可以帮助我们确定连接池的状态,连接数少还是多或超载。只要至少有一个连接已开始在此值(毫秒)内,或者有一些多余的可用连接,那么我们假设连接池是开启的。默认为60秒
private int simultaneousBuildThrottle;//这是我们可一次建立的最大连接数。那就是新增的连接请求,但还没有可供使用的连接。由于连接可以使用多线程,在有限的时间之间建立联系从而带来可用连接,但是我们需要通过一些方式确认一些线程并不是立即响应连接请求的,默认是10。
private String statistics;//连接池使用状况统计。 参数“10s,1m,1d”
private String statisticsLogLevel;//日志统计跟踪类型。 参数“ERROR”或 “INFO”
private boolean trace;// 如果为true,那么每个被执行的SQL语句将会在执行期被log记录(DEBUG LEVEL).你也可以注册一个ConnectionListener (参看ProxoolFacade)得到这些信息.
private String driverUrl;//数据库链接字符串
private String user;//数据库用户名
private boolean verbose;
private boolean jmx;
private String jmxAgentId;
private boolean testBeforeUse;//如果为true,在每个连接被测试前都会服务这个连接,如果一个连接失败,那么将被丢弃,另一个连接将会被处理,如果所有连接都失败,一个新的连接将会被建立。否则将会抛出一个SQLException异常。
private boolean testAfterUse;//如果为true,在每个连接被测试后都会服务这个连接,使其回到连接池中,如果连接失败,那么将被废弃
private Properties delegateProperties = new Properties();
private String fatalSqlExceptionsAsString;
public ProxoolDataSource()
{
reset();
}
public ProxoolDataSource(String alias) {
this.alias = alias;
}
public Connection getConnection()
throws SQLException
{
ConnectionPool cp = null;
try {
if (!ConnectionPoolManager.getInstance().isPoolExists(this.alias)) {
registerPool();
}
cp = ConnectionPoolManager.getInstance().getConnectionPool(this.alias);
return cp.getConnection();
} catch (ProxoolException e) {
LOG.error("Problem getting connection", e);
}throw new SQLException(e.toString());
}
private synchronized void registerPool()
throws ProxoolException
{
if (!ConnectionPoolManager.getInstance().isPoolExists(this.alias)) {
ConnectionPoolDefinition cpd = new ConnectionPoolDefinition();
cpd.setAl
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Properties;
import java.util.StringTokenizer;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.RefAddr;
import javax.naming.Reference;
import javax.naming.StringRefAddr;
import javax.naming.spi.ObjectFactory;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ProxoolDataSource
implements DataSource, ObjectFactory
{
private static final Log LOG = LogFactory.getLog(ProxoolDataSource.class);
private int loginTimeout;
private PrintWriter logWriter;
private String alias;//是连接池的别名
private String driver;//数据库驱动
private String fatalSqlExceptionWrapperClass;
private long houseKeepingSleepTime;//保留线程处于睡眠状态的最长时间,house keeper 的职责就是检查各个连接的状态,并判断是否需要销毁或者创建.
//自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒,视乎不允许被赋值;
private String houseKeepingTestSql;// 如果发现了空闲的数据库连接.house keeper 将会用这个语句来测试.这个语句最好非常快的被执行.如果没有定义,测试过程将会被忽略。
private long maximumActiveTime;//如果housekeeper 检测到某个线程的活动时间大于这个数值.它将会杀掉这个线程.所以确认一下你的服务器的带宽.然后定一个合适的值.默认是5分钟
private int maximumConnectionCount;//最大连接数
private long maximumConnectionLifetime;//一个线程的最大寿命.
private int minimumConnectionCount;//最小链接数
private long overloadWithoutRefusalLifetime;//这可以帮助我们确定连接池的状态。如果我们已经拒绝了一个连接在这个设定值(毫秒),然后被认为是超载。默认为60秒。
private String password;//数据库密码
private int prototypeCount;//最少保持的空闲连接数 (默认5个)-->
private long recentlyStartedThreshold;//这可以帮助我们确定连接池的状态,连接数少还是多或超载。只要至少有一个连接已开始在此值(毫秒)内,或者有一些多余的可用连接,那么我们假设连接池是开启的。默认为60秒
private int simultaneousBuildThrottle;//这是我们可一次建立的最大连接数。那就是新增的连接请求,但还没有可供使用的连接。由于连接可以使用多线程,在有限的时间之间建立联系从而带来可用连接,但是我们需要通过一些方式确认一些线程并不是立即响应连接请求的,默认是10。
private String statistics;//连接池使用状况统计。 参数“10s,1m,1d”
private String statisticsLogLevel;//日志统计跟踪类型。 参数“ERROR”或 “INFO”
private boolean trace;// 如果为true,那么每个被执行的SQL语句将会在执行期被log记录(DEBUG LEVEL).你也可以注册一个ConnectionListener (参看ProxoolFacade)得到这些信息.
private String driverUrl;//数据库链接字符串
private String user;//数据库用户名
private boolean verbose;
private boolean jmx;
private String jmxAgentId;
private boolean testBeforeUse;//如果为true,在每个连接被测试前都会服务这个连接,如果一个连接失败,那么将被丢弃,另一个连接将会被处理,如果所有连接都失败,一个新的连接将会被建立。否则将会抛出一个SQLException异常。
private boolean testAfterUse;//如果为true,在每个连接被测试后都会服务这个连接,使其回到连接池中,如果连接失败,那么将被废弃
private Properties delegateProperties = new Properties();
private String fatalSqlExceptionsAsString;
public ProxoolDataSource()
{
reset();
}
public ProxoolDataSource(String alias) {
this.alias = alias;
}
public Connection getConnection()
throws SQLException
{
ConnectionPool cp = null;
try {
if (!ConnectionPoolManager.getInstance().isPoolExists(this.alias)) {
registerPool();
}
cp = ConnectionPoolManager.getInstance().getConnectionPool(this.alias);
return cp.getConnection();
} catch (ProxoolException e) {
LOG.error("Problem getting connection", e);
}throw new SQLException(e.toString());
}
private synchronized void registerPool()
throws ProxoolException
{
if (!ConnectionPoolManager.getInstance().isPoolExists(this.alias)) {
ConnectionPoolDefinition cpd = new ConnectionPoolDefinition();
cpd.setAl