简介:
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。它的优势有:
(1)资源重用
(2)更快的系统反应速度
(3)新的资源分配手段对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置实现某一应用最大可用数据库连接数的限制避免某一应用独占所有的数据库资源.
(4)统一的连接管理,避免数据库连接泄露在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露
主流的java连接池
C3P0连接池
DBCP
Proxool
...
1.记录 用C3P0连接池链接
下载C3P0连接池jar包 提取码:【27583EBAA9133A75D489356B99734362】经过MD5加密 ( ̄▽ ̄)皮一下 很开心
导入jar包到你需要的项目里面
ps
在src
文件夹粘贴下载下来的c3p0-config.xml
文件(当然也可以自己新建,但是名字一定一致)
然后配置这个文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="user">root</property>
<property name="password">123456</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/java_web?useSSL=true</property>
<!--以上的user是数据库的用户,password是数据库的密码,driverClass是mysql的数据库驱动,jdbcUrl是连接数据库的url -->
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数 -->
<property name="acquireIncrement">5</property>
<!--初始化时获取十个连接,取值应在minPoolSize与maxPoolSize之间 -->
<property name="initialPoolSize">10</property>
<!--连接池中保留的最小连接数 -->
<property name="minPoolSize">10</property>
<!--连接池中保留的最大连接数 -->
<property name="maxPoolSize">50</property>
<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
<property name="maxStatements">20</property>
<!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
<property name="maxStatementsPerConnection">5</property>
</default-config>
<named-config name="mysql">//这个名字注意了
<property name="user">root</property>//不是用户名
<property name="password">123456</property>//不是密码
<property name="driverClass">com.mysql.jdbc.Driver</property>//认不到系列驱动
<property name="jdbcUrl">jdbc:mysql://localhost:3306/java_web??useUnicode=true&useSSL=false</property>//java_web 请不要替换成你的数据库名字
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">50</property>
<property name="maxStatements">20</property>
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
配置信息主要是填写数据库驱动、数据库名称、数据库用户名、密码等等
建立一个TestC3p0测试类
假设我们mysql java_web
数据库有一个表user_table
如下
package demo;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestC3p0 {
public void testSelect() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
//1.创建自定义连接池对象
//此种方法加载的配置文件中默认配置default-config
// ComboPooledDataSource dataSource = new ComboPooledDataSource();
//加载有名称的配置named-config
ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
try {
//2.从池中获取对象(改造过后)
conn = dataSource.getConnection();
//3.编写SQL语句
String sql="select username from user_table where password = ?";
//4.获取执行sql语句的对象
pstmt = conn.prepareStatement(sql);
//5.设置参数
pstmt.setString(1,"123");
//6.执行
rs = pstmt.executeQuery();
//7.处理结果集
while (rs.next()){
System.out.println(rs.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstmt!=null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args){
TestC3p0 testC3p0 = new TestC3p0();
testC3p0.testSelect();
}
}
运行结果
然后我们就可以编写一个工具类,方便使用
package demo;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class C3P0Utils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
/**
* 获取连接池对象
*/
public static DataSource getDataSource(){
return dataSource;
}
/**
* 从池中获取连接对象
*/
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 释放资源
*/
public static void releaseConnection(Connection connection,PreparedStatement pstmt,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstmt!=null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
测试工具类的使用
package demo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class test {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = C3P0Utils.getConnection();
String sql="select username from user_table where password = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,"123");
rs = pstmt.executeQuery();
while (rs.next()){
System.out.println(rs.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
C3P0Utils.releaseConnection(conn,pstmt,rs);
}
}
}
遇到的问题
1.
原因:
不建议在没有服务器身份验证的情况下建立SSL连接,根据MySQL 5.5.45+、5.6.26+和5.7.6+的要求,如果没有设置显式选项,则必须默认建立SSL连接。为了符合不使用SSL的现有应用程序,verifyServerCertificate属性被设置为“false”。您需要通过设置useSSL=false显式禁用SSL,或者设置useSSL=true并为服务器证书验证提供信任存储。
解决