【问题标题】:Speed up a massive number of inserts into multiple databases加速对多个数据库的大量插入
【发布时间】:2016-01-03 21:34:22
【问题描述】:

我编写了一个脚本,它使用 MyBatis 向多个数据库执行大量插入操作。之前的脚本没有使用 MyBatis,而或多或少,快了两倍(100 万条记录需要 25 分钟,使用 MyBatis 需要 1 小时 10 分钟)。我尝试了不同的方法,但我不知道如何配置 MyBatis 以提高其性能。关于我的问题和解决方案的一些具体考虑:

  1. 数据库位于 VPC 中,因此网络时间很重要。
  2. 我使用 guice 为每个数据库绑定映射器。连接信息以编程方式设置。当我需要执行插入时,就会得到映射器。
  3. 需要插入的行没有排序,所以被数据库排队。当队列达到给定大小时,将执行 multirow insert。我可以通过注入的映射器使用更好的东西吗?
  4. 我使用 pooled 连接。这是否意味着第一次使用映射器然后重用时打开了3个连接?如果给定的映射器每隔几分钟才使用一次,那么这些空闲连接会被关闭吗?
  5. 有时我会随机收到此错误:

    org.apache.ibatis.transaction.TransactionException: Error configuring
    AutoCommit.  Your driver may not support getAutoCommit() or
    setAutoCommit(). Requested setting: false.
    Cause:
    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure    
    The last packet successfully received from the server was 4,030,088 milliseconds ago.
    The last packet sent successfully to the server was 0 milliseconds ago.
    

我可以做些什么来提高性能并避免通信错误?

【问题讨论】:

  • 一个明显的问题:如果以前的解决方案快得多,为什么还要使用 mybatisat?

标签: java mysql database guice mybatis


【解决方案1】:

1、你的连接池参数好像要改一下。

mysql等数据库可能会在目标时间间隔空闲时关闭连接,但连接池可能不会被注意到,所以当你的映射器使用关闭的连接时,就会发生CommunicationsException。

(1)如果你使用c3p0,你可以指定idle_test_period来解决这个问题。

(2)或者可以指定jdbcTimeout Settings(Max Wait Time、Idle Timeout)

2、连接池有minSize和maxSize属性,当你的空闲连接数大于minSize时,超出部分将被关闭。

【讨论】:

    【解决方案2】:

    我认为您必须优化 mysql 配置以进行批量插入:enter link description here 看起来 mybatis 尝试将 autocommit 设置为 false,这是一个很好的优化。 而且我认为最好通过数据库拥有一个映射器实例并使用guice创建3个数据源。

    另一种方法是使用sqlimport,但这是一个很大的突破。

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2011-09-21
      相关资源
      最近更新 更多