• 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. }

  • 相关阅读:
    Flink Window&Time 原理
    Springboot vue elementui 医院管理系统案例源码
    贪心算法之活动安排
    Arduino esp8266 SerialEvent函数使用注意事项
    EWM 分布式交货单部分过账回传ECC配置点
    【大话云原生】kubernetes灰度发布篇-从步行到坐缆车的自动化服务升级
    单元测试Testng
    HTML制作一个介绍自己家乡的网站——贵阳,排版整洁,内容丰富,主题鲜明
    Android 10 状态栏通知图标和下拉状态栏图标为白色问题
    OpenCV项目开发实战--实现使用面部标志在脸上覆盖面具--附完整源码
  • 原文地址:https://blog.csdn.net/weixin_63954483/article/details/126509564