JDBC学习日志五,JDBC操作事务

事务:要么成功,要么失败

ACID原则

原子性:要么全部完成,要么都不完成

一致性:最终的结果总数据不发生改变

隔离性:多个进程互不干扰

持久性:数据一旦提交不可逆,持久化到数据库

模拟转账事务

//模拟转账
 public class TransferDemo {
     public static void main(String[] args) throws SQLException {
         //connection代表数据库
         Connection connection = null;
         PreparedStatement st = null;
         try {
             connection = JdbcUtil.getConnection();
             //1.手动设置关闭自动提交事务,此时,事务自动开启
             connection.setAutoCommit(false);
             String sql1 = "update account set money = money - 100 where `name` = 'A';";
             st = connection.prepareStatement(sql1);
             st.executeUpdate();
             int num = 1/0;//强制制造问题
             String sql2 = "update account set money = money + 100 where `name` = 'B';";
             st = connection.prepareStatement(sql2);
             st.executeUpdate();
             //2.提交数据
             connection.commit();
             System.out.println("转账成功");
         } catch (SQLException e) {
             //数据出现问题,事务会自动回滚到原来的样子,这里可以不用设回滚
             try {
                 connection.rollback();
             } catch (SQLException ex) {
                 ex.printStackTrace();
             }
         }finally {
             JdbcUtil.release(connection,st,null);
 ​
         }
 ​
     }

问题:每次连接数据库都需要消耗大量的资源,效率低

解决:创建一个连接池。每次应用程序需要从数据库获取数据时,直接从连接池中申请一个连接使用,用完之后连接池回收连接,从而达到连接复用的效果,并减少资源消耗的目的

本质:准备一些预先的资源,过来就直接连接预先准备好的(池化技术)

开源的连接池项目:

  • DBCP

  • D3P0

  • Druid

使用了这些数据库连接池,我们就不需要编写连接数据库的代码

DBCP

 InputStream rs = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
             Properties properties = new Properties();
             properties.load(rs);
             //获取数据源 BasicDataSourceFactory  工厂:用来创建对象的
                 dataSource = BasicDataSourceFactory.createDataSource(properties);

总结:无论用什么连接源,本质还是一样的,DataSource接口不会变,获取connection方法就不会变

狂神说MySQL

posted @ 2023-05-15 14:24  YE-  阅读(17)  评论(0编辑  收藏  举报