zoukankan      html  css  js  c++  java
  • 三种数据库连接池的配置及使用(For JDBC)

    DBCP

    一、导包

    Apache官网下载DBCP包,导入两个包路径如下:

    commons-dbcp-1.4-bincommons-dbcp-1.4commons-dbcp-1.4.jar:连接池的实现

    commons-pool-1.5.6-bincommons-pool-1.5.6commons-pool-1.5.6.jar:连接池实现的依赖库 

    CSDN上jar包的下载地址:http://download.csdn.NET/detail/u012802702/9491642

    二、代码示例:

    方式一:使用BasicDataSource 通过方法设置连接参数。

    //获取BasicDataSource并配置,开始....
            BasicDataSource source = new BasicDataSource();
        source.setDriverClassName("com.mysql.jdbc.Driver");
        source.setUrl("jdbc:mysql:///dbcptest");
        source.setUsername("root");
        source.setPassword("root");
    //获取BasicDataSource并配置,结束......
        try {
                conn = source.getConnection();
                ps = conn.prepareStatement("select * from account");
                rs = ps.executeQuery();
                while (rs.next()) {
                    String name = rs.getString("name");
                    System.out.println(name);
                } 
         } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (rs != null) {
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    } finally {
                        rs = null;
                    }
                }
                if (ps != null) {
                    try {
                        ps.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    } finally {
                        ps = null;
                    }
                }
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    } finally {
                        conn = null;
                    }
                }
            }

    其中的Close方法是被改写过得,及不会真正的将连接关闭,而是将其放回到连接池中,对于所有的数据源一般都会改写此方法(使用修饰)。

    方式二:使用BasicDataSourceFactory +配置文件

     try {               //获取并配置DataSource开始
                Properties prop = new Properties();
                prop.load(new FileReader("dbcp.properties"));
                BasicDataSourceFactory factory = new BasicDataSourceFactory();
                DataSource source = factory.createDataSource(prop);
            //获取并配置DataSource,结束
                conn = source.getConnection();
                ps = conn.prepareStatement("select * from account");
                rs = ps.executeQuery();
                while (rs.next()) {
                    String name = rs.getString("name");
                    System.out.println(name);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (rs != null) {
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    } finally {
                        rs = null;
                    }
                }
                if (ps != null) {
                    try {
                        ps.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    } finally {
                        ps = null;
                    }
                }
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    } finally {
                        conn = null;
                    }
                }
            }

    配置文件dbcp.properties(注配置文件中的参数的名称固定): 

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql:///dbcptest
    user=root
    password=root

    另:配置文件中除了可以配置以上4个数据库连接的必须信息外,还可以配置其他的参数,官方较完整的配置文件的参考如下:

    #连接设置
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/jdbc
    username=root
    password=
     
    #<!-- 初始化创建的连接数,当不够时再去创建 -->
    initialSize=10
     
    #最大连接数量,连接数连不能超过该值
    maxActive=50
     
    #<!-- 最大空闲连接,当空闲连接超过该值时就挨个关闭多余的连接,但不能小于minldle -->
    maxIdle=20
     
    #<!-- 最小空闲连接,空闲连接的最下值 -->
    minIdle=5
     
    #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒,当连接超过该时间便认为其实空闲连接 -->
    maxWait=60000
     
     
    #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
    #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
    connectionProperties=useUnicode=true;characterEncoding=gbk
     
    #指定由连接池所创建的连接的自动提交(auto-commit)状态。
    defaultAutoCommit=true
     
    #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
    #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
    defaultTransactionIsolation=READ_UNCOMMITTED

    C3P0

    一、导包

    下载C3p0数据源的jar包导入如下jar包:

    Libc3p0-0.9.1.2.jar

    CDSN的下载地址:http://download.csdn.Net/detail/u012802702/9491641

    二、示例

    方式一:使用代码配置参数

    try{
                ComboPooledDataSource source = new ComboPooledDataSource();
                source.setDriverClass("com.mysql.jdbc.Driver");
                source.setJdbcUrl("jdbc:mysql:///day11");
                source.setUser("root");
                source.setPassword("root");
                
                conn = source.getConnection();
                ps = conn.prepareStatement("select * from account");
                rs = ps.executeQuery();
                while(rs.next()){
                    String name = rs.getString("name");
                    System.out.println(name);
                }
            }catch (Exception e) {
                e.printStackTrace();
            }finally{
                if(rs!=null){
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }finally{
                        rs = null;
                    }
                }
                if(ps!=null){
                    try {
                        ps.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }finally{
                        ps = null;
                    }
                }
                if(conn!=null){
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }finally{
                        conn = null;
                    }
                }
            }
        }

    方式二:配置文件的方式加载数据库驱动信息 

    C3p0的使用较为简单,通常来说只要在src目录下添加一个c3p0的配置文件,在程序中使用一句代码

    1)ComboPooledDataSource source = new ComboPooledDataSource()使用配置文件中的默认配置<default-config>,或者

    2)ComboPooledDataSource source = new ComboPooledDataSource(“配置文件中name-config的名称”)使用配置文件中的其他配置

    默认情况下C3p0会在类加载路径下搜索名称为c3p0-config.xml的配置文件,因此该配置文件应该方式在类加载目录、或者jar加载目录、或者WEB-INF/classes、或类似目录下。

    c3p0-config.xml文件配置如下:

    <?xml version="1.0" encoding="utf-8"?>
    <c3p0-config>
      <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///c3p0test</property>
        <property name="user">root</property>
        <property name="password">root</property>
      </default-config>
      <named-config name="mysql2"> 
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///c3p0test1</property>
        <property name="user">root</property>
        <property name="password">root</property>
      </named-config>
    </c3p0-config>
        

    当然在配置文件中可以配置数据库连接池的其他相关信息,官方建议的基本配置参数有:

    acquireIncrement:声明当连接池中连接耗尽时再一次新生成多少个连接,默认为3个

    initialPoolSize:当连接池启动时,初始化连接的个数,必须在minPoolSize~maxPoolSize之间,默认为3

    minPoolSize:任何时间连接池中保存的最小连接数,默认3

    maxPoolSize:在任何时间连接池中所能拥有的最大连接数,默认15

    maxIdleTime:超过多长时间连接自动销毁,默认为0,即永远不会自动销毁

     代码如下:

    import java.sql.Connection;
    import java.sql.SQLException;
    
    import javax.sql.DataSource;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class JDBCUtils {
    
        private static DataSource dataSource = null;
        
        static{
            dataSource = new ComboPooledDataSource("javawebapp");
        }
        
        public static Connection getConnection(){  
            try {
                return dataSource.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new DBException("");
            }
        }
     
        public static void release(Connection connection) {
            try {
                if(connection != null){
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
                throw new DBException("");
            }
        }
        
    }

    C03p0的官方参考模板如下:

    <c3p0-config>
      <default-config>
        <property name="automaticTestTable">con_test</property>
        <property name="checkoutTimeout">30000</property>
        <property name="idleConnectionTestPeriod">30</property>
    <property name="initialPoolSize">10</property>
    超过多长时间连接自动销毁,默认为0,即永远不会自动销毁
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
        <property name="maxStatements">200</property>
    
        <user-overrides user="test-user">
          <property name="maxPoolSize">10</property>
          <property name="minPoolSize">1</property>
          <property name="maxStatements">0</property>
        </user-overrides>
    
      </default-config>
    
      <!-- This app is massive! -->
      <named-config name="intergalactoApp"> 
    声明当连接池中连接耗尽时再一次新生成多少个连接,默认为3个
    <property name="acquireIncrement">50</property>
    当连接池启动时,初始化连接的个数,必须在minPoolSize~maxPoolSize之间,默认为3
    <property name="initialPoolSize">100</property>
    任何时间连接池中保存的最小连接数,默认3
    <property name="minPoolSize">50</property>
    在任何时间连接池中所能拥有的最大连接数,默认15
        <property name="maxPoolSize">1000</property>
    
        <!-- intergalactoApp adopts a different approach to configuring statement caching -->
        <property name="maxStatements">0</property> 
        <property name="maxStatementsPerConnection">5</property>
    
        <!-- he's important, but there's only one of him -->
        <user-overrides user="master-of-the-universe"> 
          <property name="acquireIncrement">1</property>
          <property name="initialPoolSize">1</property>
          <property name="minPoolSize">1</property>
          <property name="maxPoolSize">5</property>
          <property name="maxStatementsPerConnection">50</property>
        </user-overrides>
      </named-config>
    </c3p0-config>

    Tomcat内置数据源(DBCP) 

    Tomcat中内置有数据源,而DBCP与tomcat同属于Apache的项目,因此不难知道tomcat中内置的数据源其实就是DBCP数据源。使用Tomcat的内置数据源可分为两步:

    一:为tomcat配置数据源

    通常情况下,在使用eclipse或Myeclipse开发时,自己习惯于使用如下方式为tomcat配置数据源:

    在web应用的META-INF文件夹下创建一个context.xml配置文件,并在其中添加<Context>标签进行配置,但,这种方式生成的数据源只能用于当前web应用.

    详细context.xml文件的参考代码如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <Context>
    <Resource name="jdbc/EmployeeDB" 当前创建数据连接池的名字,自己定义,在使用jndi容器获取该数据源对象时会用到
                auth="Container" 作者
                type="javax.sql.DataSource" 对象类型这里固定为DataSource即可
                username="dbusername" 数据库连接的用户名
                password="dbpassword" 连接密码
                driverClassName="com.mysql.jdbc.Driver" 驱动
                url="jdbc:mysql:///dbcptest" 数据库的url
                maxActive="8"  DBCP的参数,DBCP的其他参数可以加入
                maxIdle="4"/>
    </Context>

    在tomcat启动时,会逐个加载其中的web应用,当其加载到当前应用时,会加载到META-INF文件夹下该context.xml配置文件,此时tomcat会根据其中的配置信息为当前web应用创建一个数据库连接池,注该数据库连接池只能用于当前web应用,tomcat下的其他web应用无法使用该数据库连接池。至于如何配置tomcat的数据库连接池才能使当前tomcat下的所有web应用都能使用,或者可以使当前虚拟主机下的web应用都能使用?请参考其他文章:http://blog.csdn.net/u012802702/article/details/51159547。 

    二、程序中获取数据源

    当tomcat读取到context.xml配置文件时会为当前web应用创建数据源,但我们在当前web应用中如何获取该数据源对象?

    Tomcat中有一个共有的容器:jndi,当Tomcat为web应用创建数据源之后会将数据源以键值对的形式存放到jndi容器当中,其中键名就是数据源配置时给定的名字(详见context.xml配置文件)。

    而Tomcat会自动将jndi容器放到初始化容器InitalContext中。且jndi以固定的名字(Java:comp/env)存储在InitalContext容器中,因此在web应用中可以通过如下步骤首先获取到数据源实例。

    第一步:首先在Servlet中获取InitalContext容器实例

    Context initCtx = new InitialContext();

    第二步:在InitalContext容器中根据字符串java:comp/env搜寻,以及获取jndi容器实例

    Context jndi = (Context) initCtx.lookup("java:comp/env");

    第三部:根据数据源的名字从jndi容器获取到数据源实例。

    DataSource source = jndi.lookUp("mySource");

    完整参考代码如下:

    Context initCtx = new InitialContext();
    Context jndi = (Context) initCtx.lookup("java:comp/env");
    DataSource source = jndi.lookUp("mySource");

    但到此获取到数据源对象还没有结束,因为获取jndi的代码只能在Servlet中执行,即以上代码只能在Servlet中执行,因此还应创建一个Servlet类并在其init方法中加入以上代码,之后便可以将数据源对象传给其他程序使用(可以将数据源对象设为类变量、或将其放入到ServletContext作用域中等等)。同时将该Servlet配置成为tomcat启动时执行(即在web.xml配置文件中对应的该Servlet标签下添加:<load-on-startup>1</load-on-startup>)。

    参考代码如下:

    @Override
        public void init() throws ServletException {
            try{
                Context initCtx = new InitialContext();
                Context jndi = (Context) initCtx.lookup("java:comp/env");
                DataSource source = (DataSource) jndi.lookup("mySource");
                this.getServletContext().setAttribute(“dataSource”,source);
            }catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
  • 相关阅读:
    自定义分页二
    CheckBox实现跨页面多选
    正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。
    DropDownList下拉框多选
    通用查询
    AutoCAD自动加载DLL文件的方法
    软件开发(团队管理)
    正确地做事与做正确的事
    C#.NET实现邮件的发送
    多附件的上传
  • 原文地址:https://www.cnblogs.com/zhaoyan001/p/6362170.html
Copyright © 2011-2022 走看看