zoukankan      html  css  js  c++  java
  • java Datasource,数据库连接池

    目前有多重方式创建数据库连接池:JNDI,DBCP,C3P0等

    为什么需要连接池:

    使用java API DriverManager.getConnection()创建数据库连接,耗费内存和时间,实时性低;这种方式获取的connection需要手动关闭,不然会耗费大量的内存资源;对于频繁数据库操作,这种方式会造成性能低,尤其web应用

    数据库连接池的功能:

    负责创建、管理和分配数据库连接。初始化数据库连接池时,会创建一定数量的数据库连接对象,并存放于数据库连接池中。当请求连接数据库时,连接池会分配处于空闲状态的连接;数据库连接不被使用时,会被连接池回收,并设置为空闲状态;当连接空闲时间大于在初始化连接池设定的连接空闲时间,连接池释放该连接。

    数据库连接池介绍:

    1、 JNDI

    2、 C3p0

    3、 Apache的Jakarta DBCP

    4、 BoneCP

    其中,sping框架依赖的第三方使用了c3p0和dbcp两种方式;而bonecp号称是速度最快的数据库连接池。JNDI方式创建实现的datasource是真正实现了javax.sql.datasource;其他的三种方式都不是。下面的列表,列出了几种方式的区别和不同:

    序号

    连接池名称

    依赖的jar包

    实现的datasource类

    备注

    1

    JNDI

    该数据源是由相应的web服务器(例如:tomcat,weblogic,websphere)负责初始化,创建,管理。程序中不需要引入特别的jar包。

    Javax.sql.datasource

    2

    C3P0

    c3p0-0.9.xxx.jar

    com.mchange.v2.c3p0.ComboPooledDataSource

    3

    DBCP

    commons-dbcp.jar,commons-pool.jar

    org.apache.commons.dbcp.BasicDataSource

    4

    BoneCP

    bonecp-0.6.5.jar

    · google-collections-1.0.jar

    · slf4j-api-1.5.11.jar

    · slf4j-log4j12-1.5.11.jar

    ·log4j-1.2.15.jar

    BoneCPDataSource

    备注:以上几种方式的数据库连接池的配置参数大同小异,略有差别;其参数的配置,既可以通过配置文件的方式配置,也可以通过硬编码的方式配置。

    1,使用JNDI方式

    这种方式,是由web服务器实现了java.sql.datasource。由web服务器负责初始化数据源,创建connection,分配,管理connection。由于本身是由web服务器实现的功能,因此不需要在项目project中引入特别的jar包,但是需要在服务器的某些配置文件中增加相关的配置。下面,以tomcat服务器为例,讲述这种方式的使用。

        (1)、修改tomcat的conf下的context.xml文件,增加Resource的配置的支持。

        (2)、由于数据源是由tomcat负责创建,所以需要的jdbc驱动应该放到tomcat的lib路径下。

        (3)、编写使用java代码,并放在tomcat环境下使用,如下:

    public void jnditest(){

           // TODO Auto-generated method stub

           try {

               Context initcontext=new InitialContext();

               Context context=(Context) initcontext.lookup("java:comp/env");

              

     

               DataSource datasource=(DataSource)context.lookup("jdbc/editortest");

              

               Connection cn=datasource.getConnection();

              

               Statement st=cn.createStatement();

               String sql="select * from artical where id=1";

               ResultSet rs=st.executeQuery(sql);

               while(rs.next()){

                  System.out.println("1:"+rs.getString(1));

                  System.out.println("2:"+rs.getString(2));

                  System.out.println("3:"+rs.getString(3));

                  System.out.println("4:"+rs.getString(4));    

               }

           } catch (NamingException e) {

               // TODO Auto-generated catch block

               e.printStackTrace();

           } catch (SQLException e) {

               // TODO Auto-generated catch block

               e.printStackTrace();

           }

        }

            (4)、详情参考jndisql。Java文件,以及index.jsp。

    注意:该测试不能在main方法中测试;可以写一个jsp在tomcat环境中测试。因为:java单元的环境是jdk;而jsp的环境却是tomcat;数据连接池是在tomcat中配置的,所以能正常运行的,但java测试的环境只有jdk,所以在引用数据连接池时就时出现找不到环境的错误。

    使用环境:当使用weblogic或者websphere等高级的web服务器的时候,可以考虑使用这种方式提高性能。

    3、 使用C3p0方式

    C3P0是开源的数据库连接组件,支持创建数据库连接池,管理connection等功能。使用该种方式做数据库连接时候,需要导入c3p0-0.9.1.2.jar。

    同时,关于数据库连接的具体参数,例如:url,username,password,最小连接数,最大连接数。。。。。等信息既可以在xml配置文件中配置,也可以通过程序编码方式创建。Spring支持c3p0的数据库连接池方式,因此在spring环境中使用时,支持在applicationcontext.xml文件中配置。另外,由于数据库连接池在整个project中针对某个数据库而言是单例的,所以,即使通过编码的方式创建,那么要保证其单实例特性。如果存在多个,那么必然会导致性能低下。

    下面,列出通过程序编码方式使用c3p0数据库连接池的方式。

    ComboPooledDataSource ds = new ComboPooledDataSource();

           try {

               ds.setDriverClass("com.mysql.jdbc.Driver");

               ds.setJdbcUrl("jdbc:mysql://localhost:3306/editortest");

               ds.setUser("root");

               ds.setPassword("123456");

               ds.setMaxPoolSize(20);

               ds.setInitialPoolSize(10);

               ds.setMaxIdleTime(2000);

               Connection cn=ds.getConnection();

               Statement st=cn.createStatement();

               String sql="select * from artical where id=1";

               ResultSet rs=st.executeQuery(sql);

               while(rs.next()){

                  System.out.println("1:"+rs.getString(1));

                   System.out.println("2:"+rs.getString(2));

                  System.out.println("3:"+rs.getString(3));

                  System.out.println("4:"+rs.getString(4));    

               }

              

           } catch (PropertyVetoException e) {

               // TODO Auto-generated catch block

               e.printStackTrace();

           } catch (SQLException e) {

               // TODO Auto-generated catch block

               e.printStackTrace();

        }

        备注:通常使用方式,都是通过配置文件配置,几乎不会用到这种硬编码方式。在此,只是简单介绍C3P0的使用方式。详情,可以参考c3p0test.java。

    4、 使用dbcp方式

    DBCP方式,是apache提供的数据源连接池方式,支持数据库连接池创建,管理connection等功能。使用环境,需要导入commons-dbcp.jar 和 commons-pool.jar两个jar包。上面提到的JNDI方式,其实质实用的就是dbcp数据源;只是他是通过在web服务器上做配置,由web服务器负责创建该数据源。

    同样的,dbcp数据源也支持xml配置文件和硬编码两种方式。通常使用方式,都是通过配置文件配置,几乎不会使用硬编码方式。下面简单介绍dbcp方式的编码:

    BasicDataSource ds = new BasicDataSource();

           ds.setDriverClassName("com.mysql.jdbc.Driver");

           ds.setUrl("jdbc:mysql://localhost:3306/editortest");

           ds.setUsername("root");

           ds.setPassword("123456");

           ds.setMaxIdle(20);

           ds.setInitialSize(10);

           ds.setMaxActive(2000);

           try {

               Connection cn=ds.getConnection();

               Statement st=cn.createStatement();

               String sql="select * from artical where id=1";

               ResultSet rs=st.executeQuery(sql);

               while(rs.next()){

                  System.out.println("1:"+rs.getString(1));

                  System.out.println("2:"+rs.getString(2));

                  System.out.println("3:"+rs.getString(3));

                  System.out.println("4:"+rs.getString(4));    

               }

           } catch (SQLException e) {

               // TODO Auto-generated catch block

               e.printStackTrace();

        }

    5、 使用BoneCP方式。

    BoneCP是快速高效的数据库连接池组件,据说性能上目前是最好得,比C3P0和DBCP快25倍。使用该组件,需要导入bonecp-0.6.5.jar,google-collections-1.0.jar,slf4j-api-1.5.11.jar,slf4j-log4j12-1.5.11.jar,log4j-1.2.15.jar。

    下面,简单列出编码方式的使用,做简单的了解。

    BoneCPDataSource ds = new BoneCPDataSource();

           ds.setDriverClass("com.mysql.jdbc.Driver");

           ds.setJdbcUrl("jdbc:mysql://localhost:3306/editortest");

           ds.setUsername("root");

           ds.setPassword("123456");

          

           try {

               Connection cn = ds.getConnection();

               Statement st = cn.createStatement();

               String sql = "select * from artical where id=1";

               ResultSet rs = st.executeQuery(sql);

               while (rs.next()) {

                  System.out.println("1:" + rs.getString(1));

                  System.out.println("2:" + rs.getString(2));

                   System.out.println("3:" + rs.getString(3));

                  System.out.println("4:" + rs.getString(4));

               }

           } catch (SQLException e) {

               // TODO Auto-generated catch block

               e.printStackTrace();

        }

    总结:以上,介绍了几种常用的数据源连接池;这几种连接池在使用过程,即支持硬编码的方式,也支持配置文件的配置方式;在正式实用的时候,应该尽量使用配置的方式,便于维护和管理。硬编码的方式,可以做为测试使用。同时,spring框架,通过他自己的方式集成上述几种数据源,理论上来说,都支持。各个数据源连接池都有一些公有的属性,因为他们都是从javax.sql.datasource继承而来,而且都有最大连接数,初始化连接数等概念。同时,他们又分别有各自不同的属性,做了扩展。这里只是简单的介绍,在实际使用中,想要实现高性能的数据库连接池管理,还需要深入研究每种方式的连接属性配置;例如:根据实际需要,设置合适的最小连接数和最大连接数,等待时间等。

    注:数据库连接池要保证连接池的单例

  • 相关阅读:
    codevs 2602 最短路径问题x
    codevs 1077 多源最短路x
    2010TianjinRegional 部分题解
    [CF706D]Vasiliy's Multiset(异或字典树)
    [CF710E]Generate a String(DP)
    [CF710C]Magic Odd Square(构造)
    [CF151B]Phone Numbers(暴力,模拟)
    [POJ2104]K-th Number(主席树,静态区间k小)
    [CF707D]Persistent Bookcase(离线,DFS)
    [CF707C]Pythagorean Triples(数学)
  • 原文地址:https://www.cnblogs.com/lh-V/p/4064393.html
Copyright © 2011-2022 走看看