• 用JDBC访问ORACLE数据库 关于commit 增快效率 大数据 等的整理


    1、问:用JDBC访问ORACLE数据库,做DELETE操作,能用JAVA多线程实现吗? ORACLE服务器要怎么配?(以下答案来自网络,仅供参考)

         答: Oracle有自己的锁机制。就算你开100条线,它还是一条一条删除。不能同时删除多项的。
         对于大量数据更新,Oracle有建议一些优化措施。
         (1) 首先是把auto-commit给关闭。因为你每删一条数据,oracle就要自动执行一次commit。commit是需要资源的。所以如果你手动设置为每删数据1000条,执行一次commit. 那你就可以节省资源了。
         (2) 充分利用batch update。如果不用batch,每个delete命令都需要从网络上传送到oracle。1万个删除命令,要有1万次传送。如果将100个删除命令绑在一起送去Oracle执行。那就只要传送100次就可以了。大大缩短所需时间和网络资源。
         以上这些建议,都可以在Oracle参考里查到。

    2、问:oracle中什么操作需要commit才能保存到数据库?(以下答案来自网络,仅供参考)

         答:平时用的时候Commit、Rollback 主要用在DML(数据操纵语言) - Insert、Update、Delete 这些语句上,可以设置保存点,然后依次提交,同样也可以rollback。单独commit,是把之前的数据改动都一次提交。正常的关闭,exit是可以自动提交的,可以不用commit,直接关闭窗口,属于强制关闭,关闭之前需要commit。

    3、问:jdbc 批处理插入数据库 每100条提交一次,有余数时如何解决?(以下答案来自网络,仅供参考)

         答:

    String sql="insert into t1(id) values (?)";
    Connection con=null;
    PreparedStatement ps=null;

    con= dao.getConnection();
    ps=con.prepareStatement(sql);

     ps.addBatch();


    if(i%100==0)//每100条提交一次
    {
    ps.executeBatch();
    con.commit();
    ps.clearBatch();
    }
    改成
    if(i%100==0||i==(list.size()-1)){
    ps.executeBatch();
    con.commit();
    ps.clearBatch();
    }

    4、通过测试得到的:(来自网络,仅供参考)

         (1)、批处理要conn.setAutoCommit(false)(默认会自动提交,不能达到批处理的目的,速度极慢!)。
         (2)、pstmt.executeBatch();    //PreparedStatement pstmt
                    conn.commit();
            要提交,数据库才会有数据。
         (3)、避免内存溢出,应每x(如:万)条提交一次数据
         (4)、可用“数据库名.表名”的方法来访问数据库表
            这样,则在写JdbcUtil的DB_CONNECTION = "jdbc:mysql://localhost:3306/"时,
            可不具体到数据库,方便跨数据库的数据操作。
         (5)、Statement和PrepareStatement不仅可以操作DDL,添加删除表和数据库的sql都可以操作,用execute(String sql)方法。

    5、conn.setAutoCommit(true)和(false)的区别:(来自网络,仅供参考)

    JDBC中的这个参数

    true:sql命令的提交(commit)由驱动程序负责
    false:sql命令的提交由应用程序负责,程序必须调用commit或者rollback方法

    通过jdbc对数据库进行操作的时候,conn.commit(),可以将修改的数据提交,但是前提必须是数据库的autocommit属性为false,否则你进行一次操作后,数据库会自行commit。
    6、为什么采用批处理的方式后,没有写conn.commit()也能提交?
    答:这样可能是程序结束conn关闭导致的提交


    conn.setAutoCommit(true)是控制是否每条SQL执行完后自动提交。

    7、(一)
    1.java程序循环执行10000条sql语句,不commit,共耗时13.395s;sql*plus可以查询的到;重启sql*plus
    依然可以查询得到。
    2.在sql*plus中执行删除表中内容 delete from "TAB_orderDetail"(没有commit);然后再在此次的
    sql*plus中查询,记录数为0;但用java查询数据并没有被删除,还能查得到。但重启sql*plus,记录数仍
    为10000。这都是由于在sql*plus中执行删除表中内容时没有commit造成的。
    3.在java中执行删除表中内容 delete from "TAB_orderDetail"(没有commit),在java中再查询结果为0
    ;在sql*plus中查询结果也为0.(说明此时已经真正删除)
    (二)
    1、java程序循环执行10000条插入sql语句,不commit,共耗时7.652s。java程序循环执行10000条sql语句
    ,commit,共耗时7.595s。改为批处理后,批处理插入100000条记录,用时52.867s;批处理插入10000条记录,用时5.337s。

     
  • 相关阅读:
    centos 7 配置 keepalived,主机高可用
    centos 7 安装 nginx
    windows10 设置虚拟网卡/ip
    c#程序以管理员权限运行
    关于js中属性那些事
    centos 7 问题集锦
    几个Git仓库开源软件的比较
    grpc proto3 初体验
    windows下maven安装配置(本地仓库配置)
    navicat premium patch/keygen instruction
  • 原文地址:https://www.cnblogs.com/qingxinblog/p/3375147.html
Copyright © 2020-2023  润新知