Java项⽬使⽤Druid数据库连接断线后⾃动重连
说明:最近⼿上有⼏个项⽬因其他什么原因,数据库重启、⽹络断开之后,项⽬也需要跟着重启,原因⽆他,⼀查⽇志,连接池⽹络已断开。
靠,因为其他⼚家升级改造,我也招了池鱼之殃,孰不可忍,直接上代码,怼他!!
SpringMVC模式
<bean id="dataSource" name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="dm.jdbc.driver.DmDriver"></property>
<property name="url" value="jdbc:dm://localhost/test" />
rownumber()over()<property name="username" value="test" />
<property name="password" value="test" />
<property name="initialSize" value="5" />
<property name="minIdle" value="3" />
<property name="maxActive" value="10" />
<property name="maxWait" value="60000" />
<!-- 超过时间限制是否回收 -->
<property name="removeAbandoned" value="true" />
<!-- 超时时间;单位为秒。180秒=3分钟后强制回收-->
<property name="removeAbandonedTimeout" value="180" />
<!-- 关闭abanded连接时输出错误⽇志 -->
<property name="logAbandoned" value="true" />
<property name="timeBetweenLogStatsMillis" value="60000" />
<!-- 配置间隔多久才进⾏⼀次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置⼀个连接在池中最⼩⽣存的时间,单位是毫秒 -->
java分享<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="SELECT 1" />
<!-- 申请连接的时候检测 -->
<property name="testWhileIdle" value="true" />
<!-- 申请连接时执⾏validationQuery检测连接是否有效,配置为true会降低性能 -->
<property name="testOnBorrow" value="false" />
<!-- 归还连接时执⾏validationQuery检测连接是否有效,配置为true会降低性能 -->
<property name="testOnReturn" value="false" />
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
<!-- <property name="filters" value="com.alibaba.druid.filter.stat.StatFilter" /> -->
<property name="proxyFilters">
<list>
<ref bean="stat-filter" />
<ref bean="log-filter" />
</list>
</property>
</bean>
validationQuery 配置检测连接是否有效
timeBetweenEvictionRunsMillis 配置间隔多久才进⾏⼀次检测,检测需要关闭的空闲连接,单位是毫秒
testWhileIdle 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间⼤于timeBetweenEvictionRunsMillis,执⾏validationQuery检测连接是否有效。
Spring Boot模式
情况⼀:已经使⽤DruidDataSource连接池,添加配置信息即可,即
(timeBetweenEvictionRunsMillis,validationQuery,testWhileIdle)
情况⼆:未使⽤DruidDataSource连接池,改造以yml⽂件为例:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: sql.cj.jdbc.Driver
druid:
# 主库数据源
master:
facebook download# 从数据源开关/默认关闭
enabled: true
driverClassName: dm6.jdbc.driver.DmDriver
url: jdbc:dm6://localhost:12345/test
思科交换机查看端口命令username: test
password: test
# 从库数据源
# 初始连接数
initialSize: 5
# 最⼩连接池数量
minIdle: 10
# 最⼤连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进⾏⼀次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000
# 配置⼀个连接在池中最⼩⽣存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置⼀个连接在池中最⼤⽣存的时间,单位是毫秒
properties是什么文件maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置⽩名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理⽤户名和密码
login-username:
login-password:
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
获取配置,完成DruidDataSource创建
import org.springframework.beans.factory.annotation.Value;
import t.annotation.Configuration;
import com.alibaba.druid.pool.DruidDataSource;
/**
* druid 配置属性
* druid 配置属性
*/
@Configuration
public class DruidProperties
{
@Value("${spring.datasource.druid.initialSize}")
private int initialSize;
@Value("${spring.datasource.druid.minIdle}")
private int minIdle;
@Value("${spring.datasource.druid.maxActive}")
private int maxActive;
@Value("${spring.datasource.druid.maxWait}")
private int maxWait;
@Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@Value("${spring.datasource.druid.minEvictableIdleTimeMillis}")
private int minEvictableIdleTimeMillis;
@Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}")
private int maxEvictableIdleTimeMillis;
@Value("${spring.datasource.druid.validationQuery}")
private String validationQuery;
@Value("${spring.stWhileIdle}")
private boolean testWhileIdle;
@Value("${spring.stOnBorrow}")
private boolean testOnBorrow;
@Value("${spring.stOnReturn}")
private boolean testOnReturn;
public DruidDataSource dataSource(DruidDataSource datasource)
{
/** 配置初始化⼤⼩、最⼩、最⼤ */
datasource.setInitialSize(initialSize);
datasource.setMaxActive(maxActive);
datasource.setMinIdle(minIdle);
/** 配置获取连接等待超时的时间 */
datasource.setMaxWait(maxWait);
/** 配置间隔多久才进⾏⼀次检测,检测需要关闭的空闲连接,单位是毫秒 */
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
/** 配置⼀个连接在池中最⼩、最⼤⽣存的时间,单位是毫秒 */
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);
/**
* ⽤来检测连接是否有效的sql,要求是⼀个查询语句,常⽤select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作⽤。 */
datasource.setValidationQuery(validationQuery);
/** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间⼤于timeBetweenEvictionRunsMillis,执⾏validationQuery检测连接是否 datasource.setTestWhileIdle(testWhileIdle);
/** 申请连接时执⾏validationQuery检测连接是否有效,做了这个配置会降低性能。 */
datasource.setTestOnBorrow(testOnBorrow);
/** 归还连接时执⾏validationQuery检测连接是否有效,做了这个配置会降低性能。 */
datasource.setTestOnReturn(testOnReturn);
return datasource;
}
}
通过DruidConfig 完成连接池注⼊
@Configuration
public class DruidConfig
{
@Bean
@ConfigurationProperties("spring.datasource.druid.master")
public DataSource masterDataSource(DruidProperties druidProperties)
{
DruidDataSource dataSource = ate().build(); return druidProperties.dataSource(dataSource);
}
}
>reactive redis
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论