什么是连接池?
连接池是一种技术,用于管理和协调数据库连接的创建、使用和释放。连接池起源于通过网络和客户端应用程序访问数据库时的性能和并发问题,当每个客户端请求都需要创建一个新的数据库连接时,这会导致大量连接创建和关闭的开销,从而导致系统性能下降。
连接池通过在应用程序初始化时预创建一定数量的数据库连接并存储在连接池中,以便在需要时分配给应用程序。当客户端应用程序需要访问数据库时,它们从连接池中请求一个可用的连接,利用这个连接来执行数据库操作,并在完成后将连接释放回连接池。
通过使用连接池,可以有效地重用和管理数据库连接,避免了频繁地创建和销毁数据库连接,提高了数据库的性能和可伸缩性。
多种开源的数据库连接池
JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现:
- DBCP 是Apache提供的数据库连接池。tomcat 服务器自带dbcp数据库连接池。速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持。
- C3P0 是一个开源组织提供的一个数据库连接池,**速度相对较慢,稳定性还可以。**hibernate官方推荐使用
- Druid 是阿里提供的数据库连接池,据说是集DBCP 、C3P0 、Proxool 优点于一身的数据库连接池,但是速度不确定是否有BoneCP快
c3p0
jar包文件下载
https://sourceforge.net/projects/c3p0/
导入这2个架包到库里面即可
文件配置
<c3p0-config>
<!--使用默认的配置读取数据库连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/ScienceDB</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<!--初始化申请的连接数量-->
<property name="initialPoolSize">5</property>
<!--最大的连接数量-->
<property name="maxPoolSize">10</property>
<!--超时时间-->
<property name="checkoutTimeout">3000</property>
</default-config>
<!-- <named-config name="otherc3p0">-->
<!-- <!– 连接参数 –>-->
<!-- <property name="driverClass">com.mysql.jdbc.Driver</property>-->
<!-- <property name="jdbcUrl">jdbc:mysql://localhost:3306/hs_test?serverTimezone=Asia/Shanghai</property>-->
<!-- <property name="user">root</property>-->
<!-- <property name="password">root</property>-->
<!-- <!– 连接池参数 –>-->
<!-- <property name="initialPoolSize">5</property>-->
<!-- <property name="maxPoolSize">8</property>-->
<!-- <property name="checkoutTimeout">1000</property>-->
<!-- </named-config>-->
</c3p0-config>
测试代码
@Test
public void show() throws SQLException {
ComboPooledDataSource dataSource=new ComboPooledDataSource();
Connection conn=dataSource.getConnection();
ResultSet rs=conn.prepareStatement("select * from studenttab").executeQuery();
while (rs.next()){
int id =rs.getInt("id");
String name=rs.getString("name");
String course=rs.getString("course");
int score=rs.getInt("score");
System.out.println(id+"-"+name+"-"+course+"-"+score);
}
conn.close();
}
运行结果
Druid
Central Repository: com/alibaba/druid (maven.org)
文件配置
下面那些密码你设置的是什么就用什么!!!
driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/1201moviedb?rewriteBatchedStaements = true&serverTimezone = UTC
username = root
password = root
initialSize = 10
minIdle = 5
maxActive = 20
maxWait = 5000
测试代码
@Test
public void testDruid() throws Exception {
// 创建配置文件对象
Properties properties = new Properties();
// 创建一个文件输入流指向配置文件
FileInputStream inputStream = new FileInputStream("src\\jdbc.properties");
// 加载配置文件
properties.load(inputStream);
// 工厂包装类创建数据源DruidDataSourceFactory
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
System.out.println(dataSource.getClass());
}
DBCP
需要下载2个jar包
Pool – Download Apache Commons Pool
DBCP – Download Apache Commons DBCP
文件配置
#加载数据库驱动
driverClassName=com.mysql.cj.jdbc.Driver
#数据库连接地址
url=jdbc:mysql://localhost:3306/MovieDB
#数据库用户名
username=root
#数据库密码
password=123456
#初始化连接数量
initialSize=10
#最大连接数
maxActive=30
#最大超时数3000ms
maxWait=3000
测试代码
@Test
public void testDBCP() throws IOException, SQLException {
// 创建一个Properties对象
Properties properties = new Properties();
// 创建一个FileInputStream对象,用于读取src\\dbcp.properties文件
FileInputStream fileInputStream
= new FileInputStream("src\\dbcp.properties");
// 使用FileInputStream对象读取文件,并将文件内容加载到properties对象中
properties.load(fileInputStream);
// 使用properties对象创建一个BasicDataSource对象
BasicDataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
// 打印dataSource对象创建的连接
System.out.println(dataSource.getConnection());
}
HikariCP
需要的jar包
https://mvnrepository.com/artifact/com.zaxxer/HikariCP/4.0.3
Maven Repository: org.slf4j » slf4j-api » 1.7.25 (mvnrepository.com)
配置文件
#加载数据库驱动
driverClassName=com.mysql.cj.jdbc.Driver
#数据库连接地址
jdbcUrl=jdbc:mysql://localhost:3306/MovieDB
#数据库用户名
username=root
#数据库密码
password=123456
# 连接池名称
poolName=MyConnectionPool
# 连接池大小
maximumPoolSize=10
# 最小空闲连接数
minimumIdle=5
# 连接超时时间(毫秒)
connectionTimeout=30000
# 空闲连接超时时间(毫秒)
idleTimeout=600000
# 最大生存时间(毫秒)
maxLifetime=1800000
测试代码
@Test
public void testHikari() throws SQLException, IOException {
//1.配置连接池
HikariConfig hikariConfig = new HikariConfig();
//也可以通过properties配置文件配置连接池new HikariConfig(Properties properties)
//Properties properties = new Properties();
//FileInputStream fileInputStream = new FileInputStream("src\\hikaricp.properties");
//properties.load(fileInputStream);
//HikariConfig hikariConfig = new HikariConfig(properties)
hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306");
hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
hikariConfig.setUsername("root");
hikariConfig.setPassword("root");
hikariConfig.setMaximumPoolSize(30); // 最大连接数
hikariConfig.setMinimumIdle(10); // 最小连接数
hikariConfig.setConnectionTimeout(3000); // 连接超时时间从连接池中获取一个连接最大等待多久时间,单位毫秒
//2.通过配置类生成HikariCP连接池对象
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
System.out.println(dataSource.getConnection());
}