Ral*_*f H 5 java concurrency orm hibernate jpa
我知道这是一个困难的问题,因为它不仅取决于休眠,还取决于我们使用它的特定方式。我们在应用程序中使用 hibernate 4,可能以错误的方式使用,但事实就是如此。
因此,我们加载整个类层次结构,并在一个大语句中连接子类表,并按 150K 行的顺序将其转换为对象。
由于对象有很多字段需要设置(~100),我们希望并行化迭代结果集并获取各个行的循环。这在休眠中可能吗?是否有一个时间点,Hibernate 已经从数据库接收到了所有结果,并且可以使用这些数据来水合对象,因此我们可以使用多线程来加速获取大型结果集?
这是否有意义,或者是否最好更改数据结构和映射以摆脱多表连接?
实际上,加载 150K 个这些对象需要一分钟或每个实体 0.3 毫秒。我们拥有包含更多条目的更简单的表,加载速度提高了一个数量级,为 0.02 毫秒/实体。在初始化阶段之后我们不会加载其他实体,整个数据库的初始化阶段需要超过 5 分钟。
如果我们通过将类层次结构不暴露给数据库来删除连接,并切换到基于组合的数据结构,我们可能会获得更简单的表加载,而不是复杂的连接,但代价是多个表加载,而不是一个将这些加载合并为一个的连接。
但问题仍然存在:如果我们要加载这么多行,并且在填写每个对象的字段时要调用相应的设置器,这可以并行完成吗?
不,Hibernate 中没有这样的东西。
但是,如果您提到的数据集彼此独立,您可以同时在不同线程中加载不同会话(事务)中的每个数据集(每个数据集一个线程和会话)。然后只需从所有线程中获取结果即可。
此方法的额外好处是您还可以并行化数据集的查询执行。
| 归档时间: |
|
| 查看次数: |
2137 次 |
| 最近记录: |