数据库连接池

Posted 晓梦蝶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库连接池相关的知识,希望对你有一定的参考价值。

数据库连接池

作用:使用池来管理连接的生命周期,节省资源,提高性能。
java提供的连接池接口:javax.sql.DataSource,连接池厂商的连接池类需要实现这一接口。

池参数(所有池参数都有默认值)

初始大小:10个

最小空闲连接数:3个

增量:一次创建的最小单位(5个)

最大空闲连接数:12个

最大连接数:20个

最大的等待时间:1000毫秒

 

四大连接参数

连接池也是使用四大连接参数来完成创建连接对象!

 

实现的接口

连接池必须实现:javax.sql.DataSource接口!

 

连接池返回的Connection对象,它的close()方法与众不同!调用它的close()不是关闭,而是把连接归还给池!

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

DBCP

jar:commons-pool.jar、commons-dbcp.jar

BasicDataSource ds = new BasicDataSource();
ds.setUsername("root");
ds.setPassword("123");
ds.setUrl("jdbc:mysql://localhost:3306/mydb1");
ds.setDriverClassName("com.mysql.jdbc.Driver");
   
ds.setMaxActive(20); //最大连接数
ds.setMaxIdle(10); //最大空闲
ds.setInitialSize(10) ;//初始化
ds.setMinIdle(2) ;//最小空闲
ds.setMaxWait(1000) ;//最大等待时间
  
Connection con = ds.getConnection();

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

C3P0

jar:c3p0-0.9.2-pre1.jar、c3p0-oracle-thin-extras-0.9.2-pre1.jar、mchange-commons-0.2.jar
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb1");
ds.setUser("root");
ds.setPassword("123");
ds.setDriverClass("com.mysql.jdbc.Driver");
   
ds.setAcquireIncrement(5) ;/*每次增加五*/
ds.setInitialPoolSize(20) ;//初始化连接数
ds.setMinPoolSize(2) ;//最少连接
ds.setMaxPoolSize(50) ;//最多连接
  
Connection con = ds.getConnection();

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

C3P0配置文件

1. 通过默认配置初始化连接池

 

配置文件要求:

 

文件名称:必须叫c3p0-config.xml

 

文件位置:必须在src下

<default-config>
  <property name="xxx">XXX</property>
</defualt-config>

2. 通过命名配置初始化连接池

<named-config name="orcale-config">
  <property name="xxx">XXX</property>
</named-config>

    /**
     * 配置文件的默认配置
     * @throws SQLException 
     */
    @Test
    public void fun2() throws SQLException{
        /**
         * 在创建连接池对象时,这个对象就会自动加载配置文件!不用我们来指定
         */
        ComboPooledDataSource dataSource  = new ComboPooledDataSource();
        
        Connection con = dataSource.getConnection();
        System.out.println(con);
        con.close();
    }
    
    /**
     * 使用命名配置信息
     * @throws SQLException
     */
    @Test
    public void fun3() throws SQLException{
        /**
         * 构造器的参数指定命名配置元素的名称!
         * <named-config name="oracle-config"> 
         */
        ComboPooledDataSource dataSource  = new ComboPooledDataSource("oracle-config");
        
        Connection con = dataSource.getConnection();
        System.out.println(con);
        con.close();
    }
}

 

==============================================================================================

Tomcat配置连接池
在server.xml中,或在conf/catalina/localhost/下创建xml文件

<Context>  
  <Resource name="myc3p0" 
   type="com.mchange.v2.c3p0.ComboPooledDataSource"
   factory="org.apache.naming.factory.BeanFactory"
   user="root" 
   password="123" 
   classDriver="com.mysql.jdbc.Driver"    
   jdbcUrl="jdbc:mysql://127.0.0.1/mydb1"
   maxPoolSize="20"
   minPoolSize ="5"
   initialPoolSize="10"
   acquireIncrement="2"/>
</Context>  

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

获取Tomcat资源

Context cxt = new InitialContext(); 
DataSource ds = (DataSource)cxt.lookup("java:/comp/env/myc3p0");
Connection con = ds.getConnection();

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

修改JdbcUtils

public class JdbcUtils {
 private static DataSource dataSource = new ComboPooledDataSource();
 public static DataSource getDataSource() {
  return dataSource;
 }
 public static Connection getConnection() {
  try {
   return dataSource.getConnection();
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }
}

==============================================================================================

DBUtils

jar:commons-dbutils.jar
核心类:QueryRunner、ResultSetHandler

QueryRunner方法:
* update():DDL、DML
* query():DQL
* batch():批处理

-------------

增、删、改

 

public void fun1() throws SQLException {
 QueryRunner qr = new QueryRunner();
 String sql = "insert into user values(?,?,?)";
 qr.update(JdbcUtils.getConnection(), sql, "u1", "zhangSan", "123");
}

-------------

DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "select * from tab_student";

// 把结果集转换成Bean
Student stu = qr.query(sql, new BeanHandler<Student>(Student.class));

// 把结果集转换成Bean的List
List<Student> list = qr.query(sql, new BeanListHandler<Student>(Student.class));

// 把结果集转换成Map
Map<String,Object> map = qr.query(sql, new MapHandler());

// 把结果集转换成List<Map>
List<Map<String,Object>> list = qr.query(sql, new MapListHandler() );

// 把结果集转换成一列的List
List<Object> list = qr.query(sql, new ColumnListHandler("name")) ;

// 把结果转换成单行单列的值
Number number = (Number)qr.query(sql, new ScalarHandler());

 

批处理

 DataSource ds = JdbcUtils.getDataSource();
 QueryRunner qr = new QueryRunner(ds);
 String sql = "insert into tab_student values(?,?,?,?)";
 Object[][] params = new Object[10][]; //表示 要插入10行记录
 for(int i = 0; i < params.length; i++) {
  params[i] = new Object[]{"S_300" + i, "name" + i, 30 + i, i%2==0?"男":"女"};
 }
 qr.batch (sql, params);

 

以上是关于数据库连接池的主要内容,如果未能解决你的问题,请参考以下文章

数据库连接池原理详解与自定义连接池实现

连接池的基本原理? 以及使用连接池的好处?

面试题:数据库连接池原理详解与自定义连接池实现

Node.js实现MySQL数据库连接池

连接池工作原理

spring连接池配置详解