我编写了一个脚本,使用MyBatis在多个数据库中执行大量插入操作。以前的脚本没有使用MyBatis,或多或少,快两倍(一百万条记录25分钟,使用MyBatis一小时10分钟)。我尝试了不同的东西,但我不确切知道如何配置MyBatis以提高其性能。关于我的问题和解决方案的一些具体考虑因素:
有时我会随机收到此错误:
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.
如何提高性能并避免通信错误?
答案 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,但这是一个很大的突破。