版权声明:本文为博主原创文章,转载复制标题加链接即可√ https://blog.csdn.net/qazcxh/article/details/77270107
【JAVA】数据库连接池(DBCP)的使用与操作
在java中使用SQL语句操作数据库时,往往需要先加载驱动,建立连接,连接成功后,再执行一些SQL,而执行SQL之后,又需要考虑是否关闭连接。而当又有SQL要执行时,又需要重新建立连接,再做这些步骤。这里至少存在两个需要考量的事情,第一个就是连接建立需要花费一定的时间,影响SQL的执行效率。第二个就是,如果连接一直保持,不关闭,此时其他内容要执行SQL时也需要建立新的连接,这就产生了,无数的连接,导致系统因连接过多而奔溃。
数据库连接池,是在一个POOL池里维护一定数目的数据库连接:
1. 当程序需要操作数据库时,从池里拿出一条连接,分配出去。
2. 当程序执行完SQL时,将连接放回连接池里。
3. 数据库连接池初始有一定数目的连接,当有许多程序需要执行数据库时,连接池里的连接不够时,根据设置的连接数目上线建立新的连接,并分配给程序。
4. 当较少连接被使用时,连接池根据维护的空闲时连接数目关闭超出该数目的连接。
5. 当超出连接池上线数目的连接都被使用,而还有程序需要连接时,根据设定的超时时间等待获取连接,也可无限等待,直至连接池里有连接。
目录
开发环境
- 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库
开发流程
- 建立数据库连接池DBCP;
- 配置连接池属性,通过dbcpconfig.properties配置,也可通过代码配置;
- 从连接池中拿连接;
- 执行SQL,与常规相同;
- 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
);