【JAVA】数据库连接池(DBCP)的使用与操作

版权声明:本文为博主原创文章,转载复制标题加链接即可√ https://blog.csdn.net/qazcxh/article/details/77270107

【JAVA】数据库连接池(DBCP)的使用与操作

  在java中使用SQL语句操作数据库时,往往需要先加载驱动,建立连接,连接成功后,再执行一些SQL,而执行SQL之后,又需要考虑是否关闭连接。而当又有SQL要执行时,又需要重新建立连接,再做这些步骤。这里至少存在两个需要考量的事情,第一个就是连接建立需要花费一定的时间,影响SQL的执行效率。第二个就是,如果连接一直保持,不关闭,此时其他内容要执行SQL时也需要建立新的连接,这就产生了,无数的连接,导致系统因连接过多而奔溃。
  数据库连接池,是在一个POOL池里维护一定数目的数据库连接:
  1. 当程序需要操作数据库时,从池里拿出一条连接,分配出去。
  2. 当程序执行完SQL时,将连接放回连接池里。
  3. 数据库连接池初始有一定数目的连接,当有许多程序需要执行数据库时,连接池里的连接不够时,根据设置的连接数目上线建立新的连接,并分配给程序。
   4. 当较少连接被使用时,连接池根据维护的空闲时连接数目关闭超出该数目的连接。
  5. 当超出连接池上线数目的连接都被使用,而还有程序需要连接时,根据设定的超时时间等待获取连接,也可无限等待,直至连接池里有连接。

目录


开发环境

开发流程

  1. 建立数据库连接池DBCP;
  2. 配置连接池属性,通过dbcpconfig.properties配置,也可通过代码配置;
  3. 从连接池中拿连接;
  4. 执行SQL,与常规相同;
  5. close连接,这里并非关闭连接,而是将连接放回连接池中。

源代码

package com.demo;
/**
 * @created time:2017年8月11日,下午2:18:12
 * @author:chixh
 * @file:DataPool.java
 */


import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.Statement;
import java.util.Properties;

import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;


public class DataPool {
    public static void main(String[] args)throws Exception  {
        poolMode();
    }
    // 连接池模式
    public static void poolMode() throws Exception {
        long s = System.currentTimeMillis();
        String sql = "insert into test values(1,'iPhone8',8888.88)";

        BasicDataSource ds = null;
        Connection conn = null;     
        Statement st = null;
        Properties pro = new Properties();
        //加载数据库连接池配置
        pro.load(new BufferedInputStream(new FileInputStream("./dbcpconfig.properties")));
        //建立连接池
        ds = BasicDataSourceFactory.createDataSource(pro);

        //也可在这里set连接池属性
        //设置连接池初始大小
        ds.setInitialSize(8);
        //设置连接池最大容量
        ds.setMaxTotal(20);

        for (int j = 0; j < 8; j++) {
            //这里获取连接,并非建立连接,而是从连接池中拿到连接
            conn = ds.getConnection();
            st = conn.createStatement();
            for (int i = 0; i < 1000; i++) {
                st.executeUpdate(sql);
            }
        }
        System.out.println("expensive time:" + (System.currentTimeMillis() - s) + "ms");// (8,100,1199ms)(1466ms)
        //这里close连接,并非关闭连接,而是将连接放回连接池中
        conn.close();
    }


}

数据库连接池配置,其中数据库服务器在本机localhost,username为sa,密码为root

#####dbcpconfig.properties
#########DBCP config
driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://localhost:1433;databaseName=test
databaseName=test
username=sa
password=root

#connection pool initial size
initialSize=8
#connection pool max connect num
maxActive=8
#connection pool max idle num
maxIdle=8
#connection pool min idle num
minIdle=8
#max wait time
maxWait=60000

#connect other properties
connectionProperties=useUnicode=true;characterEncoding=utf8
#default auto commit
defaultAutoCommit=true
#default read only
defaultReadOnly=
#driver default TransactionIsolation
#NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=REPEATABLE_READ
#########DBCP config

//test.sql 数据库的表结构


--localhost 

use test

CREATE TABLE "test" (
    "id" INT NOT NULL,
    "phoneName" VARCHAR(50) NULL,
    "price" DECIMAL NULL
);

猜你喜欢

转载自blog.csdn.net/qazcxh/article/details/77270107