`
高级java工程师
  • 浏览: 397537 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自定义连接池

阅读更多
最近自己写了一个数据库连接池,本来想用dpcp、c3p0数据库连接池,但是产品用的是oracle的数据仓库,给的驱动是jdbc驱动,但不是数据库连接驱动,不用以上连接池,自己写了一个,请大家看一下有问题没?
public class ConnectionPool implements ConPool{

/**
* 数据库连接池配置参数
*/
private ConConfig conConfig;

/**
* 数据库连接池
*/
private Stack<Connection> poolStack;

/**
* 活动连接数
*/
private int numActive = 0;

/**
* 数据库连接闲置数
*/
private int numIdle = 0;

public ConnectionPool(ConConfig conConfig){
this.conConfig = conConfig;
poolStack = new Stack<Connection>();
addConnection(conConfig.getInitConSize());
}


/**
* 数据库连接池添加连接
* @param count
*/
protected synchronized void addConnection(int count){
for (int i = 0; i < count; i++) {
Connection con;
try {
con = createConnection();
poolStack.push(con);
} catch (Exception e) {
e.printStackTrace();
}
}
}

/**
* 创建连接Connection
* @param conConfig
* @return
* @throws Exception
*/
protected Connection createConnection() throws Exception{
String driver = conConfig.getConDriver();
    String url = conConfig.getConUrl();
    String userName = conConfig.getUserName();
    String passWord = conConfig.getPassWord();
        Class.forName(driver).newInstance();  
        Connection conn = DriverManager.getConnection(url, userName, passWord);     
        
        return conn;  
}

/**
* 从数据库连接池中获取连接
*/
public synchronized Connection borrowConnection() throws Exception{
Connection con = null;
while(con == null){
if(!poolStack.isEmpty()){
con = poolStack.pop();
}else{
con = findConnection();
}
}
numActive++;
return con;
}

/**
* 获取可用连接
* @return
* @throws Exception
*/
public synchronized Connection findConnection() throws Exception{
Connection con = null;
if(poolStack.size() < conConfig.getMaxConSize()){
con = createConnection();
}else{
waitTime(conConfig.getMaxWaitTime());
if(poolStack.isEmpty())
throw new IllegalStateException("等待连接超时");
else
con = poolStack.pop();
if(con.isClosed())
throw new IllegalStateException("获取的连接已经关闭");
}

return con;
}

/**
* 关闭连接
*/
public void closeConnection(Connection con) {
try {
if(!con.isClosed()){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}

}

/**
* 销毁连接
* @param con
*/
public synchronized void destroyedCon(Connection con){
closeConnection(con);
con = null;
}

/**
     * 清空连接池
     */
    public synchronized void clear() {
    Iterator it = poolStack.iterator();
         while(it.hasNext()) {
             try {
            Connection con =(Connection)it.next();
            destroyedCon(con);
             } catch(Exception e) {
             }
         }
         poolStack.clear();
    }

    /**
     * 将连接返回到连接池中
     */
public void returnConnection(Connection con) throws Exception{
boolean isClose = con.isClosed();
if(isClose){
destroyedCon(con);
return;
}

if(conConfig.getMaxConSize() <= poolStack.size()){
Connection bicon =poolStack.remove(0);
destroyedCon(bicon);
}else{
poolStack.push(con);
numActive--;
}


}

/**
* 超时等待时间
* @param time
*/
protected void waitTime(long time){
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public ConConfig getConConfig() {
return conConfig;
}

public void setConConfig(ConConfig conConfig) {
this.conConfig = conConfig;
}

public Stack<Connection> getPoolStack() {
return poolStack;
}

public void setPoolStack(Stack<Connection> poolStack) {
this.poolStack = poolStack;
}

public int getNumActive() {
return numActive;
}

public void setNumActive(int numActive) {
this.numActive = numActive;
}

public int getNumIdle() {
return poolStack.size();
}

public void setNumIdle(int numIdle) {
this.numIdle = numIdle;
}

}


public class ConConfig {

public String conDriver;

public String conUrl;

public String userName;

public String passWord;

public int minConSize;

public int maxConSize;

public int acquireIncrement;

public int initConSize;

public int maxWaitTime;

public String getConDriver() {
return conDriver;
}

public void setConDriver(String conDriver) {
this.conDriver = conDriver;
}

public String getConUrl() {
return conUrl;
}

public void setConUrl(String conUrl) {
this.conUrl = conUrl;
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public String getPassWord() {
return passWord;
}

public void setPassWord(String passWord) {
this.passWord = passWord;
}

public int getMinConSize() {
return minConSize;
}

public void setMinConSize(int minConSize) {
this.minConSize = minConSize;
}

public int getMaxConSize() {
return maxConSize;
}

public void setMaxConSize(int maxConSize) {
this.maxConSize = maxConSize;
}

public int getAcquireIncrement() {
return acquireIncrement;
}

public void setAcquireIncrement(int acquireIncrement) {
this.acquireIncrement = acquireIncrement;
}

public int getInitConSize() {
return initConSize;
}

public void setInitConSize(int initConSize) {
this.initConSize = initConSize;
}

public int getMaxWaitTime() {
return maxWaitTime;
}

public void setMaxWaitTime(int maxWaitTime) {
this.maxWaitTime = maxWaitTime;
}


}

public class ConPoolFactory {

private static ConnectionPool conPool = null;

private static boolean flag = false;

private static ConConfig  config = null;

static{
if(!flag){
   config = new ConConfig();
   config.userName = SSConfig.getInstance().getProperty("biee.conUser"); //用户名
           config.passWord = SSConfig.getInstance().getProperty("biee.conPwd"); //密码  
           config.conDriver= SSConfig.getInstance().getProperty("biee.conDriver");//连接驱动
           config.conUrl= SSConfig.getInstance().getProperty("biee.conUrl");//连接URL
           config.initConSize = Integer.valueOf(SSConfig.getInstance().getProperty("biee.initialSize")); //初始化连接数
           config.acquireIncrement = Integer.valueOf(SSConfig.getInstance().getProperty("biee.acquireIncrement")); //初始化连接递增数
   config.maxConSize = Integer.valueOf(SSConfig.getInstance().getProperty("biee.maxConSize")); //最大激活连接数
           config.minConSize = Integer.valueOf(SSConfig.getInstance().getProperty("biee.minConSize")); //最小连接数,就这个有用.  
           config.maxWaitTime= Integer.valueOf(SSConfig.getInstance().getProperty("biee.maxWait"));//获得连接的最大等待毫秒数
           conPool = new ConnectionPool(config);
   flag = true;
}

}

public ConnectionPool getInstancePool(){
if(conPool == null){
conPool = new ConnectionPool(config);
}

return conPool;
}

}
分享到:
评论

相关推荐

    Java自定义连接池类

    Java自定义连接池类,可以用,有详尽介绍,本人进行过测试

    创建自定义连接池实例

    简单的利用java装饰模式自定义实现了连接池简单实例。

    自定义连接池案例

    自己写的连接池如果想知道连接池是怎么实现的就动手下载吧!

    Java自定义连接池,单例模式

    Java自定义连接池,单例模式,通用的BaseDao,可快速访问数据库

    java动态代理实现自定义连接池

    1.主要理解动态代理的设计思想 2.理解连接池的设计思想以及优点

    自定义的数据库连接池

    适合jsp的一个自定义连接池,用连接池提高存取效率

    day18 15.自定义连接池

    NULL 博文链接:https://364232252.iteye.com/blog/2368454

    JDBC自定义连接池过程详解

    主要介绍了JDBC自定义连接池过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    自定义JDBC连接池及常用连接池介绍

    NULL 博文链接:https://coolxing.iteye.com/blog/1258983

    手动设计自定义数据库连接池

    手动设计自定义数据库连接池,连接池自己总结下来就是用来管理操作数据库管道(数据库管道拥有数据库的引用,可以指向mysql,也可以执行其他db)的集合。 使用连接池,允许其他线程使用闲置连接来执行有用的任务。...

    这是一个可以自定义参数的使用Ssh2连接远程服务器的连接池

    这是一个可以自定义参数的使用Ssh2连接远程服务器的连接池,比如目标服务器地址、名称和密码;自定义连接池参;还提供了两个工具类,来向目标服务器的指定路径下上传文件或下载文件

    rabbitmq连接池

    自定义连接池大小及最大处理channel数 消费者底层断线自动重连 底层使用轮循方式复用tcp 生产者每个tcp对应一个channel,防止channel写入阻塞造成内存使用过量 支持rabbitmq exchangeType 默认交换机、队列、消息都会...

    WEB10-JDBC.rar源代码

    JDBC连接池&DBUtils。...【自定义连接池】(了解) * SUN公司提供了一个连接池的接口.(javax.sql.DataSource). * 定义一个连接池:实现这个接口. * 使用List集合存放多个连接的对象. QueryRunner之查询

    minio-pool:Minio连接池

    迷你泳池 Minio连接池

    详谈Jedis连接池的使用

    下面小编就为大家带来一篇详谈Jedis连接池的使用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    EsClientPoolFactory.java(es连接池工厂类)

    使用过Elasticsearch RestFul API的都知道,在Java端使用是ES服务需要创建Java Client,但是每一次连接都实例化一个client,对系统的消耗很大,而且最令人头疼的是它的连接非常慢。所以为了解决上述问题并提高client...

    自定义高并发jdbc连接池

    自定义的JDBC连接池,支持并发访问,可维持多个数据库的连接池

    数据库连接池和DBUtils使用1

    第一章 自定义连接池使用JDBC操作数据库,需要建立Connection,使用传统的JDBC操作需要每次创建Connection,创建Connection是一个

    golang-rabbitmq连接池及channel复用 rabbbitmq集群

    自定义连接池大小及最大处理channel数。消费者底层断线自动重连。生产者底层断线自动重连 v1.0.12。底层使用轮循方式复用tcp。生产者每个tcp对应一个channel,防止channel写入阻塞造成内存使用过量。支持rabbitmq ...

Global site tag (gtag.js) - Google Analytics