2017-04-08 17 views
0

我的Web应用程序在Spring 4.x和Hibernate上运行。当8次调用服务后,我的代码执行中断并发呼叫

代码片段数据库配置:

@SuppressWarnings("unused") 
@Configuration 
@EnableTransactionManagement 
//@EnableJpaRepositories("com.pearson.esp.dao") 
public class DbConfiguration { 

    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver"; 
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password"; 
    private static final String PROPERTY_NAME_DATABASE_URL = "db.url"; 
    private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username"; 

    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect"; 
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql"; 
    private static final String PROPERTY_NAME_HIBERNATE_CONNECTION_RELEASE_MODE = "hibernate.connection.release_mode"; 
    //private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan"; 

     @Resource 
     private Environment env; 

     @Bean 
     public DataSource dataSource() { 

       BasicDataSource dataSource = new BasicDataSource(); 
       dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER)); 
       dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL)); 
       dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME)); 
       dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD)); 

       return dataSource; 
     } 


     @Bean 
     @Autowired 
     public LocalSessionFactoryBean sessionFactory() { 
      LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
      sessionFactory.setDataSource(dataSource()); 
      sessionFactory.setPackagesToScan(new String[] { "com.pearson.esp" }); 
      sessionFactory.setHibernateProperties(hibProperties()); 
      return sessionFactory; 
     } 

     @Bean 
     @Autowired 
     public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) { 
      HibernateTransactionManager tm = new HibernateTransactionManager(); 
      tm.setDefaultTimeout(30); 
      tm.setSessionFactory(sessionFactory); 
      return tm; 
     } 



     private Properties hibProperties() { 
      Properties properties = new Properties(); 
      properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT)); 
      //properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL)); 
      properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, "true"); 
      properties.put(PROPERTY_NAME_HIBERNATE_CONNECTION_RELEASE_MODE, "after_transaction"); 

      return properties;  
    } 


} 

此代码执行休息时尝试8次后调用服务同时在调用。例外情况是:

org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [esp-webservice] is still processing a request that has yet to finish. This is very likely to create a memory leak. You can control the time allowed for requests to finish by using the unloadDelay attribute of the standard Context implementation. Stack trace of request processing thread: 
java.lang.Object.wait(Native Method) 
java.lang.Object.wait(Object.java:502) 
org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1104) 
org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106) 
org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 
org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) 
org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:35) 
org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:99) 
org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:129) 
org.hibernate.internal.SessionImpl.connection(SessionImpl.java:514) 
org.springframework.orm.hibernate5.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:448) 
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) 
org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:447) 
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:277) 
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
com.sun.proxy.$Proxy175.authenticateUser(Unknown Source) 
com.pearson.controller.impl.LoginControllerImpl.login(LoginControllerImpl.java:101) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:498) 
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) 
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) 
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) 
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) 
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784) 
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802) 
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) 
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
java.lang.Thread.run(Thread.java:745) 

任何一个可以帮助我解决吧! 谢谢!

回答

0

从连接池中获取连接时发生错误。似乎连接没有及时返回池,这可能有几个原因。

  • 该交易不是让(连接释放模式after_transaction正在使用)的下一个请求
  • 连接池是不够
  • 任何现有的手动连接处理不紧密连接
  • 大之前完成

解决问题取决于这里没有完全展示的实现。