Oracle_Day06(JDBC对事物的处理,JDBC工具类库—Apache Common-DBUtils,项目中数据访问层的处理)
JDBC对事物的处理
数据准备:
CREATE TABLE account(
id number(10),
name varchar2(20),
balance number(10,2)
)
--插入数据
insert into account values(1,'jack',1000.00);
insert into account values(2,'rose',1000.00);
--查询
SELECT * FROM account;
主要API
与Connection相关的方法:
操作步骤:
- 获取连接
- 开启事务
- 获取PreparedStatement对象
- 执行sql
- 正常情况下 提交事务
- 出现异常 回滚事务
- 释放资源
// 使用事务 完成转账操作
@Test
public void testTx() {
//1 获取连接
Connection conn = JDBCUtils.getConnection();
PreparedStatement ps = null;
try {
// 开启事务 将事务的提交设置为手动模式
conn.setAutoCommit(false);
// 2 获取PreparedStatement
String sql1 = "update account set balance = balance - ? where id=?";
ps = conn.prepareStatement(sql1);
//3 绑定参数
ps.setDouble(1,200);
ps.setInt(2,1);
ps.executeUpdate();
// 出现异常
System.out.println(1/0);
String sql2 = "update account set balance = balance + ? where id=?";
ps = conn.prepareStatement(sql2);
ps.setDouble(1,200);
ps.setInt(2,2);
ps.executeUpdate();
//提交事务
conn.commit();
System.out.println("转账成功");
} catch (Exception e) {
e.printStackTrace();
try {
//回滚事务
conn.rollback();
} catch (SQLException se){
se.printStackTrace();
}
System.out.println("转账失败");
}finally {
JDBCUtils.close(ps,conn);
}
数据库连接池技术
解决传统开发中数据库频繁连接释放的问题。
数据库连接池的思想:
就是为数据库建立一个“缓冲池”,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接的时候,从缓冲池汇总并取出一个来使用,当使用完毕之后,再将连接归还到缓冲池。
数据库连接池的作用:负责数据库连接的分配、管理、释放等工作。他允许程序重复使用一个现有的连接,而不是重新建立一个。
数据库连接池在初始化的时候就创建一定数量的连接放到连接池中,这些连接是由连接池的最小连接数来决定,无论连接是否被使用,连接都将保证在连接池中存在这最小数量的连接。当连接不满足需求的时候,他会再次创建一定数量的连接,创建的连接的上限将由最大连接数来决定。当程序的请求的连接数超过了连接池所能提供的最大连接数的时候,此时这些请求将被加入到排队队列中等待空闲连接。
数据库连接池优点:
- 资源的重用。
- 更快的系统响应。
- 新的资源分配手段
- 统一的连接管理,避免了数据库连接的泄露。
常见的数据库连接池:
JDBC连接池使用的是javax.sql , Interface DataSource 。
接口的常见实现:
- DBCP 是Apache提供的数据库连接池。
- C3P0 是一个开源组织提供的一个数据库连接池。速度相对DBCP要慢一些。Hibernate的默认使用技术。
- Druid 是由阿里提供的一个数据库连接池,集DBCP和C3P0的优点与一身
DataSource通常被称为数据源。他包含了数据库连接池的创建和管理两部分工作。
使用中,我们将使用DataSource来取代DriverManager获取数据库连接Connection 从而提高数据库的访问速度
当使用数据库连接池获取到的连接在调用Connection的close方法的时候 ,不在是直接将连接关闭,而是将连接归还到连接池。
连接池的使用:
C3P0的使用步骤:
- 导包:
- 配置连接池
- 创建数据源对象
- 获取连接
//使用C3P0数据库连接池获取连接
@Test
public void getConnectionByC3p0() throws PropertyVetoException, SQLException {
// 获取数据源
ComboPooledDataSource ds = new ComboPooledDataSource();
// 设置连接属性
ds.setDriverClass("oracle.jdbc.driver.OracleDriver");
ds.setJdbcUrl("jdbc:oracle:thin:@192.168.25.129:1521:orcl");
ds.setUser("scott");
ds.setPassword("tiger");
// 获取连接
for(int i = 0 ; i < 5;i++){
Connection conn = ds.getConnection();
System.out.println(conn);
}
}
使用C3P0的配置文件来获取连接
//使用C3P0的配置文件来配置数据库连接池
@Test
public void getConnection2() throws SQLException {
ComboPooledDataSource ds = new ComboPooledDataSource();
for(int i = 0 ; i < 5;i++){
Connection conn = ds.getConnection();
System.out.println(conn);
}
}
配置文件 默认的文件名c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<!-- 超时时间 毫秒-->
<property name="checkoutTimeout">30000</property>
<!-- 初始化连接数-->
<property name="initialPoolSize">10</property>
<!-- 最大空闲数-->
<property name="maxIdleTime">30</property>
<!-- 最大连接数-->
<property name="maxPoolSize">100</property>
<!-- 最小连接数-->
<property name="minPoolSize">10</property>
<!-- 每个连接随支持 最大的statement对象-->
<property name