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

1.前言

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

2. 实现

1. Maven集成Jar包
	 
    
        com.alibaba
        druid
        1.1.9
    
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 getDataSourceStat(String dsName){
	        DruidDataSource dataSource = null;
	        DruidDataSource ds = getDruidDataSource(dsName,dataSource) ;
	        return ds!=null ? ds.getStatData() : new HashMap() ;
	    }
	
	    /**
	     * 关闭数据库连接池
	     * @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的配置属性详细了解一下才能够更快的解决问题

你可能感兴趣的:(Springboot,Springboot,druid)