将大量插入加速到多个数据库中

时间:2016-01-03 21:34:22

标签: java mysql database guice mybatis

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

  1. 数据库位于VPC中,因此网络时间非常重要。
  2. 我使用 guice 绑定每个数据库的映射器。连接信息以编程方式设置。当我需要执行插入时,映射器就会被获取。
  3. 需要插入的行未排序,因此它们按数据库排队。当队列达到给定大小时,将执行多行插入。我可以使用注入的映射器更好地使用它吗?
  4. 我使用合并连接。这是否意味着首次使用映射器然后重用时会打开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.
    
  6. 如何提高性能并避免通信错误?

2 个答案:

答案 0 :(得分:1)

1,您似乎需要更改连接池参数。

mysql这样的数据库可能会在空闲一段时间后关闭连接,但是连接池可能没有被注意到,所以当你的映射器使用关闭的连接时,会发生CommunicationsException。

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

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

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

答案 1 :(得分:0)

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

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