数据库连接池其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
连接池优势:
1. 节约资源
2. 用户访问高效
如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接,而是归还连接。
标准接口的实现类一般有数据库厂商提供:
c3p0是一个易于使用的库,通过使用jdbc3规范和jdbc2的可选扩展定义的功能来扩展传统JDBC驱动程序,从而使其“企业就绪”。从0.9.5版开始,c3p0完全支持jdbc4规范。
特别是,c3p0提供了一些有用的服务:
一个类,它使传统的基于DriverManager的JDBC驱动程序适应最新的javax.sql.DataSource方案,以获取数据库连接。
DataSources后面的Connection和PreparedStatement的透明池可以“包装”传统驱动程序或任意非池化DataSources。
该库尽力使细节正确:
c3p0数据源既可引用,也可序列化,因此适用于绑定到各种基于JNDI的命名服务。
检入池中的连接和语句时,将仔细清理语句和结果集,以防止客户端使用仅清除其连接的惰性但常见的资源管理策略时资源耗尽。
该库采用JDBC 2和3规范定义的方法(即使这些与库作者的首选项冲突)。数据源以JavaBean样式编写,提供了所有必需和大多数可选属性(以及一些非标准属性)以及无参数构造函数。实现了所有JDBC定义的内部接口(ConnectionPoolDataSource,PooledConnection,生成ConnectionEvent的Connection等)。您可以将c3p0类与兼容的第三方实现混合使用(尽管并非所有c3p0功能都可以与ConnectionPoolDataSource的外部实现一起使用)。
首先导入jar包
c3p0所需的jar包通过百度云盘分享给大家:
链接:https://pan.baidu.com/s/1RjWoaIZu8rAzUbhZ3FcF3Q
提取码:zt0v
然后需要编写配置文件c3p0-config.xml
(该配置文件放在src目录下)
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<!-- class_db为连接的数据库名 -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/class_db?useSSL=false&serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">qwe123</property>
<!-- 连接池参数 -->
<!--初始化申请的连接数量-->
<property name="initialPoolSize">5</property>
<!--最大的连接数量-->
<property name="maxPoolSize">10</property>
<!--超时时间-->
<property name="checkoutTimeout">3000</property>
</default-config>
</c3p0-config>
最后编写java文件
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class C3P0Test {
public static void main(String[] args) throws SQLException {
//1. 获取DataSource,使用默认配置
DataSource ds = new ComboPooledDataSource();
//2.获取连接
Connection conn = ds.getConnection();
String sql = "update student set age = ? where id = ?";
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setInt(1,22);
pstm.setInt(2,22);
int count = pstm.executeUpdate();
System.out.println(count);
}
}
Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。
druid的优点
首先导入所需jar包(通过百度云盘分享给大家)
链接:https://pan.baidu.com/s/1GarY3FBSLFytnmsXxy6fQA
提取码:7eyd
编写配置文件druid.properties
driverClassName=com.mysql.cj.jdbc.Driver
#class_db为连接的数据库名
url=jdbc:mysql://localhost:3306/class_db?useSSL=false&serverTimezone=UTC
username=root
password=qwe123
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
filters=stat
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
编写java文件
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class DruidTest {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.定义配置文件
//3.加载配置文件
Properties pro = new Properties();
InputStream is = DruidTest.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.获取连接
Connection conn = ds.getConnection();
String sql = "update student set age = ? where id = ?";
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setInt(1,22);
pstm.setInt(2,22);
int count = pstm.executeUpdate();
System.out.println(count);
}
}
今天分享就到这了,希望大家有所收获,欢迎关注。