問題描述:
重新啓動一個早已經運行很長時間的項目,當進行到如下進度時,啓動卡死,沒有拋出任何異常:
2014-05-07 10:45:23 [DEBUG] [org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)] -- {message:Eagerly caching bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0' to allow for resolving potential circular references}
2014-05-07 10:45:23 [DEBUG] [org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)] -- {message:Finished creating instance of bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0'}
2014-05-07 10:45:23 [DEBUG] [org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)] -- {message:Finished creating instance of bean 'org.springframework.transaction.config.internalTransactionAdvisor'}
2014-05-07 10:45:23 [DEBUG] [org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)] -- {message:Finished creating instance of bean 'dataSource'}
2014-05-07 10:45:23 [DEBUG] [org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1498)] -- {message:Invoking afterPropertiesSet() on bean with name 'sqlSessionFactory'}
2014-05-07 10:45:23 [DEBUG] [org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:46)] -- {message:Parsed configuration file: 'class path resource [mybatisConfig.xml]'}
2014-05-07 11:32:02 [DEBUG] [org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:46)] -- {message:Property 'mapperLocations' was not specified or no matching resources found}
2014-05-07 11:32:02 [DEBUG] [org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:245)] -- {message:Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'}
2014-05-07 11:32:02 [DEBUG] [org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)] -- {message:Finished creating instance of bean 'sqlSessionFactory'}
從日誌中可以看出,一直到11:32,也就是過了47分鐘之後,才繼續往下啓動。
原因分析:
spring加載mybatisCofig.xml,考慮是不是數據庫連接問題,查詢配置信息如下:
initialSize=10
maxActive=20
maxWait=60000
1.考慮連接數據庫連接數問題,經查,數據庫連接數有300,已使用還只有100多
2.考慮連接等待時間問題,將maxWait時間改爲6000,也就是6s,啓動之後還是一樣卡死
3,查詢dbcp連接配置,增加如下配置,打印dbcp連接日誌:
<!--removeAbandoned: 是否自動回收超時連接-->
<property name="removeAbandoned" value="true"/>
<!--removeAbandonedTimeout: 超時時間(以秒數爲單位)-->
<property name="removeAbandonedTimeout" value="180"/>
<!--maxWait: 超時等待時間以毫秒爲單位 6000毫秒/1000等於60秒-->
同時spring中做相應配置改變。
此時啓動,發現啓動不再卡死,很快就啓動完畢,同時拋出異常。
2014-05-07 11:59:18 [DEBUG] [org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1498)] -- {message:Invoking afterPropertiesSet() on bean with name 'sqlSessionFactory'}
2014-05-07 11:59:19 [DEBUG] [org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:46)] -- {message:Parsed configuration file: 'class path resource [mybatisConfig.xml]'}
AbandonedObjectPool is used (org.apache.commons.dbcp.AbandonedObjectPool@2cea3932)
LogAbandoned: true
RemoveAbandoned: true
RemoveAbandonedTimeout: 10
2014-05-07 12:00:25 [ERROR] [org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl.error(JakartaCommonsLoggingImpl.java:38)] -- {message:Could not get a databaseId from dataSource}
org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Io 異常: Connection reset)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1244)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:882)
at org.apache.ibatis.mapping.VendorDatabaseIdProvider.getDatabaseProductName(VendorDatabaseIdProvider.java:76)
at org.apache.ibatis.mapping.VendorDatabaseIdProvider.getDatabaseName(VendorDatabaseIdProvider.java:61)
at org.apache.ibatis.mapping.VendorDatabaseIdProvider.getDatabaseId(VendorDatabaseIdProvider.java:49)
at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:445)
at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:336)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.sql.SQLException: Io 異常: Connection reset
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:254)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:386)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:413)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:164)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:34)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:752)
at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:294)
at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1266)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1240)
... 83 more
證明是數據庫本身存在問題,最終重啓oracle,解決問題。