概念:存放数据库连接的一个容器(集合)Connection
当系统运行起来之后,这个连接池就被创建,在这个连接池当中,会申请一些对象,当有用户来访问数据库的时候,就从这个连接池当中获取连接对象,用户访问结束之后,连接池对象会归还给容器
数据库连接的创建和销毁是一项资源密集型操作,它涉及到网络通信和权限验证等操作,因此开销较大。在高并发的应用中,频繁地创建和销毁连接会导致系统性能下降,甚至引发连接泄漏等问题。数据库连接池的引入可以解决这些问题,具体好处包括:
JDBC 数据库连接池通常由以下几个关键组件构成:
<c3p0-config>
<!--使用默认的配置读取数据库连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/ScienceDB?serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password"></property>
<!-- 连接池参数 -->
<!--初始化申请的连接数量-->
<property name="initialPoolSize">5</property>
<!--最大的连接数量-->
<property name="maxPoolSize">20</property>
<!--超时时间-->
<property name="checkoutTimeout">3000</property>
</default-config>
</c3p0-config>
public void sumSelect(String a) throws SQLException {
ComboPooledDataSource dataSource=new ComboPooledDataSource();
Connection conn=dataSource.getConnection();
ResultSet rs=conn.prepareStatement("select s.*,c.c_name,sc.s_score from Student s,Score sc ,Course c\n" +
"where s.s_id=sc.s_id and sc.c_id=c.c_id and s.s_id='"+a+"'").executeQuery();
while (rs.next()){
String s_id=rs.getString(1);
String s_name=rs.getString(2);
String s_birth=rs.getString(3);
String s_sex=rs.getString(4);
String c_name=rs.getString(5);
int zf=rs.getInt(6);
System.out.println(s_id+"\t"+s_name+"\t"+s_birth+"\t"+s_sex +"\t"+c_name+"\t"+zf);
}
conn.close();//释放连接----》将当前的工作连接,释放为空闲连接
}
是properties形式的
driverClassName =com.mysql.cj.jdbc.Driver;
url=jdbc:mysql://localhost:3306/20231202DB?useServerPrepStmts=true;
username=root;
password=root;
#初始化连接数
initialSize=10;
#最大等待时间
maxwait=5000
#最大连接数
maxActive=50;
minIdle=5;
public void druidTest() throws Exception {
Properties properties=new Properties();
HashMap map=new HashMap();
map.put("driverClassName","com.mysql.cj.jdbc.Driver");
map.put("url","jdbc:mysql://localhost:3306/20231202DB?serverTimezone=UTC");
map.put("username","root");
map.put("password","");
map.put("initialSize","10");
map.put("maxActive","30");
map.put("maxWait","1000");
properties.load(new FileInputStream("src\\jdbc.properties"));
DataSource dataSource= DruidDataSourceFactory.createDataSource(map);
Connection conn=dataSource.getConnection();
ResultSet rs=conn.prepareStatement("select count(*) s from film_information").executeQuery();
while (rs.next()){
int tps=rs.getInt("s");
System.out.println(tps);
}
conn.close();//释放连接----》将当前的工作连接,释放为空闲连接
}
在代码中配置 HikariCP 连接池。以下是一个示例配置:
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
public class DatabaseConnectionManager {
private static HikariConfig config = new HikariConfig();
private static HikariDataSource dataSource;
static {
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");
config.setUsername("root");
config.setPassword("password");
config.setMaximumPoolSize(10); // 最大连接数
config.setMinimumIdle(5); // 最小空闲连接数
config.setConnectionTimeout(30000); // 连接超时时间,单位毫秒
config.setIdleTimeout(600000); // 空闲连接超时时间,单位毫秒
config.setMaxLifetime(1800000); // 最大生命周期时间,单位毫秒
dataSource = new HikariDataSource(config);
}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) {
try (Connection connection = DatabaseConnectionManager.getConnection()) {
String sql = "SELECT * FROM users";
try (PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
int userId = resultSet.getInt("id");
String username = resultSet.getString("username");
String email = resultSet.getString("email");
System.out.println("User ID: " + userId + ", Username: " + username + ", Email: " + email);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
#数据库连接地址
#url=jdbc:mysql://localhost:3306/数据库名(?配置参数)
url=jdbc:mysql://localhost:3306/express_manage?useUnicode=true&characterEncoding=utf-8
#数据库驱动类的全名
driverClassName=com.mysql.jdbc.Driver
#数据库帐号
username=root
#数据库密码 等于号后面直接填密码,不需要引号,密码为空时可以不填或 ""
password=
#初始化连接池时,创建的连接数量
initialSize=5
#连接池的最大连接容量,连接使用完后不释放会很容易达到最大值,导致之后的连接被卡住
maxActive=20
#空闲时允许保留的最大连接数量
maxIdle=5
#空闲时允许保留的最小连接数量
minIdle=5
#排队等候的超时时间(毫秒)
maxWait=3000
新增
public class DBCPTest {
//全局变量
private static DataSource ds = null;
static {
Properties ppt = new Properties();
InputStream is = DBCPTest.class.getClassLoader().getResourceAsStream("dbcp.properties");
try {
ppt.load(is);
ds = BasicDataSourceFactory.createDataSource(ppt);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
//文件的输入流
InputStream is = DBCPTest.class.getClassLoader().getResourceAsStream("dbcp.properties");
//将配置文件, 转换为Properties对象
Properties ppt = new Properties();
ppt.load(is);
//通过连接池的工厂类(DruidDataSourceFactory)的创建连接池的方法(createDataSource())
DataSource ds = BasicDataSourceFactory.createDataSource(ppt);
//从连接池中 获取连接对象
Connection conn = ds.getConnection();
//通过连接对象,创建SQL对象
Statement state = conn.createStatement();
//通过SQL对象,执行SQL语句,以
state.execute("insert into user value ('huang','123')");
//释放资源
conn.close();
state.close();
}
}