简介:
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。它的优势有:
(1)资源重用
(2)更快的系统反应速度
(3)新的资源分配手段对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置实现某一应用最大可用数据库连接数的限制避免某一应用独占所有的数据库资源.
(4)统一的连接管理,避免数据库连接泄露在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露
主流的java连接池
C3P0连接池
DBCP
Proxool
...
1.记录 用C3P0连接池链接
下载C3P0连接池jar包 提取码:【27583EBAA9133A75D489356B99734362】经过MD5加密 ( ̄▽ ̄)皮一下 很开心
导入jar包到你需要的项目里面
导入过程,英文版是【Build Path】-->【Configure Build Path...】
ps
这个也需要的哦 你一定知道吧
在src文件夹粘贴下载下来的c3p0-config.xml文件(当然也可以自己新建,但是名字一定一致)
然后配置这个文件
root
123456
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/java_web?useSSL=true
5
10
10
50
20
5
//这个名字注意了
root//不是用户名
123456//不是密码
com.mysql.jdbc.Driver//认不到系列驱动
jdbc:mysql://localhost:3306/java_web??useUnicode=true&useSSL=false//java_web 请不要替换成你的数据库名字
5
10
10
50
20
5
配置信息主要是填写数据库驱动、数据库名称、数据库用户名、密码等等
建立一个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并为服务器证书验证提供信任存储。
解决