为了防止连接的浪费,我们可以建立一个连接池,这个池中可以容纳一定数量的连接对象,一开始,我们可以先替用户先创建好一些连接对象,等用户要拿连接对象时,就直接从池中拿,不用新建了,这样也可以节省时间。然后用户用完后,放回去,别人可以接着用。可以提高连接的使用率。当池中的现有的连接都用完了,那么连接池可以向服务器申请新的连接放到池中。直到池中的连接达到“最大连接数”,就不能在申请新的连接了,如果没有拿到连接的用户只能等待。
- 配置文件
# druid连接池需要的配置参数,key固定命名
driverClassName=com.mysql.cj.jdbc.Driver
username=用户名
password=密码
url=jdbc:mysql://localhost:3306/数据库名称
- 工具类
package com.api.statement.Util;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.net.ConnectException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
/**
* Description:
*
* @Author ghp
* @Creat 2024/2/22 12:41
* @Version 1.0
*/
public class JDBCUtil {
/**
* 连接池对象
*/
public static DataSource dataSource;
/**
* ThreadLocal为线程本地变量,可以为同一个线程存储共享变量
* 可以解决同一个线程只使用一个连接,不用穿参数
*/
public static ThreadLocal<Connection> threadLocal;
// 静态代码块,初始化执行一次
static{
Properties properties = new Properties();
InputStream resourceAsStream = JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties");
try {
properties.load(resourceAsStream);
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static Connection getConnection() throws SQLException {
Connection connection = threadLocal.get();
if(connection == null){
connection = dataSource.getConnection();
threadLocal.set(connection);
}
return connection;
}
public static void closeConnection() throws SQLException {
Connection connection = threadLocal.get();
if(connection != null){
threadLocal.remove();
connection.setAutoCommit(true); // 将数据提交方式恢复
connection.close();
}
}
}