JDBC-2
数据库连接池
JDBC Template
数据库连接池
为什么要使用数据库连接池?
原本的逻辑是,用户访问数据库要先向操作系统请求连接,访问完数据库把连接删除
这样的效率十分低下
数据库连接池就可以解决这个问题,它把所有的连接放在一个容器当中,当用户访问完成时就会归还连接到这个容器中,效率更高
概念
一个存放数据库连接的容器
当系统初始化好后,容器被创建,容器中会申请一些连接对象,
当用户来访问数据库时,从容器中获取连接对象,
用户访问完成后,会将连接对象归还给容器
好处:
- 节约资源
- 高效
DataSource
DataSource接口由驱动程序供应商实现。
包路径
1 | javax.sql |
方法
- 获取连接
1
getConnection()
- 归还连接
1
2close()
//如果连接对象是连接池提供的,那么close方法将不再关闭连接,而是归还连接
两个数据库连接池
C3P0(旧的技术)
基本使用:
- 导入两个jar包(JDBC的jar包也要导入)
c3p0-0.9.5.2
mchange-commons-java-0.2.12
- 定义配置文件
- 配置文件通常在应用程序类路径顶层的标准名称
c3p0.properties或c3p0-config.xml
下查找 - 路径:直接将文件放在src目录下即可
- 配置文件通常在应用程序类路径顶层的标准名称
- 创建核心对象 数据库连接池对象 ComboPooleDataSource
- 获取连接:getConnectionc3p0-config.xml配置文件
1
2
3
4
5
6
7
8public static void main(String[] args) throws SQLException {
//1. 创建数据库连接对象
DataSource ds= new ComboPooledDataSource();
//2. 获取连接对象
Connection conn = ds.getConnection();
//3. 打印
System.out.println(conn);
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/database?serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">1046qwer.</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.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/database?serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">1046qwer.</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
Druid(阿里巴巴提供)
步骤:
- 导入jar包
- 定义配置文件
- 是properties形式的
- 可以称任意名称,可以放在任意目录下
- 加载配置文件
- 获取数据库连接池对象:通过一个工厂类来获取
DruidDataSourceFactory
- 获取连接
getConnection
示例代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public class druid {
public static void main(String[] args) throws Exception {
//1. 导入jar包
//2. 定义配置文件
//3. 加载配置文件
Properties pro = new Properties();
InputStream is = druid.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4. 获取连接对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5. 获取连接
Connection conn = ds.getConnection();
System.out.println(conn);
}
}定义工具类
准备一个JDBCUtils类
内部要有
- 静态代码块加载配置文件
- 获取连接方法
- 释放资源
- 获取连接池的方法使用工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68/**
* @author BlackKnight
* 工具类
*/
public class JdbcUtils {
private static DataSource ds;
static {
//1. 加载配置文件
try {
Properties pro = new Properties();
pro.load(JdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接
*
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
/**
* 释放资源
* @param stmt
* @param conn
*/
public static void close(Statement stmt, Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet rs, Statement stmt, Connection conn) {
close(null,stmt,conn);
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static DataSource getDataSource(){
return ds;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public class druid {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement preStat = null;
try {
conn = JdbcUtils.getConnection();
String sql = "insert into deliver values(1,?,?)";
preStat = conn.prepareStatement(sql);
preStat.setString(1,"李白");
preStat.setString(2,"3000");
int i = preStat.executeUpdate();
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.close(preStat,conn);
}
}
}
Spring JDBC
Spring框架提供的对JDBC简单封装
提供了一个JDBCTemplate对象简化JDBC的开发
步骤:
- 导入jar包
- 创建JDBCTemplate对象,依赖于数据源DataSource
JdbcTemplate template = new JdbcTemplate(ds)
- 使用JDBCTemplate方法完成CRUD操作
update()
执行DML语句queryForMap()
查询结果,将结果封装为Map集合queryForList()
查询结果将结果封装为List集合query()
查询结果,将结果封装为JavaBean对象queryForObject
查询结果,将结果封装为对象
示例代码
1 | public class JdbcTemplateDemo { |