连接池
现有问题
- 每次操作数据库都需要重新获取新连接,使用完毕后需close释放,频繁的创建和销毁造成资源浪费
- 连接的数量无法把控,对服务器造成巨大压力
连接池
- 连接池是数据库连接对象的缓冲区,通过配置,由连接池负责创建连接,管理连接,释放连接等操作
- 预先创建数据库连接放入连接池,用户在请求时,通过连接池直接获取连接,使用完毕后,将连接放回池中,避免了频繁的创建和销毁,同时解决了创建效率
- 当池中无连接可用,且达到上退时,连接池会新建连接
- 池中连接达到上限,用户请求会等待,可以设置超时时间
常见连接池
- JDBC数据库连接池使用javax.sql.DataSource接口进行规范,所有的第三方连接池都实现此接口,自行添加具体实现,所有连接池获取连接和回收连接方法都一样,不同的只有性能和扩展功能
- DBCP是Apache提供的数据库连接池,速度相对C3P0较快,但自身有一些Bug
- C3P0是一个开源组织提供的数据库连接池,速度相对较慢,稳定性比较好
- Proxool是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点
- Druid:阿里提供的数据库连接池,是集DBCP,C3P0,Proxool优点于一身的数据库连接池,性能,扩展性,易用性都更好,功能丰富
- Hikari:是SpringBoot2.x之后内置的一款连接池,基于BoneCP做了不少改进和优化,口号是简单,快速,可靠
Druid使用
硬编码
public void testHardCodeDruid() throws SQLException {
/**
* 将连接池的配置和Java代码耦合在一起
* 1.创建DruidDataSource连接池对象
* 2.设置连接池的配置信息
* 3.通过连接池获取连接对象
* 4.回收连接
*/
String url = "jdbc:mysql://192.168.29.201:3306/jdbc?rewriteBatchedStatements=true";
String username = "root";
String password = "123456";
//1.
DruidDataSource dataSource = new DruidDataSource();
//2.1必须设置配置
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
//2.2非必要设置
dataSource.setInitialSize(10);//默认创建10个连接对象
dataSource.setMaxActive(20); //最大连接数量
//3.
Connection connection = dataSource.getConnection();
System.out.println(connection);
//基于Connection进行CRUD
//4.归还连接
connection.close();
}
软编码
- 注:需要将resources文件夹标记为资源文件夹,否则通过getResourceAsStream获取时会获取不到
//db.properties
driverName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://192.168.29.201:3306/jdbc?rewriteBatchedStatements=true
username=root
password=123456
initialSize=10
maxActive=20
@Test
public void testSoftCodeDruid() throws Exception {
//创建properties用于存放配置文件的key和value值
Properties properties = new Properties();
//读取配置文件,获取输入流,加载到properties集合
InputStream is = DruidTest.class.getClassLoader().getResourceAsStream("db.properties");
properties.load(is);
//基于properties集合构建DruidDataSource连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//获取连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
//释放连接
connection.close();
}
HikariCP
- 需要引入两个包
硬编码
/**
* 将连接池的配置和Java代码耦合在一起
* 1.创建HikariDataSource连接池对象
* 2.设置连接池的配置信息
* 3.通过连接池获取连接对象
* 4.回收连接
*/
@Test
public void testHardCodeHikari() throws SQLException {
String url = "jdbc:mysql://192.168.29.201:3306/jdbc?rewriteBatchedStatements=true";
String username = "root";
String password = "Lotus!1120";
//1.
HikariDataSource dataSource = new HikariDataSource();
//2.1必须设置配置
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setJdbcUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
//2.2非必要设置
dataSource.setMinimumIdle(10);//创建最小10个连接对象
dataSource.setMaximumPoolSize(20); //最大连接数量
//3.
Connection connection = dataSource.getConnection();
System.out.println(connection);
//基于Connection进行CRUD
//4.归还连接
connection.close();
}
软编码
//hikari.properties---放到resource目录下
driverClassName=com.mysql.cj.jdbc.Driver
jdbcUrl=jdbc:mysql://192.168.29.201:3306/jdbc?rewriteBatchedStatements=true
username=root
password=Lotus!1120
minimumIdle=10
maximumPoolSize=20
@Test
public void testSoftCodeHikari() throws Exception {
//创建properties用于存放配置文件的key和value值
Properties properties = new Properties();
//读取配置文件,获取输入流,加载到properties集合
InputStream is = HikariTest.class.getClassLoader().getResourceAsStream("hikari.properties");
properties.load(is);
//创建HikariConfig连接池配置对象,将Properties集合传递进去
HikariConfig hikariConfig = new HikariConfig(properties);
//基于HikariConfig连接池配置对象,构建HikariDataSource
HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);
//获取连接
Connection connection = hikariDataSource.getConnection();
System.out.println(connection);
//释放连接
connection.close();
}
标签:JDBC,Java,properties,学习,connection,jdbc,dataSource,连接,连接池
From: https://blog.csdn.net/xuwenpeng/article/details/139562017