druid数据源手动创建

手动创建druid数据源,可以使用jdbc或者通过aspect进行多数据源的动态切换

通过md5加密创建唯一key,在key重复时不进行创建,

创建的数据源可以通过dataSourceKey进行bean获取,或者通过jdbctemplate对象进行操作

在druid页面中可以观测到注入的数据源

一、配置实体类-从数据库读取

二、数据源工厂

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;

/**
 * 数据源创建工厂
 *
 * @author luwl
 * @date 2022/5/11 16:18
 */
@Slf4j
public class DataSourceFactory {

    /**
     * 本地数据源集合
     */
    private static final List myDataSource = Collections.synchronizedList(new ArrayList<>());

    private DataSourceFactory() {
    }

    private static final DataSourceFactory ME = new DataSourceFactory();

    public static DataSourceFactory me() {
        return ME;
    }

    private final int initialSize = 5;

    private final int maxActive = 20;

    private final int minIdle = 5;

    private final int maxWait = 60 * 1000;

    private final String validationQuery = "SELECT 1";

    private final int validationQueryTimeout = 60 * 1000;

    private final boolean testWhileIdle = true;

    private final boolean testOnBorrow = false;

    private final boolean testOnReturn = false;

    private final boolean failFast = true;

    private final int timeBetweenEvictionRunsMillis = 6 * 1000;

    private final int timeBetweenConnectErrorMillis = 500;

    private final int minEvictableIdleTimeMillis = 60 * 1000;

    private final int maxEvictableIdleTimeMillis = 25200000;

    private final boolean poolPreparedStatements = true;

    private final boolean sharePreparedStatements = false;

    private final boolean useGlobalDataSourceStat = true;

    private final int maxPoolPreparedStatementPerConnectionSize = 20;

    /**
     * 创建数据源 如果数据源已存在不进行创建
     *
     * @param dataSourceConfig
     */
    public void createDataSource(DataSourceConfig dataSourceConfig) {
        //加入到缓存中
        String dataSourceKey = dataSourceConfig.getDataSourceKey();
        //获取默认数据源
        DruidDataSource defaultDataSource = SpringHelper.getBean("dataSource");
        if (myDataSource.size() == 0 && dataSourceConfig.getUrl().equals(defaultDataSource.getUrl())) {
            log.warn("当前数据库连接与默认数据源一致,不进行数据源创建");
            dataSourceKey = "dataSource";
            myDataSource.add(dataSourceKey);
            dataSourceConfig.setDataSourceKey(dataSourceKey);
            return;
        } else if (myDataSource.contains(dataSourceKey)) {
            log.warn("当前数据库连接已存在,不进行数据源创建");
            return;
        }
        Properties prop = new Properties();
        prop.put("initialSize", initialSize);
        prop.put("maxActive", maxActive);
        prop.put("minIdle", minIdle);
        prop.put("maxWait", maxWait);
        prop.put("poolPreparedStatements", poolPreparedStatements);
        prop.put("maxPoolPreparedStatementPerConnectionSize", maxPoolPreparedStatementPerConnectionSize);
        prop.put("validationQuery", validationQuery);
        prop.put("validationQueryTimeout", validationQueryTimeout);
        prop.put("testOnBorrow", testOnBorrow);
        prop.put("testOnReturn", testOnReturn);
        prop.put("testWhileIdle", testWhileIdle);
        prop.put("timeBetweenEvictionRunsMillis", timeBetweenEvictionRunsMillis);
        prop.put("minEvictableIdleTimeMillis", minEvictableIdleTimeMillis);
        prop.put("timeBetweenConnectErrorMillis", timeBetweenConnectErrorMillis);
        prop.put("maxEvictableIdleTimeMillis", maxEvictableIdleTimeMillis);
        prop.put("sharePreparedStatements", sharePreparedStatements);
        prop.put("useGlobalDataSourceStat", useGlobalDataSourceStat);
        prop.put("failFast", failFast);
        //创建数据源
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        dataSource.setProxyFilters(defaultDataSource.getProxyFilters());
        dataSource.setName(dataSourceConfig.getDataSourceKey());
        dataSource.setUrl(dataSourceConfig.getUrl());
        dataSource.setUsername(dataSourceConfig.getUserName());
        dataSource.setPassword(dataSourceConfig.getPassWord());
        dataSource.setDriverClassName(dataSourceConfig.getDriver());
        //注入bean对象
        SpringHelper.registerSingletonBean(dataSourceKey, dataSource);
        myDataSource.add(dataSourceKey);
        log.info("数据源创建成功:【key:{}】", dataSourceKey);
    }

    /**
     * 获取数据库连接对象
     */
    public Connection getDataSourceConnection(String dataSourceKey) {
        Connection connection = null;
        if (!myDataSource.contains(dataSourceKey)) {
            log.warn("当前数据源不存在,请创建数据源");
            return connection;
        }
        try {
            DruidDataSource dataSource = SpringHelper.getBean(dataSourceKey);
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            log.error("获取数据库连接失败", e.getMessage());
        }
        return connection;
    }

