目录
一.数据库连接池的概念
- 数据库连接池:存储数据库连接对象的池子。是一个容器,里面装了数据库连接对象
- 连接池:提供了一种池子的思想,包括数据库连接池、线程池
- 数据库连接池的作用:使用数据库连接池,避免了重复创建Connection对象-消亡-创建-消亡
- 数据库连接池提供了一个池子,里面已经提前准备好了一些连接对象,需要使用的时候直接从池子里取,用完再归还即可,节省时间和资源
二.简单的自定义数据库连接池
方便理解数据库连接池而写的demo,使用第三方数据库连接池可跳到目录三
1.提供JDBC工具类
JDBC工具类:JdbcUtils.java
package com.rabbit.jdbc;
import java.sql.*;
import java.util.Properties;
//封装JDBC工具类
public class JdbcUtils {
private static String driver;
private static String url;
private static String user;
private static String password;
static {
try{
//加载配置文件
Properties p = new Properties();
p.load(JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"));
//获取数据
driver = p.getProperty("driver");
url = p.getProperty("url");
user = p.getProperty("user");
password = p.getProperty("password");
//1.注册驱动
Class.forName(driver);
}catch (Exception e){
System.out.println("jdbc初始化失败");
}
}
public static Connection getConnection() throws Exception{
//2.获取数据库连接对象
Connection conn = DriverManager.getConnection(url,user,password);
return conn;
}
public static void close(ResultSet rs, Statement state,Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(state != null){try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}}
if(conn != null){try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}}
}
public static void close(Statement state,Connection conn){
if(state != null){try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}}
if(conn != null){try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}}
}
}
配置文件jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://172.16.0.130:7302/recruitment
user=admin
password=1234
JDBC工具类说明
- 定义一个工具类,把连接数据库、释放资源封装起来
- 为了避免创建多个注册驱动对象,把注册驱动代码放在静态代码块中
- 因为数据库类型、数据库连接地址、数据库账号密码可能发生变化,将这些信息放在properties配置文件中
- 增删改 和 查询需要释放的资源不一样,使用方法重载
2.自定义数据库连接池
package com.rabbit.jdbc;
import java.sql.Connection;
import java.util.LinkedList;
public class MyPool {
//创建数据库连接对象
private static LinkedList<Connection> pool = new LinkedList<Connection>();
static {
try {
for(int i = 1; i <= 5; i++){
Connection conn = JdbcUtils.getConnection();
pool.add(conn);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//提供获取数据库连接对象的方法
public static synchronized Connection getConnection(){
if(pool.size() > 0){
return pool.removeFirst();
}
throw new RuntimeException("服务器忙,请稍后");
}
//提供归还数据库连接对象的方法
public static void close(Connection conn){
pool.addLast(conn);
}
}
3.调用数据库连接池获取数据库连接对象
package com.rabbit.jdbc;
import java.sql.Connection;
public class Demo04 {
public static void main(String[] args) throws Exception {
//从数据库连接池中获取对象
for(int i = 1; i <= 6; i++){
Connection conn = MyPool.getConnection();
System.out.println(conn);
if(i == 3){
MyPool.close(conn);
}
}
}
}
三.第三方提供的数据库连接池
1.数据库连接池规范
SUN公司提供了一个数据库连接池接口:DataSource
Java中所有第三方数据库连接池都要实现这个接口,重写里面的方法:
2.第三方数据库需要的jar包
常用的第三方数据库连接池有C3P0和Druid,其中Druid是由阿里巴巴提供的。
使用C3P0需要的jar包:
使用Druid需要的jar包:
3.Druid入门小案例
DruidDemo.java
package com.rabbit.jdbc;
import java.sql.Connection;
import java.util.Properties;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.util.Properties;
public class DruidDemo {
public static void main(String[] args) throws Exception {
//从配置文件中获取数据库信息
Properties p = new Properties();
p.load(DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"));
//创建数据库连接池对象
DataSource dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(p);
//获取数据库连接对象
Connection conn = dataSource.getConnection();
System.out.println(conn);
//归还数据库连接对象
conn.close();
}
}
Druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://172.16.0.130:7302/recruitment
username=admin
password=1234
initialSize=5
maxActive=10
maxWait=10000
- initialSize:初始数据库连接对象个数
- maxActive:最大连接个数
- maxWait:超过等待时间
如果遇到空指针异常问题,File -> Projects Structure -> Modules,切换到Resources,右键src,选择Sources