【发布时间】:2011-03-02 21:39:05
【问题描述】:
我正在处理应用程序的延迟敏感部分,基本上我将接收网络事件转换数据,然后将所有数据插入数据库。分析后,我发现基本上我所有的时间都花在了保存数据上。这是代码
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 毫秒以下。
我需要此操作尽可能快,理想情况下只有一次往返数据库。我怎样才能做到这一点?
【问题讨论】:
-
顺便说一句,在使用
FlushMode#NEVER时,您不应该在flush()之后commit()吗? -
@Pascal Thivent。我不知道:-)
-
好吧,阅读
Transaction#commit()的javadoc :)
标签: java performance hibernate3