动态数据源的实现源码
最近由于工作需要!需要有一个动态的连接池实现!上网找了很多!实现方法看似都很繁琐!所有自己就copy了一点点思想干脆自己写了一个!
做的是c3p0的连接池配置!所以请先下载相关的c3p0.jar包以及连接池包
/**
* 该类是初始化连接池 或则得到连接
* @author SkyWen
*
*/
public class DynamicDataSourcePool {
private static final Log log = LogFactory.getLog(DynamicDataSourcePool.class);
private ComboPooledDataSource pool=null;//申明C3p0数据连接池变量
/**
* 默认的构造方法
* @param userName 数据库用户名
* @param pass 数据库密码
* @param url 连接的url
* @param driverClass 数据驱动
*/
public DynamicDataSourcePool(String userName,String pass,String url,String driverClass) {
try {
this.pool=new ComboPooledDataSource();//创建对象
this.pool.setDriverClass(driverClass);//设置驱动
this.pool.setJdbcUrl(url); //设置连接的url
this.pool.setUser(userName);//设置数据库用户名
this.pool.setPassword(pass);//设置数据库密码
this.pool.setAcquireIncrement(3);//当连接池中的连接耗尽的时候c3p0一次同时获取的连接数
this.pool.setAutoCommitOnClose(false);//连接关闭时默认将所有未提交的操作回滚
this.pool.setBreakAfterAcquireFailure(false);//获取连接失败后该数据源将申明已断开并永久关闭
this.pool.setCheckoutTimeout(1000);//当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。
this.pool.setIdleConnectionTestPeriod(60);//每60秒检查所有连接池中的空闲连接
this.pool.setInitialPoolSize(10);//初始化时获取10个连接,取值应在minPoolSize与maxPoolSize之间
this.pool.setMaxPoolSize(40);//连接池中保留的最大连接数
this.pool.setMinPoolSize(5);//连接池最小连接数
this.pool.setMaxIdleTime(60);//最大空闲时间,60秒内未使用则连接被丢弃
this.pool.setNumHelperThreads(3);//c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能通过多线程实现多个操作同时被执行
log.info(“数据库连接池初始化成功”);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
/**
* 得到连接
* @return
*/
public Connection getConnection(){
try {
return this.pool.getConnection();
} catch (SQLException e) {
log.info(“获取连接异常”);
e.printStackTrace();
}
return null;
}
/**
* 关闭
*/
public void destroy(){
if(null!=this.pool)this.pool.close();
}
}
以上这个类是初始化连接池!下面DynamicDataSourcePoolFactory类是连接池的工厂
/**
* 该类是连接池的管理类
* @author SkyWen
*
*/
public class DynamicDataSourcePoolFactory {
private static Hashtable<String , DynamicDataSourcePool> hashtable=null;
private static DynamicDataSourcePoolFactory dataSourcePoolFactory;
private DynamicDataSourcePoolFactory(){
}
public static DynamicDataSourcePoolFactory getInstance(){
if(null==dataSourcePoolFactory){
hashtable=new Hashtable<String , DynamicDataSourcePool>();
dataSourcePoolFactory=new DynamicDataSourcePoolFactory();
}
return dataSourcePoolFactory;
}
/**
* 绑定连接池
* @param key 连接池的名称必须唯一
* @param dataSourcePool 对应的连接池
*/
public void bind(String key,DynamicDataSourcePool dataSourcePool){
if(IsBePool(key))getDynamicDataSourcePool(key).destroy();
hashtable.put(key, dataSourcePool);
}
/**
* 重新绑定连接池
* @param key 连接池的名称必须唯一
* @param dataSourcePool 对应的连接池
*/
public void rebind(String key,DynamicDataSourcePool dataSourcePool){
if(IsBePool(key))getDynamicDataSourcePool(key).destroy();
hashtable.put(key, dataSourcePool);
}
/**
* 删除动态数据连接池中名称为key的连接池
* @param key
*/
public void unbind(String key){
if(IsBePool(key))getDynamicDataSourcePool(key).destroy();
hashtable.remove(key);
}
/**
* 查找动态数据连接池中是否存在名称为key的连接池
* @param key
* @return
*/
public boolean IsBePool(String key){
return hashtable.containsKey(key);
}
/**
* 根据key返回key对应的连接池
* @param key
* @return
*/
public DynamicDataSourcePool getDynamicDataSourcePool(String key){
if(!IsBePool(key))return null;
return (DynamicDataSourcePool)hashtable.get(key);
}
}
下面这个类是个测试的类DynamicDataSourcePoolTest!我用的是mysql数据库!其中我只是添加了一个实例!可以自己在添加一个!如果有朋友不懂的话 请给我留言
String localurl=”jdbc:mysql://127.0.0.1:3306/skywen?useUnicode=true&characterEncoding=gbk”;
DynamicDataSourcePool dataSourcePool1=new DynamicDataSourcePool(“aa”,”aa”,localurl,”com.mysql.jdbc.Driver”);
DynamicDataSourcePoolFactory factory=DynamicDataSourcePoolFactory.getInstance();
/*实体类的对象*/
GameServer gameServer=new GameServer();
factory.bind(Key.getKey(gameServer), dataSourcePool1);
/*判读是否存在这个连接池*/
System.out.println(factory.IsBePoolKey.getKey(gameServer));
/*得到连接*/
Connection connection161=factory.getDynamicDataSourcePool(Key.getKey(gameServer)).getConnection();