IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 事务,批处理,连接池概述 -> 正文阅读

[大数据]事务,批处理,连接池概述

1.JDBC程序中当一个Connection对象创建时,默认情况下是自动提交事务:每次执行一个SQL语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
2.JDBC程序中为了让多个SQL语句作为一个整体执行,需要使用事务
3.调用Connection的setAutoCommit(false)可以取消自动提交事务
4.在所有的SQL语句都成功执行后,调用Connection.commit0:方法提交事务
5.在其中某个操作失败或出现异常时,调用Connection.rollback0:方法回滚事务

转账模拟

未使用事务

    @Test
    public void NTransaction(){
        Connection connection=null;
        PreparedStatement ps=null;
        String sql1="update account set balance=balance-100 where id=1";
        String sql2="update account set balance=balance+100 where id=2";
        try {
            connection=JDBCUtils.getConnection();
            //执行第一句
            ps=connection.prepareStatement(sql1);
            ps.executeUpdate();
            //这里会抛出一个异常,导致下面的语句不再执行,数据库中就会发生错误
            int i=1/0;
            //执行第二句
            ps=connection.prepareStatement(sql2);
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(null,ps,connection);
        }
    }

使用事务

    @Test
    public void YTransaction() throws SQLException {
        Connection connection=null;
        PreparedStatement ps=null;
        String sql1="update account set balance=balance-100 where id=1";
        String sql2="update account set balance=balance+100 where id=2";

        try {
            connection=JDBCUtils.getConnection();
            //将connection设为不自动提交,相当于开启事务
            connection.setAutoCommit(false);
            ps=connection.prepareStatement(sql1);
            ps.executeUpdate();
            //int i=1/0;
            ps=connection.prepareStatement(sql2);
            ps.executeUpdate();
            //在这里提交事务
            connection.commit();
        }catch (SQLException e) {
            System.out.println("发生异常,撤销操作");
            //在这里回滚事务
            connection.rollback();
            e.printStackTrace();
        }finally {
            JDBCUtils.close(null,ps,connection);
        }
    }

批处理

1.当需要成批插入或者更新记录时。.可以采用Jav的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率。
2.JDBC的批量处理语句包括下面方法:
addBatch():添加需要批量处理的SQL语句或参数
executeBatch():执行批量处理语句;
clearBatch():清空批处理包的语句
3.JDBC连接MySQL时,如果要使用批处理功能,需要在配置文件的rul后面写上这一句

?rewriteBatchedStatements=true
4.批处理往往和PreparedStatement-一起搭否配使用,可以既减少编译次数,又减少运行次数,效率大太提高

    @Test
    public void add() throws SQLException {
        Connection cc=null;
        PreparedStatement ps=null;
        String sql="insert into account values(null,?,?)";
        cc=JDBCUtils.getConnection();
        ps=cc.prepareStatement(sql);
        for (int i = 1; i <=5000; i++) {
            ps.setString(1,""+i);
            ps.setString(2,""+i);
            //传统方法ps.executeUpdate();
            //批处理
            ps.addBatch();
            if (i%1000==0){
                //每一千条处理一次
                ps.executeBatch();
                //清空
                ps.clearBatch();
            }
        }
        JDBCUtils.close(null,ps,cc);
    }

连接池

1.传统的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载到内存中,再验证IP地址,用户名和密码(0.05s~1s时间)。需要数据库连接的时候,就向数据库要求一个,频繁的进行数据库连接操作将占用很多的系统资源,容易造成服务器崩溃。
2.每一次数据库连接,使用完后都得断开,如果程序出现异常而未能关闭,将导致数据库内存泄漏,最终将导致重启数据库。
3.传统获取连接的方式,不能控制创建的连接数量,如连接过多,也可能导致内存泄漏,MySQL崩溃。
4.解决传统开发中的数据库连接问题,可以采用数据库连接池技术

原理

1.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

2.数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
3.当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中

连接池的种类

1.JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由第三方提供实现
2.C3P0数据库连接池,速度相对较慢,稳定性不错(hibernate,spring)
3.DBCP数据库连接池,速度相对c3p0较快,但不稳定
4.Proxool数据库连接池,有监控连接池状态的功能,稳定性较c3pO差一点
5.BoneCP数据库连接池,速度快
6.Druid(德鲁伊)是阿里提供的数据库连接池,集DBCP、C3PO、Proxool优点于一身的数据库连接池

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 23:15:00  更:2022-04-06 23:16:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:59:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码