我正在尝试利用Java 8并行流并行运行批处理作业:
ForkJoinPool forkJoinPool = new ForkJoinPool(8);
forkJoinPool.execute(() -> tenants.parallelStream()
.forEach((tenant) -> getDataPerTenant(tenant)));
在getDataPerTenant(tenant)中,我正在使用jpa访问数据库,并且正在运行一堆查询。我遇到的第一个问题是ContextClassLoader为空。然后,我尝试设置ContextClassLoader,但关注这篇文章:Parallel stream doesn't set Thread.contextClassLoader after tomcat upgrade,并尝试创建ForkJoinPool。
但是,由ForkJoinPool维护的线程在创建EntityManager时会引发异常:
No Persistence provider for EntityManager named TestService
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:85)
我相信这是因为无法解决持久性提供程序。
总有没有设置线程的持久性提供程序? 为了澄清一下,我有一个persistence.xml,当Web应用程序创建线程时,JPA可以工作。
仅当我尝试生成要访问JPA层的新线程时,才会出现此问题。
任何帮助将不胜感激 谢谢!