Oracle_Day06(JDBC对事物的处理,JDBC工具类库—Apache Common-DBUtils,项目中数据访问层的处理)

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相关的方法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
操作步骤:

  1. 获取连接
  2. 开启事务
  3. 获取PreparedStatement对象
  4. 执行sql
  5. 正常情况下 提交事务
  6. 出现异常 回滚事务
  7. 释放资源
// 使用事务  完成转账操作
@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);
    }

数据库连接池技术

解决传统开发中数据库频繁连接释放的问题。

数据库连接池的思想:

就是为数据库建立一个“缓冲池”,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接的时候,从缓冲池汇总并取出一个来使用,当使用完毕之后,再将连接归还到缓冲池。

数据库连接池的作用:负责数据库连接的分配、管理、释放等工作。他允许程序重复使用一个现有的连接,而不是重新建立一个。

数据库连接池在初始化的时候就创建一定数量的连接放到连接池中,这些连接是由连接池的最小连接数来决定,无论连接是否被使用,连接都将保证在连接池中存在这最小数量的连接。当连接不满足需求的时候,他会再次创建一定数量的连接,创建的连接的上限将由最大连接数来决定。当程序的请求的连接数超过了连接池所能提供的最大连接数的时候,此时这些请求将被加入到排队队列中等待空闲连接。

数据库连接池优点:

  1. 资源的重用。
  2. 更快的系统响应。
  3. 新的资源分配手段
  4. 统一的连接管理,避免了数据库连接的泄露。

常见的数据库连接池:

JDBC连接池使用的是javax.sql , Interface DataSource 。
接口的常见实现:

  • DBCP 是Apache提供的数据库连接池。
  • C3P0 是一个开源组织提供的一个数据库连接池。速度相对DBCP要慢一些。Hibernate的默认使用技术。
  • Druid 是由阿里提供的一个数据库连接池,集DBCP和C3P0的优点与一身

DataSource通常被称为数据源。他包含了数据库连接池的创建和管理两部分工作。
使用中,我们将使用DataSource来取代DriverManager获取数据库连接Connection 从而提高数据库的访问速度
当使用数据库连接池获取到的连接在调用Connection的close方法的时候 ,不在是直接将连接关闭,而是将连接归还到连接池。

连接池的使用:

C3P0的使用步骤:
  1. 导包:
    在这里插入图片描述
  2. 配置连接池
  3. 创建数据源对象
  4. 获取连接
//使用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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值