私はアプリケーションの遅延に敏感な部分に取り組んでいます。基本的に、ネットワークイベントを受信してデータを変換し、すべてのデータをDBに挿入します。プロファイリングした後、基本的にすべての時間がデータの保存に費やされていることがわかりました。ここにコードがあります
private void insertAllData(Collection<Data> dataItems)
{
long start_time = System.currentTimeMillis();
long save_time = 0;
long commit_time = 0;
Transaction tx = null;
try
{
Session s = HibernateSessionFactory.getSession();
s.setCacheMode(CacheMode.IGNORE);
s.setFlushMode(FlushMode.NEVER);
tx = s.beginTransaction();
for(Data data : dataItems)
{
s.saveOrUpdate(data);
}
save_time = System.currentTimeMillis();
tx.commit();
s.flush();
s.clear();
}
catch(HibernateException ex)
{
if(tx != null)
tx.rollback();
}
commit_time = System.currentTimeMillis();
System.out.println("Save: " + (save_time - start_time));
System.out.println("Commit: " + (commit_time - save_time));
System.out.println();
}
コレクションのサイズは常に 20 未満です。次のタイミング データが表示されます。
Save: 27
Commit: 9
Save: 27
Commit: 9
Save: 26
Commit: 9
Save: 36
Commit: 9
Save: 44
Commit: 0
これは私を混乱させます。は迅速であるsave
べきであり、すべての時間を に費やさなければならないと考えていcommit
ます。しかし、明らかに私は間違っています。また、トランザクションを削除しようとしましたが(実際には必要ありません)、さらに悪い時間を見ました... hibernate.jdbc.batch_size = 20を設定しました...
1 秒あたり 500 件ものメッセージを取得できると予想されるため、1 つのメッセージ処理を 20 ミリ秒未満にする必要があります。
この操作はできるだけ高速にする必要があります。理想的には、データベースへのラウンドトリップは 1 回だけです。これどうやってするの?