possible non-threadsafe access to the session 和 java.util.ConcurrentModificationException: null

项目场景:

springboot+spring data jpa

问题描述:

项目有一个接口查询有点慢但是查询处数据之后还要对数据进行处理,刚开始使用了 集合的 stream属性,由于查询的有点慢,于是我改成了并行流 parallelStream ,查询接口速度是有所提升,但是后来发现,使用一段时间之后会不定时的报 possible non-threadsafe access to the session 和 [2021-09-03 14:42:36] [ERROR] [org.springframework.orm.jpa.EntityManagerFactoryUtils:431] – Failed to release JPA EntityManager
java.util.ConcurrentModificationException: null 错误,信息如下:

[2021-09-03 14:42:36] [ERROR] [org.hibernate.AssertionFailure:31] -- HHH000099: an assertion failure occurred (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: 

possible non-threadsafe access to the session

org.hibernate.AssertionFailure: possible non-threadsafe access to the session
	at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:160)
	at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.performTwoPhaseLoad(AbstractRowReader.java:255)
	at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishUp(AbstractRowReader.java:215)
	at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:137)
	at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:105)
	at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:87)
	at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:710)
	at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:76)
	at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)
	at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:2153)
	at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:589)
	at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:264)
	at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:585)
	at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:149)
	at org.hibernate.collection.internal.AbstractPersistentCollection$1.doWork(AbstractPersistentCollection.java:178)
	at org.hibernate.collection.internal.AbstractPersistentCollection$1.doWork(AbstractPersistentCollection.java:163)
	at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:264)
	at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:162)
	at org.hibernate.collection.internal.PersistentBag.isEmpty(PersistentBag.java:376)
	at com.lsmy.BIAutoDeploy.utils.StringUtil.isEmpty(StringUtil.java:513)
	at com.lsmy.BIAutoDeploy.controller.DemandController.lambda$list$0(DemandController.java:69)
	at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
	at java.util.stream.ReduceOps$ReduceTask.doLeaf(ReduceOps.java:747)
	at java.util.stream.ReduceOps$ReduceTask.doLeaf(ReduceOps.java:721)
	at java.util.stream.AbstractTask.compute(AbstractTask.java:316)
	at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:731)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
[2021-09-03 14:42:36] [DEBUG] [org.hibernate.engine.internal.TwoPhaseLoad:351] -- Done materializing entity [com.lsmy.BIAutoDeploy.entity.OperationLog#7063133]
[2021-09-03 14:42:36] [DEBUG] [org.hibernate.resource.jdbc.internal.ResourceRegistryStandardImpl:106] -- HHH000387: ResultSet's statement was not registered
[2021-09-03 14:42:36] [DEBUG] [org.hibernate.engine.loading.internal.CollectionLoadContext:394] -- 1 collections were found in result set for role: com.lsmy.BIAutoDeploy.entity.Demand.logs
[2021-09-03 14:42:36] [DEBUG] [org.hibernate.resource.jdbc.internal.ResourceRegistryStandardImpl:106] -- HHH000387: ResultSet's statement was not registered
[2021-09-03 14:42:36] [WARN ] [org.hibernate.engine.loading.internal.LoadContexts:98] -- HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@9f673b8<rs=com.alibaba.druid.pool.DruidPooledResultSet@739f3d04>
[2021-09-03 14:42:36] [DEBUG] [org.hibernate.resource.jdbc.internal.ResourceRegistryStandardImpl:193] -- Exception clearing maxRows/queryTimeout [statement is closed]
[2021-09-03 14:42:36] [DEBUG] [org.hibernate.resource.jdbc.internal.ResourceRegistryStandardImpl:193] -- Exception clearing maxRows/queryTimeout [statement is closed]
[2021-09-03 14:42:36] [DEBUG] [org.hibernate.engine.loading.internal.CollectionLoadContext:303] -- Collection fully initialized: [com.lsmy.BIAutoDeploy.entity.Demand.logs#7063085]
[2021-09-03 14:42:36] [DEBUG] [org.hibernate.engine.loading.internal.CollectionLoadContext:394] -- 1 collections initialized for role: com.lsmy.BIAutoDeploy.entity.Demand.logs
[2021-09-03 14:42:36] [WARN ] [org.hibernate.engine.loading.internal.CollectionLoadContext:420] -- HHH000160: On CollectionLoadContext#cleanup, localLoadingCollectionKeys contained [1] entries
[2021-09-03 14:42:36] [DEBUG] [org.hibernate.resource.jdbc.internal.ResourceRegistryStandardImpl:106] -- HHH000387: ResultSet's statement was not registered
[2021-09-03 14:42:36] [DEBUG] [org.hibernate.resource.jdbc.internal.ResourceRegistryStandardImpl:193] -- Exception clearing maxRows/queryTimeout [statement is closed]
[2021-09-03 14:42:36] [ERROR] [org.springframework.orm.jpa.EntityManagerFactoryUtils:431] -- Failed to release JPA EntityManager

 java.util.ConcurrentModificationException: null
 
	at java.util.IdentityHashMap$IdentityHashMapIterator.nextIndex(IdentityHashMap.java:735)
	at java.util.IdentityHashMap$ValueIterator.next(IdentityHashMap.java:833)
	at org.hibernate.engine.loading.internal.LoadContexts.cleanup(LoadContexts.java:97)
	at org.hibernate.engine.internal.StatefulPersistenceContext.clear(StatefulPersistenceContext.java:267)
	at org.hibernate.internal.SessionImpl.cleanupOnClose(SessionImpl.java:521)
	at org.hibernate.internal.AbstractSharedSessionContract.setClosed(AbstractSharedSessionContract.java:353)
	at org.hibernate.internal.AbstractSharedSessionContract.close(AbstractSharedSessionContract.java:346)
	at org.hibernate.internal.SessionImpl.closeWithoutOpenChecks(SessionImpl.java:366)
	at org.hibernate.internal.SessionImpl.close(SessionImpl.java:351)
	at sun.reflect.GeneratedMethodAccessor79.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:366)
	at com.sun.proxy.$Proxy170.close(Unknown Source)
	at org.springframework.orm.jpa.EntityManagerFactoryUtils.closeEntityManager(EntityManagerFactoryUtils.java:427)
	at org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor.afterCompletion(OpenEntityManagerInViewInterceptor.java:112)
	at org.springframework.web.servlet.handler.WebRequestHandlerInterceptorAdapter.afterCompletion(WebRequestHandlerInterceptorAdapter.java:73)
	at org.springframework.web.servlet.HandlerExecutionChain.triggerAfterCompletion(HandlerExecutionChain.java:179)
	at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1136)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.lsmy.bi.permission.util.filter.LoggingFilter.doFilter(LoggingFilter.java:27)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:141)
	at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:82)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

原因分析:

集合的并行流虽然对数据查询的速度有所提高,但是如果在对数据进行修改或者处理的时候使用并行流就会容易出现问题,速度提升是没的说的,得根据具体情况来使用才能发挥更大的作用。

解决方案:

把并行流模式改为 普通流模式:parallelStream() 改为 stream(),然后重新测试,发现没有再出现以上错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值