私はMyBatis-spring + Javaを使用しました。 1回のトランザクションでテーブルに10000を超えるレコードを挿入する必要があります。それを行うために、私はマッパーを使用しました:MyBatisバルクオペレータのパフォーマンス
<insert id="saveBulk" parameterType="List">
INSERT INTO "quote" ("id", "mi_id", "timestamp", "open", "close", "low", "high", "volume", "period")
VALUES
<foreach collection="list" item="item" separator=",">
(#{item.key}, #{item.marketInstrumentKey}, #{item.timestamp}, #{item.open}, #{item.close}, #{item.low},
#{item.high}, #{item.volume}, #{item.period}::quote_period)
</foreach>
</insert>
そしてこのステートメントへのリストを渡してください。 2000〜3000レコードでは非常にゆっくりと処理されますが、10000レコードが4分以上挿入されます(タイムアウト間隔を長くする必要があります)。同じ10000レコードがPgAdmin経由で同じDBに10秒未満挿入されます。私は、この操作の処理を追跡しようとしたとのprepareStatementためStatementHandlerは数分を計算し
public int doUpdate(MappedStatement ms, Object parameter) throws SQLException {
Statement stmt = null;
try {
Configuration configuration = ms.getConfiguration();
StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null);
stmt = prepareStatement(handler, ms.getStatementLog());
return handler.update(stmt);
} finally {
closeStatement(stmt);
}
}
ボトルネック、そして数分を発見しました。 私は、なぜそれが起こるのか理解しています:各レコードに9フィールドの10000レコード。これらすべての100kフィールドは、パラメータとして文に挿入する必要があります。 このプロセスをどのように加速できますか?
UPDATE:
私はsqlFactoryと@Transactionalの "バッチ" モードで使用して保存したバッチを実装しています。 "バッチ" 方法次に
<bean id="sqlBatchTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
<constructor-arg index="1" value="BATCH"/>
</bean>
<bean id="quoteBatchMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="tafm.dataaccess.mybatis.mapper.QuoteMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
<property name="sqlSessionTemplate" ref="sqlBatchTemplate"/>
</bean>
<bean id="dataAccessBatch" class="tafm.dataaccess.DataAccess">
<property name="quoteMapper" ref="quoteBatchMapper"/>
</bean>
、私が実装しています: これはMyBatisのスプリングXMLコンフィグレーションの設定です - :
@Transactional
public void saveBulk(List<Quote> quotes) {
for(Quote q:quotes) {
mapper.save(q);
}
}
マッパーエンティティ引用のためのXMLマッパーであります
<insert id="saveBulk" parameterType="List">
INSERT INTO "quote" ("id", "mi_id", "timestamp", "open", "close", "low", "high", "volume", "period")
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(#{item.key}, #{item.marketInstrumentKey}, #{item.timestamp}, #{item.open}, #{item.close}, #{item.low},
#{item.high}, #{item.volume}, #{item.period}::quote_period)
</foreach>
</insert>
速いです。
ご使用のデータベースサーバーを教えてください。 –
私はPostgreSQL 9.4を使用しました –
以下のメソッドを試してみてください。それはあなたのために働くかもしれません。 –