• java(事务和批处理)


    事务:

    1.JDBC程序中当一个Connection对象创建时,默认情况下是自动提交事务;每次执行一个SQL语句时,如果执行成功,就会向数据库自动提交,而不能回滚

    2.JDBC程序中为了让多个SQL语句作为一个整体执行,需要使用事务

    3.调用Connection的setAutoCommit ( false )可以取消自动提交事务

    4.在所有的SQL语句成功执行后,调用commit()方法提交事务

    5.在其中某个操作失败或出现异常时,调用rollback()方法回滚事务

    1. public class Transaction {
    2. @Test
    3. public void useTransaction() {
    4. Connection connection = null;
    5. String sql1 = "update account set balance=balance-100 where id=1";
    6. String sql2 = "update account set balance=balance+100 where id=2";
    7. PreparedStatement preparedStatement = null;
    8. try {
    9. connection = JdbcUtils.getConnection();
    10. //将connection设置为不自动提交
    11. connection.setAutoCommit(false)
    12. //执行第一条SQL语句
    13. preparedStatement = connection.prepareStatement(sql1);
    14. preparedStatement.executeUpdate();
    15. //执行第二条SQL语句
    16. preparedStatement = connection.prepareStatement(sql2);
    17. preparedStatement.executeUpdate();
    18. //最后进行提交
    19. connection.commit();
    20. } catch (SQLException e) {
    21. System.out.println("执行发生了异常,撤销执行的SQL...");
    22. //这里可以进行回滚,即撤销执行的SQL
    23. try {
    24. connection.rollback();
    25. } catch (SQLException ex) {
    26. ex.printStackTrace();
    27. }
    28. e.printStackTrace();
    29. } finally {
    30. JdbcUtils.closeResource(null, preparedStatement, connection);
    31. }
    32. }
    33. }

    批处理:

    1.当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理,通常情况下比单独提交处理更有效率

    2.JDBC的批量处理语句包括下面方法:

            addBatch():添加需要批量处理的SQL语句或参数

            executeBatch():执行批量处理语句

            clearBatch():清空批处理包的语句

    3.JDBC连接Mysql时,如果要使用批处理功能,需要在url中加参数:rewriteBatchedStatements=true

    4.批处理往往和PreparedStatement一起搭配使用,可以既减少编译次数,又减少运行次数,效率提高

    1. public class Batch {
    2. @Test
    3. public void batch() throws Exception{
    4. Connection connection = JdbcUtils.getConnection();
    5. String sql = "insert into admin values(?,?)";
    6. PreparedStatement preparedStatement = connection.prepareStatement(sql);
    7. long start = System.currentTimeMillis();
    8. for (int i = 0; i < 5000; i++) {
    9. preparedStatement.setInt(1,i);
    10. preparedStatement.setString(2,"jack"+i);
    11. //将sql语句加入到批处理包中
    12. preparedStatement.addBatch();
    13. //当有1000条记录时,再批量执行
    14. if ((i+1)%1000 == 0){
    15. preparedStatement.executeBatch();
    16. //清空
    17. preparedStatement.clearBatch();
    18. }
    19. }
    20. long end = System.currentTimeMillis();
    21. System.out.println(end-start);
    22. JdbcUtils.closeResource(null,preparedStatement,connection);
    23. }
    24. }

  • 相关阅读:
    Nginx负载均衡&反向代理&动静分离
    javascript的键值对的问题
    【答读者问54】谈一谈backtrader在多品种跨周期调用数据的时候面临的坑以及是否选择使用resample的问题
    【SpringBoot+微信小程序】公交线路查询系统(源码+远程部署+代码讲解+答辩教学)
    JVM系列:JDK、JRE、JVM 的关系
    Pytorch实现基于LSTM的情感分析
    阿里巴巴微服务架构中模块和模块之间的方法调用一般用什么方式?
    UDP内核发包流程
    007.复原 IP 地址
    C++ 中 API 兼容与 ABI 兼容万字详解
  • 原文地址:https://blog.csdn.net/weixin_63954483/article/details/126509564