关于数据库:JDBC编程连接池技术DBCPC3P0Druid

52次阅读

共计 5830 个字符,预计需要花费 15 分钟才能阅读完成。

连接池

连接池是一种创立和治理一个连贯的缓冲池的技术,这些连贯筹备好被任何须要它们的线程所应用。数据库连贯是一种要害的、低廉的、无限的资源,应用数据库连接池能进步数据库连贯的性能。

当一个线程须要 JDBC 对数据库进行操作时,它从池中申请一个连贯,当线程应用完这个连贯,将连贯返回连接池中,以筹备被其它线程应用。当连贯从池中“借出”,它被申请它的线程专有地应用。从编程的角度来看,这和用户的线程每当须要一个 JDBC 连贯的时候调用 DriverManager.getConnection() 是一样的,采纳连接池技术,可通过应用新的或已有的连贯完结线程。

DBCP 连接池:

DBCP 是 Apache 软件基金组织下的开源连接池实现,要应用 DBCP 数据源,须要应用程序应在零碎中减少如下两个 jar 文件:

  • Commons-dbcp.jar:连接池的实现
  • Commons-pool.jar:连接池实现的依赖库

Tomcat 的连接池正是采纳该连接池来实现的。该数据库连接池既能够与应用服务器整合应用,也可由应用程序独立应用。

实现步骤:
步骤一:在类目录下增加 dbcp 的配置文件:dbcp.ini
步骤二:在获取数据库连贯的工具类的动态代码块中创立连接池
步骤三:开释数据库连贯,在利用中获取连贯。

步骤一:在类目录下增加 dbcp 的配置文件:dbcp.ini

连贯设置:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
username=root
password=root
#<!-- 初始化连贯 -->
initialSize=10
#最大连贯数量
maxActive=50
#<!-- 最大闲暇连贯 -->
maxIdle=20
#<!-- 最小闲暇连贯 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 60000 毫秒 /1000 等于 60 秒 -->
maxWait=60000
#JDBC 驱动建设连贯时附带的连贯属性属性的格局必须为这样:[属性名 =property;] 
#留神:"user" 与 "password" 两个属性会被明确地传递,因而这里不须要蕴含他们。connectionProperties=useUnicode=true;characterEncoding=utf-8
#指定由连接池所创立的连贯的主动提交(auto-commit)状态。defaultAutoCommit=true
#driver default 指定由连接池所创立的连贯的只读(read-only)状态。#如果没有设置该值,则“setReadOnly”办法将不被调用。(某些驱动并不反对只读模式,如:Informix)defaultReadOnly=
#driver default 指定由连接池所创立的连贯的事务级别(TransactionIsolation)。

步骤二:在获取数据库连贯的工具类的动态代码块中创立连接池

在 java 中,编写数据库连接池须要实现 javax.sql.DataSource 接口,每一个数据库连接池都是该接口的实现。

public class DBCP {
    private static DataSource myDataSource=null;
   // 在动态代码块中创立连接池
    static{Properties pro=new Properties();
        try {
    // 加载 jdbc 配置文件
            pro.load(DBCP.class.getClassLoader().getResourceAsStream("dbcp.ini"));
    // 创立数据源
            myDataSource= BasicDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {e.printStackTrace();
        }
    }
    // 从数据源中获取数据库连贯
    public static Connection getConnection(){
        Connection conn=null;
        try {conn= myDataSource.getConnection();
        } catch (SQLException e) {e.printStackTrace();
        }
        return conn;
    }
}

步骤三:开释数据库连贯,在利用中获取连贯。

C3P0 连接池

c3p0 是一个开源的 JDBC 连接池,它实现了数据源和 JNDI 绑定,反对 JDBC3 标准和 JDBC2 的规范扩大。c3p0 个别是与 Hibernate,Spring 等框架一块应用的,当然也能够独自应用。

dbcp 没有主动回收闲暇连贯的性能,c3p0 有主动回收闲暇连接功能。

应用 c3p0 须要导入 c3p0.jar,如果操作的是 Oracle 数据库,那么还须要导入 c3p0-oracle-thin-extras-pre1.jar。

实现步骤:
步骤一:在类目录下退出 C3P0 的配置文件:c3p0-config.xml
步骤二:在获取数据库连贯的工具类的动态代码块创立连接池
步骤三:开释连贯,在利用中获取连贯。

步骤一:在类目录下退出 C3P0 的配置文件:c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!--  C3P0 的缺省 (默认) 配置 -->    
<!-- 如果在代码中“ComboPooledDataSourceds = new ComboPooledDataSource();”这样写就示意应用的是 C3P0 的缺省 (默认) 配置信息来创立数据源 -->

