J2EE社区

苟有恒,何必三更起五更眠;
最无益,只怕一日曝十日寒.
posts - 241, comments - 318, trackbacks - 0, articles - 16

java 连接池 总结 复习

Posted on 2009-08-24 15:23 xcp 阅读(2718) 评论(5)  编辑  收藏 所属分类: JAVA

 

最近几天无聊啊,所以就来看看Java基础,虽然学习java有一段时间了,但是对Java连接池一直很陌生,就对照相关资料,自己写了一个,希望高手指教!!

本例子只有三个文件,下面是其源码

resourceBundle.properties文件

connection.username=sa

connection.password=sa

connection.url=jdbc:sqlserver://localhost:1433;databaseName=collectionpool connection.driverClass=com.microsoft.jdbc.sqlserver.SQLServerDriver

connection.poolSize=20

ResourceManager.java文件

package org.topCSA.connection.db.Resource;

import java.util.ResourceBundle;

publicclass ResourceManager {

    privatestatic ResourceBundle r;

    static{

       r = ResourceBundle.getBundle("resourceBundle");

    }

    publicstatic String getDriverClass(){

       returnr.getString("connection.driverClass");

    }

    publicstatic String getUrl(){

       returnr.getString("connection.url");

    }

    publicstatic String getUsername(){

       returnr.getString("connection.username");

    }

    publicstatic String getPassword(){

       returnr.getString("connection.password");

    }

    publicstaticintgetPoolSize(){

       int poolSize = Integer.valueOf(r.getString("connection.poolSize"));

       return poolSize;

    }

    publicstaticvoid refresh(){

       r = ResourceBundle.getBundle("resourceBundle");

    }

}

DbConnectionPool.java

package org.topCSA.connection.db;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

import org.topCSA.connection.db.Resource.ResourceManager;

publicclass DbConnectionPool {

    private List<Connection> pool;

    privateintpoolSize = 1;

    private Connection conn = null;

    privatestatic DbConnectionPool instance = null;

    /**

     *单粒模式私有构造方法,获得本类的对象,通过getIstance方法。

     */

    private DbConnectionPool() {

       pool = new ArrayList<Connection>();

       this.createConnection();

    }

    /**

     *得到当前连接池的一个实例

     */

    publicstatic DbConnectionPool getInstance() {

       if (instance == null) {

           instance = new DbConnectionPool();

       }

       returninstance;

    }

    /**

     *得到连接池中的一个连接

     */

    publicsynchronized Connection getConnection() {

       if (pool.size() > 0) {

           Connection conn = pool.get(0);

           pool.remove(conn);

           return conn;

       } else {

           returnnull;

       }

    }

    /**

     *创建初始的数据库连接

     */

    privatevoid createConnection() {

       int temp = ResourceManager.getPoolSize();

       if(temp > 0){

           this.poolSize = temp;

       }

       for (int i = 0; i < poolSize; i++) {

           try {

              Class.forName(ResourceManager.getDriverClass());

              conn = DriverManager.getConnection(ResourceManager.getUrl(),ResourceManager.getUsername(),ResourceManager.getPassword());

              pool.add(conn);

           } catch (ClassNotFoundException e) {

              e.printStackTrace();

           } catch (SQLException e) {

              e.printStackTrace();

           }

       }

    }

    /**

     *用完将连接放回到连接池中

     *

     *@paramconn

     */

    publicsynchronizedvoid release(Connection conn) {

       pool.add(conn);

    }

   

    /**

     *关闭连接池中的所有连接

     */

    publicsynchronizedvoid closePool() {

       for (int i = 0; i < pool.size(); i++) {

           try {

              conn = ((Connection) pool.get(i));

              conn.close();

              pool.remove(i);

           } catch (SQLException e) {

              e.printStackTrace();

           }

       }

    }

}








