今天生产服务器,一个任务突然报错,登录服务器,查日志,发现以下错误:
### Cause: java.sql.SQLException: Operation not allowed after ResultSet closed
; SQL []; Operation not allowed after ResultSet closed; nested exception is java.sql.SQLException: Operation not allowed after ResultSet closed
网上查了下,发现可能是C3P0闲置链接超过时限了。。。
以前C3P0配置改了好多次了,都烦了,直接弃用,改用druid得了。
druid官网查找的各个数据库连接池的优缺点:

下面就是具体配置:
第一步:pom.xml添加druid依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
第二步:把以前的C3P0的配置去掉,添加druid配置:
<bean id="dataSourceDruid" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${mysql.jdbc.url}"/>
<property name="username" value="${mysql.jdbc.username}" >
<property name="password" value="${mysql.jdbc.password}" >
<!-- 配置监控统计拦截的filters 这个表示此数据源是否加入监控 -->
<property name="filters" value="stat,wall,slf4j" >
<!-- 配置初始化大小、最小、最大 -->
<property name="maxActive" value="500" >
<property name="initialSize" value="10" >
<property name="maxWait" value="60000" >
<property name="minIdle" value="10" />
<!-- 配置间隔多久才检测需要关闭的空闲连接,单位毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置连接在池中最小生存的时间,单位毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="SELECT 1 FROM DUAL" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="50" />
<!-- 通过connectProperties属性来打开mergeSql功能, 慢SQL记录 -->
<property name="connectionProperties" value="druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500" />
<!-- 合并多个DruidDataSource的监控数据 -->
<property name="useGlobalDataSourceStat" value="true" />
</bean>
第三步:修改注入的连接池:
<!-- 3.配置SqlSessionFactory对象 -->
<bean id="mysqlSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSourceDruid" />
<!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- 扫描entity包 使用别名 -->
<property name="typeAliasesPackage" value="com.hexun.entity" />
<!-- 扫描sql配置文件:mapper需要的xml文件 -->
<property name="mapperLocations" value="classpath:mapper/*.xml" />
</bean>
其实到这一步,数据库连接池已经切换到druid了。
但是druid有一个最重要的功能,sql监控。如果需要这个功能,还需要进行如下配置:
web.xml 添加fliter、servlet入口:
<filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
<init-param>
<param-name>exclusions</param-name>
<param-value>/static/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<!-- IP白名单(没有配置或者为空,则允许所有访问) -->
<param-name>allow</param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name>profileEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 允许清空统计数据 -->
<param-name>resetEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 用户名 -->
<param-name>loginUsername</param-name>
<param-value>druid</param-value>
</init-param>
<init-param>
<!-- 密码 -->
<param-name>loginPassword</param-name>
<param-value>druid</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
当然,也可以用java代码的方式实现监控功能,具体可参考:
@Configuration
public class DruidConfig {
/**
* 配置监控服务器
*
* @return 返回监控注册的servlet对象
*/
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
// 添加IP白名单
servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
// 添加IP黑名单,当白名单和黑名单重复时,黑名单优先级更高
// servletRegistrationBean.addInitParameter("deny", "192.168.25.123");
// 添加控制台管理用户
servletRegistrationBean.addInitParameter("loginUsername", "admin");
servletRegistrationBean.addInitParameter("loginPassword", "admin");
// 是否能够重置数据
servletRegistrationBean.addInitParameter("resetEnable", "false");
return servletRegistrationBean;
}
/**
* 配置服务过滤器
*
* @return 返回过滤器配置对象
*/
@Bean
public FilterRegistrationBean statFilter() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
// 添加过滤规则
filterRegistrationBean.addUrlPatterns("/*");
// 忽略过滤格式
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*,");
return filterRegistrationBean;
}
}
监控页面:http://127.0.0.1:8080/项目名称/druid/index.html

druid github wiki:
https://github.com/alibaba/druid/wiki