   <default-config>
      <property name="automaticTestTable">con_test</property>
      <property name="checkoutTimeout">30000</property>
      <property name="idleConnectionTestPeriod">30</property>
      <property name="initialPoolSize">10</property>
      <property name="maxIdleTime">30</property>
      <property name="maxPoolSize">100</property>
      <property name="minPoolSize">10</property>
      <property name="maxStatements">200</property>
   </default-config>

<!-- C3P0 的命名配置,-->     

<!-- 如果在代码中“ComboPooledDataSourceds = new ComboPooledDataSource("mysql");”这样写就示意应用的是 name 是 mysql 的配置信息来创立数据源 -->

   <named-config name="mysql">
      <property name="driverClass">com.mysql.jdbc.Driver</property>
      <property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8
   
   </property>
      <property name="user">root</property> 
      <property name="password">root</property>
      <property name="acquireIncrement">5</property>
      <property name="initialPoolSize">10</property>
      <property name="minPoolSize">5</property>
      <property name="maxPoolSize">30</property>
   </named-config>
</c3p0-config>

步骤二:在获取数据库连贯的工具类的动态代码块创立连接池

package com.wanyu.db;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.sql.Connection;
import java.sql.SQLException;

/**
 * Created by samsung on 2017/10/13.
 */
public class C3P0 {
    public static ComboPooledDataSource cs=null;
    static {
    // 通过读取 C3P0 的配置文件创立数据源 应用命名配置
        cs=new ComboPooledDataSource("mysql");
    }
    public static Connection getConnection(){
         Connection conn=null;
        try {
    // 从数据源中获取数据库连贯
            conn=cs.getConnection();} catch (SQLException e) {e.printStackTrace();
        }
        return conn;
    }
}

步骤三:开释连贯,在利用中获取连贯。

Druid 连接池

Druid 首先是一个数据库连接池。Druid 是目前最好的数据库连接池,在性能、性能、扩展性方面,都超过其余数据库连接池,包含 DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。

  • 替换 DBCP 和 C3P0。Druid 提供了一个高效、功能强大、可扩展性好的数据库连接池。
  • 能够监控数据库拜访性能,Druid 内置提供了一个功能强大的 StatFilter 插件,可能具体统计 SQL 的执行性能,这对于线上剖析数据库拜访性能有帮忙。
  • 数据库明码加密。间接把数据库明码写在配置文件中,这是不好的行为,容易导致平安问题。DruidDruiver 和 DruidDataSource 都反对 PasswordCallback。
  • SQL 执行日志,Druid 提供了不同的 LogFilter,可能反对 Common-Logging、Log4j 和 JdkLog,你能够按须要抉择相应的 LogFilter,监控你利用的数据库拜访状况。
  • 扩大 JDBC,如果你要对 JDBC 层有编程的需要,能够通过 Druid 提供的 Filter 机制,很不便编写 JDBC 层的扩大插件。

应用 Druid 须要增加 druid.jar 包。

实现步骤:
步骤一:在类目录下退出 druid 的配置文件:druid.ini
步骤二:在获取数据库连贯的工具类的动态代码块中创立连接池
步骤三:开释连贯,在利用中获取数据库连贯。

步骤一:在类目录下退出 druid 的配置文件:druid.ini

#mysql 数据库
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
username=root
password=root
#filters=stat
#最大连贯数量
maxActive=2000
#初始化连贯数量
initialSize=400
#超时等待时间以毫秒为单位
maxWait=3000
#最小闲暇连贯
minIdle=5
#校验连接池中限度工夫超过 minEvictableIdleTimeMillis 的连贯对象
timeBetweenEvictionRunsMillis=6000
#连贯在池中放弃闲暇而不被闲暇连贯回收器线程 (如果有) 回收的最小工夫值,单位毫秒
#minEvictableIdleTimeMillis=
#SQL 查问, 用来验证从连接池取出的连贯, 在将连贯返回给调用者之前
validationQuery=SELECT now();
#指明连贯是否被闲暇连贯回收器 (如果有) 进行测验.
#如果检测失败, 则连贯将被从池中去除.
testWhileIdle=true
#指明是否在从池中取出连贯前进行测验, 如果测验失败, 则从池中去除连贯并尝试取出另一个.
testOnBorrow=false
#指明是否在偿还到池中前进行测验
testOnReturn=false
#poolPreparedStatements=true
#maxPoolPreparedStatementPerConnectionSize=20

步骤二:在获取数据库连贯的工具类的动态代码块中创立连接池

package com.wanyu.db;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * Created by samsung on 2017/10/13.
 */
public class Druid {
  // 创立连接池对象
    private static DataSource myDataSource=null;
    static {Properties pro=new Properties();
        try {
    // 加载 Druid 配置文件
            pro.load(Druid.class.getClassLoader().getResourceAsStream("druid.ini"));
    // 获取数据源
            myDataSource= DruidDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {e.printStackTrace();
        }
    }
    public static Connection getConnection(){
        Connection conn=null;
        try {
    // 从数据源中获取数据库连贯
            conn=myDataSource.getConnection();} catch (SQLException e) {e.printStackTrace();
        }
        return conn;
    }
}

步骤三:开释连贯,在利用中获取数据库连贯。

正文完
 0