使用ORM的多螺纹刀片?

nob*_*ody 6 java performance multithreading database-design jpa

我有一个应用程序"persisting to database"占用了整个应用程序流程的85%时间.

我正在考虑使用多个线程来执行插入,因为插入在这里大多是独立的.有没有办法使用任何JPA实现实现多线程插入?或者从提高性能角度来看,是否值得做mutli线程插入?

注意:插入在一次运行中的记录范围为10K到100K.此外,性能非常关键.

谢谢.

Mic*_*Lee 5

数据库上的多线程插入语句实际上并不会使其执行速度更快,因为在大多数数据库中,该表需要插入锁。因此,您的线程将只等待一个线程完成,并在下一个表可以插入之前对其进行解锁-这实际上并没有使多线程比单线程更多。如果您在哪里做,那很可能会减慢它的速度

如果插入10k-100k记录,则应考虑使用批处理插入语句或使用的数据库本机的批量插入命令。最快的方法是本机的大容量插入命令,但它要求您不要使用JPA,而要对要使用大容量命令的插入直接使用JDBC调用。

如果您不想使用本机的批量命令,我建议您使用带有模板化批处理插入命令的Spring的JDBCTemplate。它的速度非常快,我使用它在高交易量的系统上每30秒批量插入10k-20k个实体,对此性能我感到非常满意。

最后,请确保使用正确的索引,键和选项对数据库表进行了优化。由于数据库是瓶颈,因此这应该是您希望提高性能的第一个位置。

  • 哪些数据库锁定表以进行插入?这对于 Oracle 而言并非如此,我猜想对于大多数其他数据库也并非如此。 (2认同)