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

来源:互联网 发布:电信5s4g网络怎么设置 编辑:程序博客网 时间:2024/05/16 06:06

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

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

目录

  • JAVA数据库连接池DBCP的使用与操作
    • 目录
    • 开发环境
    • 开发流程
    • 源代码


开发环境

  • java开发工具包,jdk-8u144-windows-x64.exe
  • java开发IDE,eclipse-jee-neon-2-win32-x86_64
  • DBCP工具jar包,commons-dbcp2-2.1.1.jar
  • POOL2工具jar包,commons-pool2-2.4.2.jar
  • MSSQL JDBC工具jar包,sqljdbc4-3.0.jar
  • logging依赖工具jar包,commons-logging-1.2.jar
  • 项目工程源代码,github库

开发流程

  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 configdriverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriverurl=jdbc:sqlserver://localhost:1433;databaseName=testdatabaseName=testusername=sapassword=root#connection pool initial sizeinitialSize=8#connection pool max connect nummaxActive=8#connection pool max idle nummaxIdle=8#connection pool min idle numminIdle=8#max wait timemaxWait=60000#connect other propertiesconnectionProperties=useUnicode=true;characterEncoding=utf8#default auto commitdefaultAutoCommit=true#default read onlydefaultReadOnly=#driver default TransactionIsolation#NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLEdefaultTransactionIsolation=REPEATABLE_READ#########DBCP config

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

--localhost use testCREATE TABLE "test" (    "id" INT NOT NULL,    "phoneName" VARCHAR(50) NULL,    "price" DECIMAL NULL);