接下来在说一下,现在主流的java开源的连接池:
1.C3P0  :是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。参考网站: http://sourceforge.net/projects/c30/
2.Proxool :是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。  参考网站: http://proxool.sourceforge.net
3.Jakarta DBCP  :是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用。参考网站: http://jakarta.apache.org/commons/dbcp/
4.ctionBroker  :DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用。参考网站:http://jakarta.apache.org/commons/dbcp/
5.DBPool  :是一个高效的易配置的数据库连接池。它除了支持连接池应有的功能之外,还包括了一个对象池使你能够开发一个满足自已需求的数据库连接池。参考网站:http://homepages.nildram.co.uk/~slink/java/DBPool/
6.XAPool :是一个高效的易配置的数据库连接池。它除了支持连接池应有的功能之外,还包括了一个对象池使你能够开发一个满足自已需求的数据库连接池。参考网站:http://xapool.experlog.com/
7.SmartPool  :SmartPool是一个连接池组件,它模仿应用服务器对象池的特性。SmartPool能够解决一些临界问题如连接泄漏(connection leaks),连接阻塞,打开的JDBC对象如Statements,PreparedStatements等. SmartPool的特性包括支持多个pools,自动关闭相关联的JDBC对象, 在所设定time-outs之后察觉连接泄漏,追踪连接使用情况, 强制启用最近最少用到的连接,把SmartPool"包装"成现存的一个pool等。参考网站:http://smartpool.sourceforge.net/
8.MiniConnectionPoolManager  :MiniConnectionPoolManager是一个轻量级JDBC数据库连接池。它只需要Java1.5(或更高)并且没有依赖第三方包。参考网站:http://www.source-code.biz/snippets/java/8.htm


名称: ♪4C.ESL | .↗Evon
口号: 遇到新问题♪先要寻找一个方案乄而不是创造一个方案こ
mail: 联系我


Feedback

# re: java 连接池 总结 复习  回复  更多评论   

2009-08-24 17:12 by 凡客诚品
很好啊

# re: java 连接池 总结 复习  回复  更多评论   

2009-08-25 09:15 by 找个美女做老婆
Java乐园学习网站: http://www.javaly.cn

有大量的学习文章和视频教程,以及一些项目源码

Java乐园学习群: 81107233

# re: java 连接池 总结 复习[未登录]  回复  更多评论   

2009-08-26 23:06 by 菜菜宝宝
我认为不好!看看开源的连接池在使用时跟 JDBC 没有什么区别,采用 con.close() 将连接归还到池中去,而不是用了连接池我们必须用 release(con) 来归还连接。
我们要做到使用和不使用这样东西,对代码来说可以一行不用更改,唯一不同的只是获得连的方式不同,其他的还是完全一样,这样的东西才有价值。
重写 con.close 的方法一般装饰器模式重新包装,或者更为方便地采用动态代理进行拦截之后修改方法的行为。

# re: java 连接池 总结 复习[未登录]  回复  更多评论   

2009-08-26 23:10 by 菜菜宝宝
上面说的只是设计连接池中碰到的问题之一,还能很多复杂的问题,诸如:

如果连接的物理连接断开连接池该采取哪些措施?
如果连接池中的连接状态已经超时了该采取什么处理?
如果连接池中的连接耗尽是让用户一直等呢,还是抛出获取连接超时?

等等诸如此类的问题。要想设计一个在现实当中能使用的连接池并非易事!

# re: java 连接池 总结 复习[未登录]  回复  更多评论   

2009-08-27 13:52 by xcp
@菜菜宝宝
首先,在这谢谢菜菜宝宝指出,上面几点真的还需要认真的考虑,特别是连接状态已经超时,接池中的连接耗尽是让用户一直等呢,还是抛出获取连接超时?等问题。。。。希望我自己有时间看看其它主流的java开源的连接池,看它们是怎么实现的。。。在次谢谢!!!

只有注册用户登录后才能发表评论。


网站导航: