原来的DBCP配置:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="#{dbConfig.url}" />
<property name="username" value="#{dbConfig.username}" />
<property name="password" value="#{dbConfig.password}" />
<property name="driverClassName" value="#{dbConfig.driverClassName}" />
</bean>
pom.xml引入druid1.1.2的包
将原来的DBCP改为Druid
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="#{dbConfig.url}" />
<property name="username" value="#{dbConfig.username}" />
<property name="password" value="#{dbConfig.password}" />
<property name="driverClassName" value="#{dbConfig.driverClassName}" />
<!-- 指定连接数据库连接池的最小连接数 -->
<property name="minIdle" value="10"></property>
<!-- 指定连接数据库连接池的最大连接数 -->
<property name="maxActive" value="120"></property>
<!--初始化接数据库连接池 -->
<property name="initialSize" value="2"></property>
<!-- 指定连接数据库连接池的连接的最大空闲时间 -->
<property name="maxWait" value="12000"></property>
<!--配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒。 -->
<property name="timeBetweenEvictionRunsMillis" value="60000"></property>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<!-- 用来检测连接是否有效的sql,要求是一个查询语句 -->
<property name="validationQuery" value="SELECT 1 FROM DUAL"></property>
<!--空闲时是否进行验证,检查对象是否有效 -->
<property name="testWhileIdle" value="true" />
<!--取得对象时是否进行验证,检查对象是否有效 -->
<property name="testOnBorrow" value="false" />
<!--返回对象时是否进行验证 -->
<property name="testOnReturn" value="false" />
<!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计 -->
<property name="filters" value="stat" />
<!-- 长时间不适用的连接强制关闭 -->
<property name="removeAbandoned" value="true" />
<!-- 超过30分钟开始关闭空闲连接 -->
<property name="removeAbandonedTimeout" value="1800" />
</bean>
以上配置项目可以正常启动
但是,当登录系统时(即第一次请求数据库)项目会报错
### Cause: java.lang.NullPointerException] with root cause
java.lang.NullPointerException
at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1318)
at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1155)
at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4619)
at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:666)
at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4615)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1133)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1125)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:104)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:82)
at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:68)
at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:271)
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:69)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:44)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:100)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:75)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:148)
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:137)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
at com.sun.proxy.$Proxy23.insert(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:278)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:46)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:43)
at com.sun.proxy.$Proxy24.insertUserLog(Unknown Source)
现在不知道原因在哪?是连接池没有连接上还是怎么地?如果排错的话应该如何下手呢?
ps:如果在 bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" 中再配置了init-method="init"项目则无法启动,报错;之前DBCP中也没有配置