Java 之 数据库连接池
2024-10-20 20:47:53
一、数据库连接池
1、连接池概念
连接池其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问之后,会将连接对象归还给容器
2、连接池好处
① 节约资源(不必没连接一次数据都去创建一个 Connection 对象)
② 用户访问高效(每次连接只需要从数据库连接池中获取连接即可,不用等待连接数据库的漫长过程)
3、实现
(1)标准接口:DataSource 在 javax.sql 包下
常用方法:
获取连接:getConnection()
归还连接:Connection.close()。如果连接对象
Connection 是从连接池中获取的,那么调用 Connection.close() 方法,则不会再关闭连接了,而是归还连接。
(2)接口的实现,一般不需要我们去实现,有数据库厂商来实现
① C3P0:数据库连接池技术
② Druid:数据库连接池技术,由阿里巴巴提供
二、C3P0 连接池
1、C3P0 数据库连接池技术实现步骤
1. 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar (注意:因为是连接数据库,不要忘记导入数据库驱动 jar 包)
2. 定义配置文件:
名称:c3p0.properties 或 c3p0-config.xml(名字必须为这两个中一个,因为会自动加载配置文件)
路径:直接将文件放置 src 目录下即可。
3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
4. 获取连接:getConnection()
代码实现:
public static void main(String[] args) throws SQLException {
// 创建数据库连接对象
DataSource ds = new ComboPooledDataSource(); // 会自动去加载配置文件 //获取连接对象
Connection conn = ds.getConnection(); // 打印连接对象
System.out.println(conn); // 归还对象
conn.close();
}
2、导入的 jar 包
3、配置文件
c3p0-config.xml 配置文件
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/bookstore</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/bookstore</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>
注意:在配置文件中可以连接多个不同的数据库,用<name-config> 声明即可,到时候使用 name 属性来调用即可,如果没有指定 name,那么调用默认的数据库。
Demo:
public static void main(String[] args) throws SQLException {
// 创建数据库连接对象
//DataSource ds = new ComboPooledDataSource(""); //连接默认的数据库
DataSource ds = new ComboPooledDataSource("otherc3p0"); //连接 name=otherc3p0数据库 //2 获取连接
Connection conn = ds.getConnection(); Statement stmt = conn.createStatement(); // 3.归还连接
conn.close(); }
三、Druid 连接池
1、Druid 数据库连接池技术实现步骤
1. 导入 jar 包druid-1.0.9.jar
2. 定义配置文件
名称:是properties 形式的,需要手动加载
路径:可以放在任意目录下(建议放在src目录下)
3. 加载配置文件 properties
4. 获取数据连接池对象:通过工厂来获取 DruidDataSourceFactory
5. 获取连接:getConnection
6. 归还连接:close()
代码实现:
public class DruidDemo1 {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.定义配置文件 //3.加载配置文件
Properties prop = new Properties();
InputStream is = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties");
prop.load(is); //4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(prop); //5.获取连接
Connection conn = ds.getConnection();
System.out.println(conn); // 6.归还连接
conn.close();
}
}
2、导入 jar 包
3、配置文件
druid.properties 文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/bookstore
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 延迟时间
maxWait=3000
4、Druid 连接池的工具类
可以将数据库连接池封装成一个工具类,这样在获取的连接的时候,直接拿来用即可,不用再创建连接池,更加方便。
import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; /**
* Druid 连接池的工具类
*/
public class JDBCUtils { // 1.定义成员变量
private static DataSource ds; static {
//加载配置文件
Properties pro = new Properties();
try {
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
// 2 获取datasource
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} } /**
* 获取连接
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
} /**
* 释放资源
*/
public static void close(Statement stmt, Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} public static void close(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} /**
* 获取连接池方法
*/
public static DataSource getDataSource() {
return ds;
}
}
最新文章
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
- JS---如何避免用户在请求时“猛击”
- Homework 3
- JS操作select下拉框动态变动(创建/删除/获取)
- HDU 1082
- Delphi XML-RPC 中文乱码解决方法
- Niagara解决设备连接应用的软件框架平台技术。
- html历史
- 用Eclipse 统计代码行数小技巧
- Scala学习笔记:重要语法特性
- jquery复制值到剪切板(clipboard.js)
- Nodejs mongoose 详解
- Redis实现文章投票功能
- python--第三天总结
- win10 安装IIS说明操作
- 20162328蔡文琛 week11 大二
- find命令之exec和xargs
- boost.asio源码剖析(三) ---- 流程分析
- PHP之变量范围
- 【Xamarin】Visual Studio 2013 Xamarin for iOS 环境搭建
热门文章
- ACR Code Pacs
- unity2019新建LWRP项目出错:Failed to resolve project template
- Nginx简单配置几个基于端口的虚拟主机
- SpringBoot过滤XSS脚本攻击
- WebGL学习笔记(五):变换库
- SVN限制普通用户删除文件及提交时必须填写log日志
- [LeetCode] 128. Longest Consecutive Sequence 求最长连续序列
- [LeetCode] 675. Cut Off Trees for Golf Event 为高尔夫赛事砍树
- git删除远程.idea目录
- React与Vue的比对