您的位置:首页 > Web前端

Springboot集成自定义的Druid连接池,前端自定义JDBC连接实现

2020-02-05 17:31 1171 查看

1.前言

最近在开发项目时,需要通过前端填写参数通过JDBC连接数据库并进行其他操作,实际开发中遇到过几次
问题,开始采用的是自定义连接池进行连接的管理,但是后续发现有很多问题,后面采用了阿里巴巴的
Druid连接池进行管理,做个笔记,便于后续的回忆。

2. 实现

1. Maven集成Jar包
<!--配置druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
2. Druid连接池工具类
package com.xtoneict.ods.util;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
import com.alibaba.druid.stat.DruidDataSourceStatManager;
import com.xtoneict.framework.exceptions.StandardException;
import lombok.extern.slf4j.Slf4j;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class DataSourceToolsUtils {
/**
* 获取当前连接池信息
* @param conncetName
* @return
*/
public static DruidDataSource getDataSource(String conncetName,String driver, String url, String username, String password) throws SQLException {

DruidDataSource ds = null ;
ds = getDruidDataSource(conncetName, ds);
if(ds == null){
ds = createDataSource(conncetName,driver,url,username,password);
}
return ds ;
}

/**
* 从已有连接池中获取有无连接池
* @param conncetName
* @param ds
* @return
*/
public static DruidDataSource getDruidDataSource(String conncetName, DruidDataSource ds) {
for (DruidDataSource datasource : DruidDataSourceStatManager.getDruidDataSourceInstances()) {
if (conncetName.equals(datasource.getName())) {
ds = datasource;
break;
}
}
return ds;
}

/**
* 获取连接池
* @param driver
* @param url
* @param username
* @param password
*/
public static DruidDataSource createDataSource(String conncetName,String driver, String url, String username, String password) throws SQLException {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setName(conncetName);
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
// 设置 初始化连接  最小 连接
dataSource.setInitialSize(5);
dataSource.setMinIdle(5);
//设置最大等待时间
dataSource.setMaxWait(60000);
//最大并发连接数
dataSource.setMaxActive(30);
//防止过期
dataSource.setValidationQuery("select 1 from dual");
dataSource.setTestOnBorrow(true);
dataSource.setTestWhileIdle(true);
//配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
dataSource.setTimeBetweenEvictionRunsMillis(60000);
//配置空闲连接最小存活时间
dataSource.setMinEvictableIdleTimeMillis(300000);
//关闭自动重连机制
dataSource.setBreakAfterAcquireFailure(true);
dataSource.setConnectionErrorRetryAttempts(0);

/* //超过时间限制是否回收
dataSource.setRemoveAbandoned(true);
//超时时间;单位为秒。180秒=3分钟
dataSource.setRemoveAbandonedTimeout(180);
//关闭abanded连接时输出错误日志
dataSource.setLogAbandoned(true);*/
dataSource.init();
return dataSource;
}

/**
* 获取当前连接池信息
* @param dsName
* @return
*/
public static Map<String,Object> getDataSourceStat(String dsName){
DruidDataSource dataSource = null;
DruidDataSource ds = getDruidDataSource(dsName,dataSource) ;
return ds!=null ? ds.getStatData() : new HashMap<String , Object>() ;
}

/**
* 关闭数据库连接池
* @param dsName
*/
public static void closeDataSource(String dsName){
DruidDataSource dataSource = null;
dataSource = getDruidDataSource(dsName, dataSource);
if(dataSource != null){
dataSource.close();
}
}

/**
* finally最终执行
* @param dataSource
* @param connection
* @param preparedStatement
* @param resultSet
*/
public static void finallyExecute(DruidDataSource dataSource, DruidPooledConnection connection, PreparedStatement preparedStatement, ResultSet resultSet) {
if (connection != null) {
try {
connection.close();
dataSource.removeAbandoned();
} catch (Exception e) {
e.printStackTrace();
}
}
closeAll(preparedStatement, resultSet);
}

/**
* 关闭连接
* @param statement
* @param resultSet
*/
public static void closeAll(PreparedStatement statement, ResultSet resultSet){
try {
if (resultSet != null) {
resultSet.close();
}
} catch (Exception e) {
throw new StandardException("结果集资源释放失败");
}

try {
if (statement != null) {
statement.close();
}
} catch (Exception e) {
throw new StandardException("sql声明资源释放失败");
}

}
}

3.总结

Druid连接池的监控因为业务中不需要  所以没有实现,有需要实现的可以查看一下实现方式。集成中也遇
到过很多问题,建议Druid的配置属性详细了解一下才能够更快的解决问题
  • 点赞
  • 收藏
  • 分享
  • 文章举报
wideShine 发布了10 篇原创文章 · 获赞 1 · 访问量 657 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: