zoukankan      html  css  js  c++  java
  • 【Java】java数据库连接中C3P、DBCP、Druid连接池的使用

    使用JDBC的步骤:
    1.加载数据库驱动
    2.通过DriverManager获得数据库连接
    3.通过Connection获得Statement对象
    4.使用Statement执行SQL语句。
    5.操作结果集合
    6.释放数据库连接
    可以通过谐音来记忆“贾(加载驱动)莲(获取连接)预(获得预编译语句)执(执行Sql语句)事(释放资源)”。

    数据库连接的建立及关闭是及耗费系统资源的操作,在多层结构的应用环境中,这种资源的耗费对系统性能影响尤为明显。
    通过DriverManager获得数据库连接的方式,一个数据库连接对象对应一个物理数据库连接,每次操作都打开一个物理连接,使用完后立即关闭连接。频繁地打开、关闭连接将造成系统性能低下。

    数据库连接池的解决方案是,当应用程序启动时候,系统建立足够多的数据库连接,并将这些连接组成一个连接池。每次应用程序请求数据库连接时,无需重新打开连接,而是从连接池中取出已有的连接使用,使用完后不再关闭数据库连接,而是直接将连接归还给连接池,通过使用连接池将大大提高程序的运行效率。

    对于资源共享的情况,有一个通用的设计模式:资源池(Resource Pool),用于解决资源频繁请求释放资源的压力。 JDBC 2.0规范引入了数据库连接池技术。JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由商用服务器(WebLogic,WebSphere)等提供实现,也有一些开源组织提供实现(如JDBC和C3P0等)。DataSource通常被称为数据源,它包含了连接池和连接池管理两个部分,但习惯上已经常把DataSource称为连接池。

    1.DBCP数据源

    DBCP是Apache软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源系统common-pool。如果需要使用该连接池实现,则应该在系统中增加如下两个jar文件:
    commons-dbcp.jar:连接池的实现
    commons-pool.jar:连接池实现的依赖库
    登录http://commons.apache.org站点既可下载commons-pool.zip和commons-dbcp.zip两个压缩软件。Tomcat的连接池正是采用这种连接池实现的。数据库连接池既可以与应用服务器整合使用,也可以由程序独立使用。

            //创建数据库对象
            BasicDataSource ds=new BasicDataSource();
            //设置数据库的驱动
            ds.setDriverClassName("com.mysql.jdbc.Driver");
            //设置数据库的地址
            ds.setUrl("jdbc:mysql://localhost:3306/javaee");
            //设置连接数据库的用户名
            ds.setUsername("root");
            //设置连接数据库的密码
            ds.setPassword("1234");
            //设置连接池的初始连接数
            ds.setInitialSize(6);
            //设置连接池最多有多少连接数
            ds.setMaxActive(20);
            //设置连接池中最少有两个连接
            ds.setMinIdle(2);

    连接源设置成功后,就可以通过如下的代码获得数据库连接:

    Connection conn=ds.getConnection();

    释放资源

    conn.close();

    但上面的这行代码并未真正的关闭数据库的物理连接,它仅仅是把数据库连接释放,归还给连接池,让其他客户端可以使用该连接。

    2.C3P0数据源

    和dbcp相比,C3P0的性能更胜一筹,Hibernate就推荐使用该连接池。C3P0连接池不仅可以自动清理不再使用的Connection,还可以自动清理Statement和ResultSet。C3P0连接池需要版本1.3以上的JRE,推荐使用1.4版本以上的JRE。
    如果需要使用C3P0数据源,应该添加如下两个JRE文件:
    c3p0-0.9.1.2.jar: C3P0连接池的实现
    可以的登录http://sourceforge.net/projects/c3p0/站点既可下载C3P0数据源的最新版本。

            //创建连接池实例
            ComboPooledDataSource ds=new ComboPooledDataSource();
            //设置数据库的驱动
            ds.setDriverClass("com.mysql.jdbc.Driver");
            //设置数据库的地址
            ds.setJdbcUrl("jdbc:mysql://localhost:3306/javaee");
            //设置连接数据库的用户名
            ds.setUser("root");
            //设置连接数据库的密码
            ds.setPassword("1234");
            //设置连接池的初始连接数
            ds.setInitialPoolSize(6);
            //设置连接池最多有多少连接数
            ds.setMaxPoolSize(40);
            //设置连接池中最少连接数
            ds.setMinPoolSize(2);
            //设置连接池缓存Statement的最大数
            ds.setMaxStatements(180);


    设置完成后,可以通过下面的代码获得Connection连接

    Connection conn= ds.getConnection();

     3.Druid连接池的使用

    Druid作为一名后起之秀,凭借其出色的性能,也逐渐印入了大家的眼帘。接下来本教程就说一下druid的简单使用。

    首先从 http://repo1.maven.org/maven2/com/alibaba/druid/ 下载最新的jar包。如果想使用最新的源码编译,可以从 https://github.com/alibaba/druid 下载源码,然后使用maven命令行,或者导入到eclipse中进行编译。

    和dbcp类似,druid的配置项如下

    配置 缺省值 说明
    name  

    配置这个属性的意义在于,如果存在多个数据源,监控的时候

    可以通过名字来区分开来。如果没有配置,将会生成一个名字,

    格式是:"DataSource-" + System.identityHashCode(this)

    jdbcUrl  

    连接数据库的url,不同数据库不一样。例如:

    mysql : jdbc:mysql://10.20.153.104:3306/Test

    oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto

    username   连接数据库的用户名
    password  

    连接数据库的密码

    如果要使用ConfigFilter(读取配置文件、数据库加密),

    可以查看这篇文章:使用ConfigFilter

    driverClassName 根据url自动识别 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
    initialSize 0 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
    maxActive 8 最大连接池数量
    maxIdle 8 已经不再使用,配置了也没效果
    minIdle   最小连接池数量
    maxWait false 是否缓存preparedStatement,也就是PSCache。
    PSCache对支持游标的数据库性能提升巨大,比如说oracle。
    在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。
    作者在5.5版本中使用PSCache,通过监控界面发现PSCache有缓存命中率记录,该应该是支持PSCache。
    maxOpenPreparedStatements   用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn,testWhileIdle都不会其作用。
    testOnBorrow true 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
    testOnReturn false 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
    testWhileIdle false 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis, 执行validationQuery检测连接是否有效。
    timeBetweenEvictionRunsMillis   有两个含义: 
    1) Destroy线程会检测连接的间隔时间 
    2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
    numTestsPerEvictionRun   不再使用,一个DruidDataSource只支持一个EvictionRun
    minEvictableIdleTimeMillis    
    connectionInitSqls   物理连接初始化的时候执行的sql
    exceptionSorter 根据dbType自动识别 当数据库抛出一些不可恢复的异常时,抛弃连接
    filters   属性类型是字符串,通过别名的方式配置扩展插件, 常用的插件有: 
    监控统计用的filter:stat  
    日志用的filter:log4j 
    防御sql注入的filter:wall
    proxyFilters   类型是List<com.alibaba.druid.filter.Filter>, 
    如果同时配置了filters和proxyFilters, 
    是组合关系,并非替换关系

    将下载好的druid.jar包导入项目中,或是使用Maven工具管理。

    Application.xml 文件

    复制代码
        <bean name="transactionManager" class ="org.springframework.jdbc.datasource.DataSourceTransactionManager" >     
            <property name="dataSource" ref ="dataSource"></property >  
         </bean>
    
        <!-- 获取properties配置文件 -->
        <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <list>
                    <value>classpath:db-config.properties</value>
                </list>
            </property>
        </bean>
    
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">    
           <!-- 数据库基本信息配置 -->  
           <property name = "url" value = "${url}"/>    
           <property name = "username" value = "${username}"/>    
           <property name = "password" value = "${password}" />    
           <property name = "driverClassName" value = "${driverClassName}" />    
           <property name = "filters" value = "${filters}" />    
            <!-- 最大并发连接数 -->  
           <property name = "maxActive" value = "${maxActive}" />  
           <!-- 初始化连接数量 -->  
           <property name = "initialSize" value = "${initialSize}" />  
           <!-- 配置获取连接等待超时的时间 -->  
           <property name = "maxWait" value = "${maxWait}" />  
           <!-- 最小空闲连接数 -->  
           <property name = "minIdle" value = "${minIdle}" />    
           <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->  
           <property name = "timeBetweenEvictionRunsMillis" value ="${timeBetweenEvictionRunsMillis}" />  
           <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->  
           <property name = "minEvictableIdleTimeMillis" value ="${minEvictableIdleTimeMillis}" />    
           <property name = "validationQuery" value = "${validationQuery}" />    
           <property name = "testWhileIdle" value = "${testWhileIdle}" />    
           <property name = "testOnBorrow" value = "${testOnBorrow}" />    
           <property name = "testOnReturn" value = "${testOnReturn}" />    
           <property name = "maxOpenPreparedStatements" value ="${maxOpenPreparedStatements}" />  
           <!-- 打开 removeAbandoned 功能 -->  
           <property name = "removeAbandoned" value = "${removeAbandoned}" />  
           <!-- 1800 秒,也就是 30 分钟 -->  
           <property name = "removeAbandonedTimeout" value ="${removeAbandonedTimeout}" />  
           <!-- 关闭 abanded 连接时输出错误日志 -->     
           <property name = "logAbandoned" value = "${logAbandoned}" />  
      </bean>
    复制代码

    db-config.properties文件在src目录下面:

    复制代码
    url:jdbc:mysql:///huitougo?characterEncoding=utf8&useSSL=true&serverTimezone=GMT
    driverClassName:com.mysql.cj.jdbc.Driver
    username:root
    password:517839
    filters:stat
    maxActive:20
    initialSize:1
    maxWait:60000
    minIdle:10
    maxIdle:15
    timeBetweenEvictionRunsMillis:60000 
    minEvictableIdleTimeMillis:300000
    validationQuery:SELECT 'x'
    testWhileIdle:true
    testOnBorrow:false
    testOnReturn:false
    maxOpenPreparedStatements:20
    removeAbandoned:true
    removeAbandonedTimeout:1800
    logAbandoned:true
    复制代码

    web.xml文件:

    复制代码
        <!-- 连接池 启用 Web 监控统计功能    start-->  
        <filter>  
            <filter-name>DruidWebStatFilter </filter-name>  
            <filter-class>com.alibaba.druid.support.http.WebStatFilter </filter-class>  
            <init-param>  
                <param-name>exclusions</param-name> 
                <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value >  
            </init-param>
        </filter>  
        <filter-mapping>  
            <filter-name>DruidWebStatFilter</filter-name >  
            <url-pattern >/*</url-pattern> 
        </filter-mapping>
        <servlet>
            <servlet-name>DruidStatView</servlet-name>  
            <servlet-class>com.alibaba.druid.support.http.StatViewServlet </servlet-class>  
        </servlet>
        <servlet-mapping>  
            <servlet-name>DruidStatView</servlet-name >  
            <url-pattern>/druid/*</url-pattern >  
        </servlet-mapping>
         <!-- 连接池 启用 Web 监控统计功能    end--> 
    复制代码

    访问监控页面: http://ip:port/projectName/druid/index.html

  • 相关阅读:
    Javascript在使用import 与export 区别及使用
    【repost】Python正则表达式
    js常见算法
    【repost】 JS变量重复声明以及忽略var 声明的问题及其背后的原理
    【repost】javascript callback
    【repost】js window对象属性和方法相关资料整理
    Donald Knuth
    前端知识体系
    【repost】让你一句话理解闭包(简单易懂)
    【repost】图解Javascript上下文与作用域
  • 原文地址:https://www.cnblogs.com/HDK2016/p/8859213.html
Copyright © 2011-2022 走看看