DBCP连接池学习
目录:
1、在maven项目中导入依赖的jar包。
2、jdbc.properties文件说明:
3、Dbcp连接池说明:
4、5:报错处理
6、代码示例:
7、使用数据库连接池的好处:
1、在maven项目中导入依赖的jar包。
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
2、jdbc.properties文件说明:
图2.1 properties文件
(1)连接设置
driverClassName=com.mysql.jdbc.Driver:所使用的JDBC驱动的类全名
url=jdbc:mysql://192.168.88.142/dengqinyi?useUnicode=true&characterEncoding=utf-8&useSSL=false:通过JDBC建立一个连接所需的url地址
username=deng5:通过JDBC建立一个连接所需的用户名
password=Dengqinyi1!:通过JDBC建立一个连接所需的密码
(2)初始化连接
initialSize=5:当这个池被启动时初始化的创建的连接个数,此处初始化连接数为5
(3)最大有效连接
maxTotal=10:可以在这个池中同时被分配的有效连接数的最大值,如设置负数,则不限制,此处最大有效连接为10
(4)最大空闲连接
maxIdle=10:可以在池中保持空闲的最大连接数,超出设置值之外的空闲连接将被回收,如设置负数,则不限制,此处最大空闲连接设置为10
(5)最小空闲连接
minIdle=2:可以在池中保持空闲的最小连接数,超出设置值之外的空闲连接将被创建,如设置为0,则不创建,此处最小空闲连接设置为2
(6)validationQuery=select 1:在连接池返回连接给调用者前用来进行连接校验的查询sql。如果指定,则这个查询必须是一个至少返回一行数据的SQL Select语句。如果没有指定,则连接将通过调用isVaild()方法进行校验。
3、Dbcp连接池说明:
答:dbcp可以自动检查连接的可能性,dbcp定时检测连接,commons-dbcp是apache上的一个Java连接池项目,也是Tomcat使用的连接池组件。
4、报错Cannot load JDBC driver class 'com.mysql.jdbc.Driver
答:表示没有JDBC连接MySQL的驱动包,解决:手动添加驱动包到WEB-INF目录下的lib目录中。此处为maven项目,故导入依赖的jar包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
5、报错 Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
答:在配置文件的url最后添加“useSSL=false”
6、代码示例:
①ConnectionFactory.java
package com.mashen.common;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class ConnectionFactory {
private static ThreadLocal<Connection> thlocal = new ThreadLocal<Connection>();
private BasicDataSource dataSource;
private static ConnectionFactory instance = new ConnectionFactory();
public static ConnectionFactory getInstance() {
return instance;
}
private ConnectionFactory(){
Properties pro = new Properties();
try {
InputStream input = this.getClass().getResourceAsStream("/jdbc.properties");
pro.load(input);
input.close();
dataSource = (BasicDataSource)BasicDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
e.printStackTrace();
}
}
public Connection getConnection() throws SQLException{
return dataSource.getConnection();
}
public static Connection getLocalThreadConnection() throws SQLException{
Connection conn = thlocal.get();
if(conn == null){
Connection localConn = instance.getConnection();
thlocal.set(localConn);
return conn;
}else{
return conn;
}
}
public static void closeAll(Connection conn, Statement st, ResultSet rs){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
System.out.println(ConnectionFactory.getInstance().getClass().getName());
}
}
②运行结果:
图6.1 运行结果
7、使用数据库连接池的好处:
答:通过数据库连接池来管理Connection,可以重复使用Connection。有了池,我们就可以不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close方法也不会真的关闭Connection,而是把Connection放回到连接池。连接池就可以再利用这个Connection对象了。