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的配置属性详细了解一下才能够更快的解决问题
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面
- springboot2.1集成druid连接池
- Spring/Spring Boot微服务项目 集成Druid 实现监控功能
- springboot 多数据源(三种数据库连接池--JDBC,dbcp2,Druid)
- spring boot 集成quartz 2.0 实现前端动态配置(获取spring上下文)的两种方式,启动数据库中已开启定时任务
- SpringBoot2.0学习之集成druid连接池
- Spring Boot(三): 集成Mybatis和Druid实现增删改查
- Spring Boot2.0.3 Mybatis Sharding-jdbc3.X集成实现数据库的读写分离(二)-项目实现
- springboot - 集成mysql实现方式之一,DruidDataSource 完整代码实现
- spring boot 简单集成 mybatis、druid(阿里巴巴连接池)、redis、jpa
- Spring Boot 集成 Mybatis 实现 Druid 多数据源
- 关于spring boot整合druid连接池在程序关闭后连接不释放问题解决
- spring boot集成druid连接池
- Spring Boot2.0.3 Mybatis Sharding-jdbc3.X集成实现数据库的读写分离(一)MySql的主从配置
- Spring boot集成Redis实现sessions共享时,sessions过期时间问题分析
- Spring Boot JDBC 连接数据库示例
- 35. Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
- [置顶] 一步一步学springboot (七)集成mybatis及druid数据源
- SpringBoot集成Swagger2实现Restful(类型转换错误解决办法)
- [SpringBoot实践]spring-data-mongo自定义Repository接口及其实现