gpt4 book ai didi

Java, MyBatis 3.4, 大量的批量插入实际上并没有立即存储到数据库中

转载 作者:行者123 更新时间:2023-11-30 21:54:59 24 4
gpt4 key购买 nike

任务:我需要作为一个批处理至少插入 10k 条记录。

实际上:在提交/刷新调用期间,我可以通过使用“SELECT * FROM TABLE”看到记录是由完全随机数插入的。就像它可以插入 1k,然后是 500,然后是另一个 1.5k,然后又是 500。这个批处理发生了一些非常奇怪的事情。

我有非常基本的设置,如:

<bean id="armDataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="${database.url}"/>
<property name="user" value="${database.username}"/>
<property name="password" value="${database.password}"/>
<property name="maxPoolSize" value="30"/>
<property name="idleConnectionTestPeriod" value="300"/>
<property name="maxIdleTime" value="300"/>
<property name="preferredTestQuery" value="SELECT 1"/>
<property name="testConnectionOnCheckin" value="true"/>
</bean>
<tx:annotation-driven />

<bean id="armTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="armDataSource"/>
</bean>

<bean id="armSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="armDataSource"/>
<property name="typeAliasesPackage" value="com.database.arm.model"/>
</bean>

<bean id="armSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="armSqlSessionFactory" />
<constructor-arg index="1" value="BATCH" />
</bean>

然后我有以下代码:

SqlSession sqlSession = armSqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
HeaderMapper headerMapper = sqlSession.getMapper(HeaderMapper.class);
List<List<HeaderDAO>> partitions = Lists.partition(HeaderDAOS, 10000);
partitions.forEach(partition -> {
partition.forEach(headerDAO -> {
headerDAO.setFileId(fileId);
headerMapper.insert(headerDAO);
});
sqlSession.flushStatements();
});
sqlSession.commit();
sqlSession.close();

它适用于 100 条或更少记录的小批量插入。但是一旦我走得更高,看起来 mybatis 做的不止一批。

可能是sqlSessionFactory 或template 或dataSource 的设置有问题?我尝试了很多选择,但都没有帮助。非常感谢任何意见。

最佳答案

所以我已经调试了所有堆栈,直到 mysql 驱动程序并找到了原因。默认情况下,MySQL 驱动程序实际上是在一个事务中一个一个地执行批量插入。要启用大批量插入,您需要使用属性让 mysqldriver 知道它:

rewriteBatchedStatements=true

这可以在数据源的 connectionUrl 中绕过,或者通过数据源的属性指定:

<property name="properties">
<props>
<prop key="rewriteBatchedStatements">true</prop>
</props>
</property>

P.S.: 你只需要在 MyBatis 的情况下使用它,因为例如,Hibernate 会自动完成它。

关于Java, MyBatis 3.4, 大量的批量插入实际上并没有立即存储到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45571195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com