    /**
     * 获取数据库连接对象
     */
    public JdbcTemplate getJdbcTemplate(String dataSourceKey) {
        JdbcTemplate jdbcTemplate = null;
        if (!myDataSource.contains(dataSourceKey)) {
            log.warn("当前数据源不存在,请创建数据源");
            return null;
        }
        DataSource dataSource = SpringHelper.getBean(dataSourceKey);
        jdbcTemplate = new JdbcTemplate(dataSource);
        return jdbcTemplate;
    }
}

Original: https://www.cnblogs.com/Sora-L/p/16750291.html
Author: 雨梦大木
Title: druid数据源手动创建

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/620071/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 循环队列的创建与实现的函数

    bool InitQueue(SqQueue &Q)//循环队列的初始化,为队列申请一段连续的容量为MAXQSIZE 的整形数组空间。 cout< cin>&g…

    Java 2023年6月5日
    067
  • 前后端分离,简单JWT登录详解

    前后端分离,简单JWT登录详解 前后端分离,简单JWT登录详解 JWT登录流程 1. 用户认证处理 2. 前端登录 3. 前端请求处理 4. 后端请求处理 5. 前端页面跳转处理 …

    Java 2023年6月5日
    075
  • 吐血整理Java编程基础入门技术教程,免费送

    Java标识符的命名规则 使用Unicode字符集,以字母,下划线”_”,美元符号”$”,后面可以跟字母,下划线,美元符号和数字。 …

    Java 2023年6月8日
    080
  • Javaweb学习-JSP

    从JSP开始学习创建web项目 posted @2022-03-24 21:21 HelloHui 阅读(9 ) 评论() 编辑 Original: https://www.cnb…

    Java 2023年6月9日
    075
  • 基于Python来识别处理照片里的条形码

    最近一直在玩数独,突发奇想实现图像识别求解数独,输入到输出平均需要0.5s。 整体思路大概就是识别出图中数字生成list,然后求解。 输入输出demo 数独采用的是微软自带的Mic…

    Java 2023年6月7日
    075
  • Java开发笔记(一百四十五)FXML布局的伸展适配

    前面介绍了FXML的基本格式及其控制器的用法,算是打通了FXML方式的编码流程。程序界面通常保持固定尺寸,不过有时也允许用户拖曳窗口大小,不拖不打紧,一拖就可能坏事。像之前的登录窗…

    Java 2023年6月6日
    0114
  • spring中@param和mybatis中@param使用差别

    spring中@param /** * 查询指定用户和企业关联有没有配置角色 * @param businessId memberId * @return */ int selec…

    Java 2023年5月30日
    056
  • 如何搭建一个WEB服务器项目(六)—— 上传图片至服务器

    上传图片(用户头像)至服务器 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟。欢迎各位大佬来评论区提出问题或者是指出错误,…

    Java 2023年6月8日
    086
  • 两个宝藏|关于我在github上冲浪时的一个小技巧。

    你好呀,我是歪歪。 前几天在 github 上冲浪的时候,发现了两个宝藏东西。 我也不藏着掖着了,拿出来给大家分享一下。 这两个宝藏是关于 arthas 和 SOFARegistr…

    Java 2023年6月5日
    079
  • 四、mybatis动态sql

    前言 前面mysql都是通过静态sql进行查询的,但是如果业务复杂的时候,我们会遇到引号问题,或者多一个空格,这就使得sql代码编写错误了,所以为了解决这个问题,我们有了动态sql…

    Java 2023年6月16日
    093
  • wwdc2016-session707 Notifications(draft)

    通知这哥们说话有点不清晰啊。 远程通知本地通知 可以被操作的通知Dismiss Notifications 左滑消除UNNotification 响应式的通知 只有一个方法UNUs…

    Java 2023年5月30日
    087
  • 五分钟搭建博客系统 OK?

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 概要: 通过 Docker Compose 在使用 Docker容器构建的隔离环境中轻松运行 WordPress。…

    Java 2023年6月5日
    074
  • JAVA Stream在jdk17下的例子

    最近因为某些原因,又要用stream,所以耗费了一些时间,做了一些例子,以便自己后续参考。 环境: Article类代码: package study.base.lambda.st…

    Java 2023年6月9日
    088
  • Spring retry基本使用

    Spring retry基本使用 背景介绍 在实际工作过程中, 重试是一个经常使用的手段。比如 MQ发送消息失败,会采取重试手段,比如工程中使用 RPC请求外部服务,可能因为网络波…

    Java 2023年5月30日
    067
  • Seata源码分析——RPC模块底层实现

    前言 总览 AbstractNettyRemotingClient——一个RPC请求方法 RpcMessage——RPC协议 编码&解码 Server端Netty初始化 S…

    Java 2023年6月9日
    0105
  • PoweJob高级特性-MapReduce完整示例

    由于网上搜索 PowerJob MapReduce 都是设计原理,demo也展示个空壳子,没有演示Map到Reduce结果怎么传递,对于没有MR开发经验的人来说并没有什么帮助,所以…

    Java 2023年6月6日
    076
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球