我有一个奇怪的小问题。我有一个服务,需要在数据库中创建2000条记录,最少在各种表上。虽然让它们在同一个交易中运行会很好,但是在400-600个插入点附近,性能会非常糟糕。
由于某种原因,插入越来越慢。我认为Hibernate需要进行某种脏检查......随着对象图变得越来越复杂,Hibernate有越来越多的工作要做。
这非常糟糕,因为我们有一个服务基本上将200兆的XML数据导入到数据库中,导致大约70,000个插入。这需要大约1.5小时才能运行。
所以在Spring中,有没有办法可以说“保持hibernate会话打开,因为我们想要延迟加载和工作......但是不要在事务中放任何东西?”
答案 0 :(得分:6)
您应该从Hibernate中阅读以下Batch processing documentation。当您在单个事务中执行操作时,它们都是同一Hibernate会话的一部分。在刷新会话之前,没有任何对象持久保存到数据库中,因此它们都保留在内存中。您需要定期刷新会话并清除它。文档提供了大量详细信息。如果您确实不需要Hibernate会话的所有语义,请使用无状态会话接口。
此外,请确保使用JDBC批处理参数。如果你不使用它,那么Hibernate将一次向数据库写一行,而不是批量写入多行。您可能希望根据数据库和驱动程序尝试不同的批处理大小。
请记住,Hibernate在对象跟踪和脏检查方面有很多与之相关的开销。如果调整的性能不符合您的要求,您可能需要考虑使用Hibernate映射文件生成原始SQL,但使用原始JDBC插入数据。