Manual close is not allowed over a Spring managed SqlSession

每次應用關閉都會跑出如下異常,查了許多資料,解決辦法是設置Spring創建Bean的模式,問題是初步解決的,具體原因卻不怎麼清楚:
“java.lang.UnsupportedOperationException: Manual close is not allowed over a Spring managed SqlSession
at org.mybatis.spring.SqlSessionTemplate.close(SqlSessionTemplate.java:310)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.beans.factory.support.DisposableBeanAdapter.invokeCustomDestroyMethod(DisposableBeanAdapter.java:350)
at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:273)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:565)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:541)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:870)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:510)
at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:908)
at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:884)
at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:836)
at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:579)
at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:115)
at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:5048)
at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5712)
at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
at org.apache.catalina.core.ContainerBaseStopChild.call(ContainerBase.java:1590)atorg.apache.catalina.core.ContainerBase StopChild.call(ContainerBase.java:1579)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

原因:SqlSessionTemplate你不可以手動關閉。SqlSessionTemplate是一個代理類,內部他會爲每次請求創建線程安全的sqlsession,並與Spring進行集成.在你的方法調用完畢以後他會自動關閉的。(參考網上資料)

解決辦法:在Spring配置SqlSession的時候加上:scope=”“prototype””
如不設置爲“prototype”模式(普通模式,每次新建一個bean),則Spring容器默認創建的bean都是“singleton ”單例模式,單例模式只會創建一個bean,只要容器不銷燬退出,會一直存活。而sqlSessionTemplate是不能被手動關閉的,當處於單例模式的時候,強行停止tomcat應該等同於手動去關閉,而不是由容器自動銷燬。這時候就會觸發上述異常。
而如果是“prototype”普通模式,每次新建一個bean,用完之後,容器自動垃圾回收,也就不是手動關閉了,故而不會觸發異常?!

不知道是不是這樣子理解的,有大神能指點一下麼?!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章