Ibatis实现oracle数据库连接池

Ibatis内置了三种数据源实现:SIMPLE DBCP JNDI这个不用多说了。现在我想用其他的连接池,比如现在要求用oracle的连接池。不用其他的框架如Spring来整合,怎么办?

也是刚研究ibatis不久,看了看框架之后。发现你只要提供数据源实现就好了,sqlMapConfig.xml文件中有这么一行

<dataSourcetype="SIMPLE">

这里的SIMPLE其实是简写,它指向的是com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory这个类 也就是所谓简单数据源的实现方式

DBCP指向的是 com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory

JNDI指向的是com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory

而且三者都实现了com.ibatis.sqlmap.engine.datasource.DataSourceFactory这个接口

我们来看这个接口

package com.ibatis.sqlmap.engine.datasource;

import javax.sql.DataSource;

import java.util.Map;

public interface DataSourceFactory {

public void initialize(Map map);

publicDataSource getDataSource();

}

接口很简单,只有两个方法,我们可以结合那三个框架带的实现类来分析一下:

1.initialize(Map map)方法时初始化数据源的,其map参数就是读取sqlMapConfig.xml文件所获得的url,driver,username,password等等,map由框架传入,不用关心

2.getDataSource()显然是返回数据源的方法,我们发现在那三个实现类中,getDataSource仅有return dataSource 这一句,说明他是框架调用的 不用关心

所以我们写自己的数据源,也要实现这个接口

好下面是我写的一个oracle数据源的实现

package com.pool.myself;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Map;
import java.util.Properties;
import javax.sql.DataSource;
import oracle.jdbc.pool.OracleConnectionCacheManager;
import oracle.jdbc.pool.OracleDataSource;
import com.ibatis.sqlmap.engine.datasource.DataSourceFactory;
public class OraclePoolForMyself implements DataSourceFactory{
private final static StringCACHE_NAME ="RACLEDATASOURCE";//新建的线程池名,也可以说是标识符
private static OracleDataSource dataSource;
public DataSource getDataSource() {
return dataSource;
}
publicvoid initialize(Map map) {
try {
dataSource =new OracleDataSource();
dataSource.setDriverType((String)map.get("JDBC.Driver"));
dataSource.setURL((String)map.get("JDBC.ConnectionURL"));
dataSource.setUser((String)map.get("JDBC.Username"));
dataSource.setPassword((String)map.get("JDBC.Password"));
// open cache
OracleConnectionCacheManager oracleConnectionCacheManager = OracleConnectionCacheManager.getConnectionCacheManagerInstance();
if (oracleConnectionCacheManager.existsCache(CACHE_NAME)) {
//在类重载后会重新创建单例,而此前建立的数据库缓存并没有移除,
//所以会造成"您要建立的缓存已经存在"的错误,
//此判断用来移除已经存在的缓存
oracleConnectionCacheManager.removeCache(CACHE_NAME, 0);//重载后移除缓存
System.out.println(Calendar.getInstance().getTime() + " 重新建立数据库连接缓存 ");
} else {
dataSource.setConnectionCachingEnabled(true);//开启缓存
}
oracleConnectionCacheManager =null;
dataSource.setConnectionCacheName(CACHE_NAME);
//设置配置文件
InputStream in=null;
try {
in = new BufferedInputStream(new FileInputStream(new File("oracleSource.properties")));//这个配置文件附在后面
}catch (FileNotFoundException e) {
e.printStackTrace();
}
Properties cacheProperties =new Properties();
try {
cacheProperties.load(in);
}catch (IOException e) {
e.printStackTrace();
}
dataSource.setConnectionCacheProperties(cacheProperties);//激活参数
}catch (Exception e) {
e.printStackTrace();
}
}
}


下面是用到的oracleSource.properties放在工程根目录下就行

这些都是连接池的参数

MinLimit=20

MaxLimit=50

InitialLimit=20

ConnectionWaitTimeout=300

ValidateConnection=true

AbandonedConnectionTimeout=300

最后呢 在sqlMapConfig.xml文件中,改成如下,也即是指向自己的实现类。

<dataSourcetype="com.pool.myself.OraclePoolForMyself">

用到的jar包是ibatis2.3.4.8.jar ojdbc14.jar

经过测试,各参数都能实际工作

当然,如果想用其他数据源,也只是换个实现类而已 相信大家会举一反三

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值