ibatis本身并不直接支持proxool的数据源连接,我们可以通过以下方法实现:
第一:采用spring将ibatis与proxool进行整合,利用spring将proxool数据源注入到sqlmapclient中去,具体配置可在网上找spring+ibatis整合的例子。
第二种方式,不依赖spring完全独立,首先我们要自定义一个DataSourceFactory类,这个类必须实现com.ibatis.sqlmap.engine.datasource.DataSourceFactory接口
代码实现:
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
package
mycom.util.db;
import java.util.Map;
import javax.sql.DataSource;
import org.logicalcobwebs.proxool.ProxoolDataSource;
import com.ibatis.sqlmap.engine.datasource.DataSourceFactory;
public class ProxoolDataSourceFactory implements DataSourceFactory {
private ProxoolDataSource dataSource;
public DataSource getDataSource() {
return dataSource;
}
/**
* 此方法中实现对ProxoolDataSource类中相关属性的设置
* house-keeping-sleep-time
* 线程保持休眠时间,house keeper负责检查所有连接的状态,并测试是否需要销毁或者创建,默认时间为30秒
* house-keeping-test-sql
* 如果house keep 线程发现空闲的连接,他会测试使用这个sql进行测试,这个语句应该快速的被执行。像查询日期的sql语句。
* maximum-active-time
* 最大线程活动时间。
* maximum-connection-count
* 数据库最大连接数(默认值为15)
* maximum-connection-count
* 一个连接存在的最长保持活动的时间。默认值是4小时,单位是毫秒
* overload-without-refusal-lifetime
* 这个帮助我们确定连接池的状态。如果在这个时间阀值内(单位为毫秒)拒绝了一个连接,就认为是过载了。默认时间60秒。
*/
public void initialize(Map map) {
dataSource = new ProxoolDataSource();
dataSource.setDriver((String)map.get("driver" ));
dataSource.setDriverUrl((String)map.get("driverUrl" ));
dataSource.setUser((String)map.get("user" ));
dataSource.setPassword((String)map.get("password" ));
dataSource.setAlias("alias" );
//线程保持休眠时间,house keeper负责检查所有连接的状态,并测试是否需要销毁或者创建,默认时间为30秒
if(map.containsKey("house-keeping-sleep-time" )){
dataSource.setHouseKeepingSleepTime(Integer.parseInt(map.get("house-keeping-sleep-time" ).toString()));
}
//如果house keep 线程发现空闲的连接,他会测试使用这个sql进行测试,这个语句应该快速的被执行。像查询日期的sql语句。
if(map.containsKey("house-keeping-test-sql" )){
dataSource.setHouseKeepingTestSql(map.get("house-keeping-test-sql" ).toString());
}
// 最大线程活动时间。
// 如果housekeeper 遇到一个线程活动时间超过定义的时间,将会终止这个线程。
//所以你需要设置这个时间大于预计最慢响应的时间(默认时间是5分钟)。
if(map.containsKey("maximum-active-time" )){
dataSource.setMaximumActiveTime(Integer.parseInt(map.get("maximum-active-time" ).toString()));
}
//数据库最大连接数(默认值为15)
if(map.containsKey("maximum-connection-count" )){
dataSource.setMaximumConnectionCount(Integer.parseInt(map.get("maximum-connection-count" ).toString()));
}
//一个连接存在的最长保持活动的时间。默认值是4小时,单位是毫秒。
if(map.containsKey("maximum-connection-lifetime" )){
dataSource.setMaximumConnectionLifetime(Integer.parseInt(map.get("maximum-connection-lifetime" ).toString()));
}
//最小连接保持打开的个数,不管是否需要,默认值是5个。
if(map.containsKey("minimum-connection-count" )){
dataSource.setMaximumConnectionLifetime(Integer.parseInt(map.get("minimum-connection-count" ).toString()));
}
//这个帮助我们确定连接池的状态。如果在这个时间阀值内(单位为毫秒)拒绝了一个连接,就认为是过载了。默认时间60秒。
if(map.containsKey("overload-without-refusal-lifetime" )){
dataSource.setMaximumConnectionLifetime(Integer.parseInt(map.get("overload-without-refusal-lifetime" ).toString()));
}
//如果为true,在每个连接被测试后都会服务这个连接,使其回到连接池中,如果连接失败,那么将被废弃
if((String)map.get("testAfterUse")!=null && !"".equals(map.get("testAfterUse").toString().trim())){
dataSource.setTestAfterUse(Boolean.parseBoolean((String)map.get("testAfterUse")));
}
// 如果为true,在每个连接被测试前都会服务这个连接,如果一个连接失败,那么将被丢弃,另一个连接将会被处理,如果所有连接都失败,
//一个新的连接将会被建立。否则将会抛出一个SQLException异常
if((String)map.get("testBeforeUse")!=null && !"".equals(map.get("testBeforeUse").toString().trim())){
dataSource.setTestBeforeUse(Boolean.parseBoolean((String)map.get("testBeforeUse")));
}
//如果为true,那么每个被执行的SQL语句将会在执行期被log记录(DEBUG LEVEL).
if((String)map.get("trace")!=null && !"".equals(map.get("trace").toString().trim())){
dataSource.setTrace(Boolean.parseBoolean((String)map.get("trace")));
}
//最少保持的空闲连接数(默认2个)
if((String)map.get("prototypeCount")!=null && !"".equals(map.get("prototypeCount").toString().trim())){
dataSource.setPrototypeCount(Integer.parseInt((String)map.get("prototypeCount")));
System.out.println("prototypeCount : " + Integer.parseInt((String)map.get("prototypeCount")));
}
//如果housekeeper 检测到某个线程的活动时间大于这个数值.它将会杀掉这个线程.所以确认一下你的服务器的带宽.然后定一个合适的值.默认是5分钟
if((String)map.get("maximumActiveTime")!=null && !"".equals(map.get("maximumActiveTime").toString().trim())){
dataSource.setMaximumActiveTime(Integer.parseInt((String)map.get("maximumActiveTime")));
}
//一次建立的最大连接数,默认10
if(map.get("simultaneousBuildThrottle")!=null && !"".equals(map.get("simultaneousBuildThrottle").toString().trim())){
dataSource.setSimultaneousBuildThrottle(Integer.parseInt(map.get("simultaneousBuildThrottle").toString()));
}
//日志统计跟踪类型。 参数“ERROR”或 “INFO”
if(map.get("statisticsLogLevel")!=null && !"".equals(map.get("statisticsLogLevel").toString().trim())){
dataSource.setStatisticsLogLevel(map.get("statisticsLogLevel").toString());
}
//链接状况统计
if(map.get("statistics")!=null && !"".equals(map.get("statistics").toString().trim())){
dataSource.setStatistics(map.get("statistics").toString());
}
if(map.get("recentlyStartedThreshold")!=null && !"".equals(map.get("recentlyStartedThreshold").toString().trim())){
dataSource.setRecentlyStartedThreshold(Integer.parseInt(map.get("recentlyStartedThreshold").toString()));
}
if(map.get("overloadWithoutRefusalLifetime")!=null && !"".equals(map.get("overloadWithoutRefusalLifetime").toString().trim())){
dataSource.setOverloadWithoutRefusalLifetime(Integer.parseInt(map.get("overloadWithoutRefusalLifetime").toString()));
}
}
}
import java.util.Map;
import javax.sql.DataSource;
import org.logicalcobwebs.proxool.ProxoolDataSource;
import com.ibatis.sqlmap.engine.datasource.DataSourceFactory;
public class ProxoolDataSourceFactory implements DataSourceFactory {
private ProxoolDataSource dataSource;
public DataSource getDataSource() {
return dataSource;
}
/**
* 此方法中实现对ProxoolDataSource类中相关属性的设置
* house-keeping-sleep-time
* 线程保持休眠时间,house keeper负责检查所有连接的状态,并测试是否需要销毁或者创建,默认时间为30秒
* house-keeping-test-sql
* 如果house keep 线程发现空闲的连接,他会测试使用这个sql进行测试,这个语句应该快速的被执行。像查询日期的sql语句。
* maximum-active-time
* 最大线程活动时间。
* maximum-connection-count
* 数据库最大连接数(默认值为15)
* maximum-connection-count
* 一个连接存在的最长保持活动的时间。默认值是4小时,单位是毫秒
* overload-without-refusal-lifetime
* 这个帮助我们确定连接池的状态。如果在这个时间阀值内(单位为毫秒)拒绝了一个连接,就认为是过载了。默认时间60秒。
*/
public void initialize(Map map) {
dataSource = new ProxoolDataSource();
dataSource.setDriver((String)map.get("driver" ));
dataSource.setDriverUrl((String)map.get("driverUrl" ));
dataSource.setUser((String)map.get("user" ));
dataSource.setPassword((String)map.get("password" ));
dataSource.setAlias("alias" );
//线程保持休眠时间,house keeper负责检查所有连接的状态,并测试是否需要销毁或者创建,默认时间为30秒
if(map.containsKey("house-keeping-sleep-time" )){
dataSource.setHouseKeepingSleepTime(Integer.parseInt(map.get("house-keeping-sleep-time" ).toString()));
}
//如果house keep 线程发现空闲的连接,他会测试使用这个sql进行测试,这个语句应该快速的被执行。像查询日期的sql语句。
if(map.containsKey("house-keeping-test-sql" )){
dataSource.setHouseKeepingTestSql(map.get("house-keeping-test-sql" ).toString());
}
// 最大线程活动时间。
// 如果housekeeper 遇到一个线程活动时间超过定义的时间,将会终止这个线程。
//所以你需要设置这个时间大于预计最慢响应的时间(默认时间是5分钟)。
if(map.containsKey("maximum-active-time" )){
dataSource.setMaximumActiveTime(Integer.parseInt(map.get("maximum-active-time" ).toString()));
}
//数据库最大连接数(默认值为15)
if(map.containsKey("maximum-connection-count" )){
dataSource.setMaximumConnectionCount(Integer.parseInt(map.get("maximum-connection-count" ).toString()));
}
//一个连接存在的最长保持活动的时间。默认值是4小时,单位是毫秒。
if(map.containsKey("maximum-connection-lifetime" )){
dataSource.setMaximumConnectionLifetime(Integer.parseInt(map.get("maximum-connection-lifetime" ).toString()));
}
//最小连接保持打开的个数,不管是否需要,默认值是5个。
if(map.containsKey("minimum-connection-count" )){
dataSource.setMaximumConnectionLifetime(Integer.parseInt(map.get("minimum-connection-count" ).toString()));
}
//这个帮助我们确定连接池的状态。如果在这个时间阀值内(单位为毫秒)拒绝了一个连接,就认为是过载了。默认时间60秒。
if(map.containsKey("overload-without-refusal-lifetime" )){
dataSource.setMaximumConnectionLifetime(Integer.parseInt(map.get("overload-without-refusal-lifetime" ).toString()));
}
//如果为true,在每个连接被测试后都会服务这个连接,使其回到连接池中,如果连接失败,那么将被废弃
if((String)map.get("testAfterUse")!=null && !"".equals(map.get("testAfterUse").toString().trim())){
dataSource.setTestAfterUse(Boolean.parseBoolean((String)map.get("testAfterUse")));
}
// 如果为true,在每个连接被测试前都会服务这个连接,如果一个连接失败,那么将被丢弃,另一个连接将会被处理,如果所有连接都失败,
//一个新的连接将会被建立。否则将会抛出一个SQLException异常
if((String)map.get("testBeforeUse")!=null && !"".equals(map.get("testBeforeUse").toString().trim())){
dataSource.setTestBeforeUse(Boolean.parseBoolean((String)map.get("testBeforeUse")));
}
//如果为true,那么每个被执行的SQL语句将会在执行期被log记录(DEBUG LEVEL).
if((String)map.get("trace")!=null && !"".equals(map.get("trace").toString().trim())){
dataSource.setTrace(Boolean.parseBoolean((String)map.get("trace")));
}
//最少保持的空闲连接数(默认2个)
if((String)map.get("prototypeCount")!=null && !"".equals(map.get("prototypeCount").toString().trim())){
dataSource.setPrototypeCount(Integer.parseInt((String)map.get("prototypeCount")));
System.out.println("prototypeCount : " + Integer.parseInt((String)map.get("prototypeCount")));
}
//如果housekeeper 检测到某个线程的活动时间大于这个数值.它将会杀掉这个线程.所以确认一下你的服务器的带宽.然后定一个合适的值.默认是5分钟
if((String)map.get("maximumActiveTime")!=null && !"".equals(map.get("maximumActiveTime").toString().trim())){
dataSource.setMaximumActiveTime(Integer.parseInt((String)map.get("maximumActiveTime")));
}
//一次建立的最大连接数,默认10
if(map.get("simultaneousBuildThrottle")!=null && !"".equals(map.get("simultaneousBuildThrottle").toString().trim())){
dataSource.setSimultaneousBuildThrottle(Integer.parseInt(map.get("simultaneousBuildThrottle").toString()));
}
//日志统计跟踪类型。 参数“ERROR”或 “INFO”
if(map.get("statisticsLogLevel")!=null && !"".equals(map.get("statisticsLogLevel").toString().trim())){
dataSource.setStatisticsLogLevel(map.get("statisticsLogLevel").toString());
}
//链接状况统计
if(map.get("statistics")!=null && !"".equals(map.get("statistics").toString().trim())){
dataSource.setStatistics(map.get("statistics").toString());
}
if(map.get("recentlyStartedThreshold")!=null && !"".equals(map.get("recentlyStartedThreshold").toString().trim())){
dataSource.setRecentlyStartedThreshold(Integer.parseInt(map.get("recentlyStartedThreshold").toString()));
}
if(map.get("overloadWithoutRefusalLifetime")!=null && !"".equals(map.get("overloadWithoutRefusalLifetime").toString().trim())){
dataSource.setOverloadWithoutRefusalLifetime(Integer.parseInt(map.get("overloadWithoutRefusalLifetime").toString()));
}
}
}
配置sqlmap.xml文件
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
<dataSource type="mycom.util.db.ProxoolDataSourceFactory">
<property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="driverUrl" value="jdbc:sqlserver://localhost:1433;databaseName=mydb;"/>
<property name="user" value="sa"/>
<property name="password" value="sasa"/>
<property name="maximum-connection-count" value="40"/>
<property name="overload-without-refusal-lifetime" value="60"/>
<property name="house-keeping-test-sql" value="select getdate()"/>
</dataSource>
<property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="driverUrl" value="jdbc:sqlserver://localhost:1433;databaseName=mydb;"/>
<property name="user" value="sa"/>
<property name="password" value="sasa"/>
<property name="maximum-connection-count" value="40"/>
<property name="overload-without-refusal-lifetime" value="60"/>
<property name="house-keeping-test-sql" value="select getdate()"/>
</dataSource>
附proxool的下载地址: