gpt4 book ai didi

java - 高性能 hibernate 插入

转载 作者:太空狗 更新时间:2023-10-29 22:55:11 28 4
gpt4 key购买 nike

我正在处理应用程序的延迟敏感部分,基本上我会收到一个网络事件来转换数据,然后将所有数据插入到数据库中。在分析之后,我发现基本上我所有的时间都花在了保存数据上。这是代码

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 毫秒以下。

我需要此操作尽可能快,理想情况下只有一次往返数据库。我怎样才能做到这一点?

最佳答案

将您的主键生成从服务器端自动递增中移开。您的 Java 代码必须负责 PK 的生成以避免往返。

为了体面的批量插入性能,您需要一种不需要在每次调用 saveOrUpdate 时都访问数据库的方法。使用 UUID 作为主键,或 implementing HiLo可以帮助实现这一目标。否则,实际上不会进行批量插入。

为了兼顾性能和与其他外部系统的互操作性,pooledpooled-lo优化器是最佳选择。

关于java - 高性能 hibernate 插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3026968/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com