• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

mysql数据库批量快速插入_MySQL

mysql 搞代码 4年前 (2022-01-09) 19次浏览 已收录 0个评论

最近在处理一批数据,需要从库中表里的字段进行处理然后导出到一个新表中。不过这个表的数据量有近500w条。这数据量出现的的问题是需要处理的时间好长。
首先想到,一句一句的插入,大数据量处理时间好长,忽略。
其次想到,多线程插入,想到数据库连接是需要同步的所以感觉用处不大。
最后想到,使用 PreparedStatement 预编译sql 进行批量插入 batch 处理。
好吧,现在就进行批处理插入测试。
1、使用简单的 batch

<code class="language-java hljs ">public static void main(String[] args) {        Connection conn = getConn(lsqlurl, luser, lpassword);        long startTime = System.currentTimeMillis();        try {            PreparedStatement pst = conn.prepareStatement("insert into testmy (id,name,age) values (?,?,?)");            for (int i = 0; i 2000.....");        } catch (SQLException e) {            e.printStackTrace();        }finally {            if(conn!=null) {                try {                    conn.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }        }    }</code>

你会发现时间会是30s 左右。
2k行的数据插入就30秒 。
2w行数据插入时间为940秒(约16min)。

2、修改自动提交的 batch

<code class="language-java hljs "><code class="language-java hljs ">public static void main(String[] args) {        Connection conn = getConn(lsqlurl, luser, lpassword);        long startTime = System.nanoTime();        try {            conn.setAutoCommit(false);            PreparedStatement pst = conn.prepareStatement("insert into test (id,name,age) values (?,?,?)");            for (int i = 0; i 2000.....");        } catch (SQLException e) {             try {                conn.rollback();            } catch (SQLException e1) {                e1.printStackTrace();            }            e.printStackTrace();        }finally {            if(conn!=null) {                try {                    conn.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }        }    }</code></code>

2k行插入耗时大概是260ms。
2w行数据插入大概是1.4s。
其实结果很明显的。

因为在使用batch时数据量达到一定的值后数据库会自动提交。而不是你执行executeBatch时再执行。所以我们需要修改自动提交变成手动提交。
这里还有一个问题是:当你实在执行事务时,一旦出错的时候,自动提交会帮你rollback,手动提交时就应该自己进本文来源gao@dai!ma.com搞$代^码!网7行回退。
所以在catch里需要添加 rollback 。

好了,综上我们可以使用自动提交的batch进行大量数据的插入。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:mysql数据库批量快速插入_MySQL
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址