`
高级java工程师
  • 浏览: 410819 次
  • 性别: 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.lang.reflect.Proxy`类和`java.lang.reflect....

    day18 15.自定义连接池

    今天我们将探讨的是"自定义连接池"这一主题,这涉及到对数据库连接管理的深入理解和源码级别的实现。 在Java开发中,常见的连接池工具有C3P0、DBCP、HikariCP以及Apache的D殷库连接池(Druid)。这些连接池已经足够...

    自定义连接池案例

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

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

    自定义连接池可以帮助我们更好地控制连接的生命周期,定制化配置,比如最大连接数、最小连接数、超时时间等。通过连接池,程序可以复用已建立的数据库连接,提高系统效率,减少资源消耗。 单例模式是一种设计模式,...

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

    然而,自定义连接池往往需要处理很多细节问题,如线程安全、连接超时、公平性策略等,对于新手来说具有一定的挑战性。因此,实践中更常见的是使用成熟的开源连接池实现,如以下几种: 1. C3P0:这是一个开源的JDBC...

    自定义的数据库连接池

    自定义连接池需要考虑如何实现这些功能,例如使用`java.sql.Connection`接口和`java.sql.DataSource`接口来管理数据库连接。 8. **资源分配策略**:连接池需要有一套智能的分配策略,如基于优先级、公平性或轮询的...

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

    实现自定义连接池的关键步骤如下: 1. **初始化连接池**:定义连接池的最大连接数、初始连接数等参数,并根据这些参数创建初始的连接。 2. **提供获取连接的方法**:实现一个方法,用于线程获取连接。如果连接池中...

    JDBC自定义连接池过程详解

    JDBC自定义连接池过程详解 JDBC自定义连接池过程详解是Java数据库连接池技术的核心内容之一。本文将详细介绍JDBC自定义连接池过程详解的原理、实现和应用。 一、概述 在Java数据库编程中,获得连接和释放资源是...

    数据库连接池案例包括c3p0,druid,和自己手写的连接池

    本案例将介绍三种常见的数据库连接池实现:C3P0、Druid以及自定义连接池的实现。 首先,C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0的主要特性包括连接测试、...

    自己实现的ActiveMQ连接池和新版本ActiveMQ自带的连接池,封装好的工具类,可直接使用

    此外,自定义连接池还需要考虑线程安全、连接超时、最大连接数限制等关键问题。这样的工具类通常包含初始化连接池、获取连接、释放连接以及关闭连接池等方法。 其次,新版本ActiveMQ自带的连接池服务,也称为...

    Unidac连接池

    Unidac提供了API和事件,允许自定义连接池的行为,以适应不同场景的需求。 此外,Unidac还支持多线程环境下的连接池管理,确保在并发环境中每个线程都能安全地获取和释放连接。这通过内部的锁机制和线程同步来实现...

    jsp连接数据库连接池代码示例

    总结一下,本示例展示了如何在JSP中使用自定义连接池类(如"ConnectionPool.java")进行数据库连接,以及如何在"verifylogin.jsp"和"Login1.jsp"中调用连接池执行数据库操作。理解并正确使用数据库连接池是提高Web...

    数据库连接池java代码实现

    数据库连接池在Java中的实现是...通过自定义连接池,我们可以控制连接的生命周期,优化资源使用,从而提高应用的性能和稳定性。在实际项目中,结合已有的成熟连接池框架,我们可以构建更加高效和可靠的数据库访问层。

    JDBC连接池&DBUtils1

    自定义连接池是指通过实现 javax.sql.DataSource 接口来创建一个连接池。这个接口提供了获取连接的方法,例如 getConnection()。在自定义连接池中,可以使用 List 集合来存储多个连接对象。在程序开始时,可以初始化...

    一个比较好手写连接池

    这种自定义连接池对于小型项目来说,可能是一个轻量级且有效的解决方案。 数据库连接池的基本原理是预先创建并维护一定数量的数据库连接,应用程序在需要时可以从池中获取连接,用完后归还而不是直接关闭,从而避免...

    java写的数据库连接池

    通过自定义连接池,开发者可以更直观地理解连接池的工作原理,这对深入学习数据库编程和系统优化具有积极的意义。对于初学者而言,这是一个很好的实践项目,可以帮助他们巩固基础,为未来处理更复杂的数据库应用场景...

    数据库连接池和DBUtils使用1

    自定义连接池的核心在于设计一个容器(通常为集合)来存储Connection对象。例如,在提供的代码示例中,使用了LinkedList来存储连接。连接池的初始化会预先创建一定数量的连接并存入列表,当需要执行数据库操作时,...

Global site tag (gtag.js) - Google Analytics