私はカフカについてよく知らないので、疑似コードを書いています。
最初の読み取り時に、Mybatisのデフォルトの動作では、結果がリストに返されますが、3百万個のオブジェクトをメモリにロードすることは望ましくありません。 MyBatisのグローバル設定で定義された値がない場合:(@Option(fetchSize=500)
注釈ベースマッパーを使用した場合)これは、文のfetchSize
を設定org.apache.ibatis.session.ResultHandler<T>
public void handleResult(final ResultContext<YourType> context) {
addToKafkaQueue(context.getResultObject());
}
のカスタム実装を使用してオーバーライドする必要があります。 letを設定しない場合、このオプションはデフォルトでドライバの値に依存し、すべてのDBベンダーに依存します。これは、一度に結果セットにバッファされるレコードの量を定義します。例:Oracleの場合、この値は10です:アプリからDBへの操作を多く読み取るために、一般に低すぎます。 PostgreSQLの場合、これは無制限(結果セット全体)ですが、あまりにも多くなります。あなたは、速度とメモリ使用量の間の適切なバランスを把握しなければなりません。更新のために
:
do {
YourType object = readFromKafkaQueue();
mybatisMapper.update(object);
} while (kafkaQueueHasMoreElements());
sqlSession.flushStatement(); // only when using ExecutorType.BATCH
最も重要なのはその意志デフォルトExecutorType.SIMPLE
またはExecutorType.BATCH
と反復ごとに一度だけ文を準備する代わりにできるようになりますExecutorType
(これはSessionFactory.openSession()
で引数である)のいずれかであるExecutorType.REUSE
ステートメントをスタックし、実際にはそれらを単にフラッシュするだけです。
ここではトランザクションについて考える必要があります。これは、3百万回の更新をコミットするか、またはセグメント化することが必要な場合があります。
情報は、単なるリンクではなく、回答に追加してください。リンクが消えることがあります。 – user3486184