Я работаю над чувствительной к задержкам частью приложения, в основном я получаю сетевое событие, преобразующее данные, а затем вставляю все данные в БД. После профилирования я вижу, что в основном все мое время тратится на сохранение данных. вот код
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...
Я могу ожидать получить до 500 сообщений в секунду, поэтому мне нужно, чтобы одна обработка сообщений составляла менее 20 миллисекунд.
Мне нужно, чтобы эта операция была как можно быстрее, в идеале, в базу данных будет только одна обратная связь. Как я могу это сделать?