暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

springmvc mysql数据库连接池修改为druid(原C3P0)

木三的学习笔记 2019-01-10
919

今天生产服务器,一个任务突然报错,登录服务器,查日志,发现以下错误:

### 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


文章转载自木三的学习笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论