【发布时间】:2019-01-03 12:36:09
【问题描述】:
我编写了一个应用程序,它可以抓取互联网广播播放列表,然后将它们保存到数据库中。为了了解休眠,我将应用程序迁移到使用休眠,但与其他尝试相比,我在执行 SELECT ... WHERE 查找时发现性能大幅下降。在我的 python sqlite 原型中,相同的过程(获取大约 17,000 首曲目,按播放的程序和播放者分组)花费了 150 毫秒,而使用 apache db utils 的初始 Java 版本花费了大约 250 毫秒,而我的(可能是可怕的) 休眠版本,大约需要 1100 毫秒。
@Override
public DJAllProgrammes getAllProgrammesFromDJ(Collection<String> names) {
DJAllProgrammes djAllProgrammes = new DJAllProgrammes();
session.beginTransaction();
List<Presenter> result = session.createQuery("from Presenter p WHERE p.presenter_name in :names", Presenter.class)
.setParameterList("names", names)
.getResultList();
for (Presenter presenter : result) {
int presenter_id = presenter.getPresenter_id();
List<Programme> programmes = session
.createQuery("from programme prog WHERE prog.presenter_origin_id = :pres_orig_id", Programme.class)
.setParameter("pres_orig_id", presenter_id)
.getResultList();
for (Programme programme : programmes) {
//this is the critical performance death zone
List<Track> tracksOnThisProgramme = session
.createQuery("FROM track t WHERE t.programme.programme_id in :progIds", Track.class)
.setParameter("progIds", programme.getProgramme_id())
.getResultList();
djAllProgrammes.addProgramme(new ProgrammeData(presenter.getPresenter_name(), programme.getDate(), tracksOnThisProgramme));
}
}
session.getTransaction().commit();
return djAllProgrammes;
}
调试信息:
信息:会话指标
{
33339 nanoseconds spent acquiring 1 JDBC connections;
71991 nanoseconds spent releasing 1 JDBC connections;
12938819 nanoseconds spent preparing 258 JDBC statements;
88949720 nanoseconds spent executing 258 JDBC statements;
0 nanoseconds spent executing 0 JDBC batches;
0 nanoseconds spent performing 0 L2C puts;
0 nanoseconds spent performing 0 L2C hits;
0 nanoseconds spent performing 0 L2C misses;
4671332 nanoseconds spent executing 1 flushes (flushing a total of 9130 entities and 0 collections);
599862735 nanoseconds spent executing 258 partial-flushes (flushing a total of 1079473 entities and 1079473 collections)
}
环顾互联网,我看到了一个建议,即事务中有太多实体“使用分页和较小的批量增量”-我可以找到有关什么是分页的信息,但找不到“使用较小的批量增量”的信息意思是“
我有点陷入困境,这个应用程序在使用 Apache DB Utils(一个轻量级 jdbc 包装器)做基本相同的事情时具有良好的性能,我太无知了,我什至不知道要搜索什么加快速度。帮兄弟解惑?
还有这里使用的bean(持久性实体...?)https://pastebin.com/pSQ3iGK2
【问题讨论】:
标签: java sql postgresql hibernate