首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >创建要在JdbcTemplate springboot中使用的连接工厂数据源

创建要在JdbcTemplate springboot中使用的连接工厂数据源
EN

Stack Overflow用户
提问于 2021-05-04 12:06:14
回答 1查看 337关注 0票数 0

您能帮我在springboot中创建多个datasource连接吗?我会得到许多数据库配置注册在其他主数据库。我不能使用由.properties spring管理的数据源,因为我有很多配置要连接。

最后,我需要获取JdbcTemplate对象来消耗很多过程。

如何在春季创建一个DataSource工厂来使用jdbcTemplate?我已经尝试了一些代码,但没有成功;

连接工厂

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.sql.Connection;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class ConfigDataSourceDynamic {

    private static Map<String,DataSource> mapDataSource;
    private JdbcTemplate jdbcTemplate;

    @PostConstruct
    public void init(){
        mapDataSource = new HashMap<String,DataSource>();
    }

    private DataSource createNewConnection(String nameConfig, String username, String password, String url, String driver){

        DataSource dataSource = DataSourceBuilder
                                .create()
                                .username(username)
                                .password(password)
                                .url(url)
                                .driverClassName(driver)
                                .build();

        mapDataSource.put(nameConfig, dataSource );
        return dataSource;
    }

    private DataSource getDataSource(String nameConfig, String nameConfig, String username, String password, String url, String driver){

        if( !mapDataSource.containsKey(nameConfig,  username, password,url, driver) )
            return createNewConnection(nameConfig);
        
        
        DataSource dataSource = mapDataSource.get(nameConfig);
        try{
            dataSource.getConnection().close();
        }catch(Exception e){
            e.printStackTrace();
        }

        return createNewConnection(tnsName);
    }

    public JdbcTemplate getJdbcTemplateDynamic(String nameConfig, String username, String password, String url, String driver) throws ApiReturnException{
        return new JdbcTemplate(getDataSource(nameConfig, username, password,url, driver));
    }

    
}

在代码上运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Autowired
    private ConfigDataSourceDynamic configDataSourceDynamic;

    public  Object testeMultiDBConfig() throws ApiReturnException{
        
        String nameConfig = // from table of configuration
        String username = // from table of configuration
        String password = // from table of configuration
        String url  = // from table of configuration
        String driver  = // from table of configuration

        JdbcTemplate jdbcTemplateTeste = configDataSourceDynamic.getJdbcTemplateDynamic(nameConfig, username, password,url, driver);

        List<Map<String, Object>> a = jdbcTemplateTeste.queryForList("select * from TESTE");

        a.forEach(System.out::println);

        return a;
    }

在8,9成功连接后,我得到了错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found

    at oracle.net.ns.NSProtocolNIO.negotiateConnection(NSProtocolNIO.java:284) NSProtocolNIO.java:284
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:340)  NSProtocol.java:340
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1596) T4CConnection.java:1596
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:588) T4CConnection.java:588
    at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:793) PhysicalConnection.java:793
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:57) T4CDriverExtension.java:57
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:747) OracleDriver.java:747
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:562) OracleDriver.java:562
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) DriverDataSource.java:138
EN

回答 1

Stack Overflow用户

发布于 2021-05-04 20:35:04

我有更好的解决方案:)我会在这里发布...

使用HikariConfig管理连接池

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.annotation.PostConstruct;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class ConfigDataSourceDynamic {

    private static Map<String,HikariDataSource> mapDataSource;

    @PostConstruct
    public void init(){
        mapDataSource = new ConcurrentHashMap<String,HikariDataSource>();
    }

    private synchronized HikariDataSource createNewConnection(String tnsName,   String username, String password, String url, String driver){

        HikariConfig configHikari = new HikariConfig();
        configHikari.setUsername(username);
        configHikari.setPassword(password);
        configHikari.setJdbcUrl(url);
        configHikari.setDriverClassName(driver);

        HikariDataSource dataSource = new HikariDataSource(configHikari);
        mapDataSource.put(tnsName, dataSource );

        return dataSource;
    }


    private synchronized HikariDataSource getDataSource(String tnsName,   String username, String password, String url, String driver){

        if( !mapDataSource.containsKey(tnsName) )
            return createNewConnection(tnsName, username, password,url, driver);

        HikariDataSource dataSource = mapDataSource.get(tnsName);

        try{
           if(dataSource.isClosed()){
                return createNewConnection(tnsName);
           }else{
                return dataSource;
           }
        }catch(Exception e){
            e.printStackTrace();
        }

        return createNewConnection(tnsName);
    }

    public JdbcTemplate getJdbcTemplateDynamic(String tnsName,  String username, String password, String url, String driver){
        return new JdbcTemplate(getDataSource(tnsName, username, password,url, driver));
    }
    
}

正在运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Autowired
    private ConfigDataSourceDynamic configDataSourceDynamic;

    public  void testeMultiDBConfig() throws ApiReturnException{

        String nameConfig = // from table of configuration
        String username = // from table of configuration
        String password = // from table of configuration
        String url  = // from table of configuration
        String driver  = // from table of configuration

        JdbcTemplate jdbcTemplateTeste = configDataSourceDynamic
                                        .getJdbcTemplateDynamic(nameConfig, username, password,url, driver);
        
        for (int i = 0; i < 500; i++) { // so many requests to over test
            jdbcTemplateTeste.execute("INSERT INTO TABLE1 ( COL ) VALUES ( 'VALUE')");
            List<Map<String, Object>> result = jdbcTemplateTeste.queryForList("SELECT * FROM TABLE1");
            result.forEach(System.out::println);
            jdbcTemplateTeste.execute("DELETE FROM TABLE1");
    
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67384446

复制
相关文章
SpringBoot整合JdbcTemplate连接Mysql
apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management'
JQ实验室
2022/02/09
3300
Spring JDBCTemplate使用JNDI数据源
接上回继续,项目开发好以后,通常要在多个环境部署,象我们公司多达5种环境:本机环境(local)、(开发小组内自测的)开发环境(dev)、(提供给测试团队的)测试环境(test)、预发布环境(pre)、正式生产环境(prod),每种环境都有各自的配置参数,比如:数据库连接、远程调用的ws地址等等。如果每个环境build前手动修改这些参数,显然太不fashion. maven早就考虑到了这些问题,看下面的pom片段: 1 <profiles> 2 <profile> 3
菩提树下的杨过
2018/01/19
1.2K0
Spring JDBCTemplate使用JNDI数据源
【Java】SpringBoot整合多数据源JdbcTemplate、Mybatis、Jpa
SpringBoot 整合 JdbcTemplate 多数据源 pom <!-- 引入阿里的数据源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> application.properties #快捷键alt拉
瑞新
2021/12/06
7750
SpringBoot整合JdbcTemplate
pom依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</v
前端小鑫同学
2022/12/24
2160
springboot整合jdbcTemplate
首先在pom.xml中添加如下依赖: 图片发自简书App 然后注入jdbcTemplate再使用就行了,如下图: 图片发自简书App
贪挽懒月
2018/05/18
8530
SpringBoot之SpringBoot整合JdbcTemplate
添加jdbc场景启动器,及其Mysql的驱动,Mysql的驱动版本根据自己的情况定
彼岸舞
2021/01/27
4640
SpringBoot之SpringBoot整合JdbcTemplate
springboot (三)JdbcTemplate
添加pom依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> properties中配
IT架构圈
2018/06/01
4070
(四)SpringBoot2.0基础篇- 多数据源,JdbcTemplate和JpaRepository
在日常开发中,经常会遇到多个数据源的问题,而SpringBoot也有相关API:Configure Two DataSources:https://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/#howto-two-datasources 本文SpringBoot版本为2.0(由于2.0之前的版本和之后的版本配置会有些许不同,2.0之前的版本推荐一位大牛的博文:http://blog.didispace.com/spri
2018/06/20
2.2K0
SpringBoot2.x系列教程(五十一)Spring Boot中JdbcTemplate多数据源配置
在《Spring Boot中JdbcTemplate源码分析》中我们讲解了自动配置相关的源代码实现。基于Spring Boot自动配置默认配置的组件,我们可以来自定义JdbcTemplate的实例化。而多数据源的配置就是在此基础上实例化多个数据源和JdbcTemplate。
程序新视界
2020/03/24
5500
SpringBoot2.0 基础案例(06):引入JdbcTemplate,和多数据源配置
在Spring Boot2.0框架下配置数据源和通过JdbcTemplate访问数据库的案例。 SpringBoot对数据库的操作在jdbc上面做了深层次的封装,使用springBoot的注入功能,可以把DataSource注册到JdbcTemplate之中。
知了一笑
2019/07/19
6220
SpringBoot教程(十) | SpringBoot集成JdbcTemplate
经过了前面的几篇文章,我们几乎讲解完毕了SpringBoot中前端控制器中的一些操作,体验到SpringBoot为我们使用框架所带来的便捷。前面文章中的所有案例,总共只引入了一个 web-starter, 配置也很少。从今天开始,我们来开始研究一下,SpringBoot如何完成数据的持久化操作。
一缕82年的清风
2022/04/08
5170
SpringBoot教程(十) | SpringBoot集成JdbcTemplate
Spring Boot之JdbcTemplate多数据源配置与使用
之前在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源。在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.properties文件中配置连接参数即可。但是往往随着业务量发展,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源,下面基于之前的JdbcTemplate和Spring-data-jpa例子分别介绍两种多数据源的配置方式。
大道七哥
2019/08/23
1.5K0
Spring Boot之JdbcTemplate多数据源配置与使用
Spring 框架使用了哪些设计模式?
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/08/29
1K0
Spring 框架使用了哪些设计模式?
Spring Boot 与 Kotlin 使用JdbcTemplate连接MySQL
之前介绍了一些Web层的例子,包括构建RESTful API、使用Thymeleaf模板引擎渲染Web视图,但是这些内容还不足以构建一个动态的应用。通常我们做App也好,做Web应用也好,都需要内容,而内容通常存储于各种类型的数据库,服务端在接收到访问请求之后需要访问数据库获取并处理成展现给用户使用的数据形式。
全科
2018/08/15
1.5K0
(9)SpringBoot使用JdbcTemplate访问数据库
   摘要:本文主要讲解SpringBoot使用JdbcTemplate访问数据库。
IT云清
2022/05/07
5720
(9)SpringBoot使用JdbcTemplate访问数据库
springboot集成druid配置多数据源连接
---- ##环境说明 jdk1.7, springboot1.5.8.RELEASE, druid1.1.5,nutz1.r.66 ##配置步骤 配置文件(application.properties) t1.data1.driver-class-name=oracle.jdbc.driver.OracleDriver t1.data1.url=jdbc:oracle:thin:@171.12.84.126:1521:ora11g t1.data1.username=oracle_78 t1.
用户5166556
2019/04/16
2.9K0
初探设计模式5:Spring涉及到的9种设计模式
设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。
程序员黄小斜
2019/04/06
1.2K0
springboot快速入门前言:一、springboot简介:二、springboot常用知识点:总结:
正所谓,天下武功,唯快不破,在当今生活节奏越来越快的时代,我们也要讲求效率,也要追求一个快字(不过有些方面还是不能快的,不要当快男哦)。springboot就是能简化配置、敏捷开发的东西。做同一个项目,用spring你可能还在写xml,用springboot的话你可能已经做完在约妹子了!
贪挽懒月
2018/08/02
5920
springboot快速入门前言:一、springboot简介:二、springboot常用知识点:总结:
Spring Boot集成数据源
Spring Boot为创建数据库的数据源提供了非常好的支持。不需要编写任何额外的代码来在Spring Boot中创建数据源(DataSource)。只需添加依赖项并执行配置详细信息就足以创建DataSource并连接数据库。在本章中,将使用Spring Boot JDBC驱动程序连接来连接数据库。首先,需要在构建配置文件中添加Spring Boot Starter JDBC依赖项。Maven用户可以在pom.xml 文件中添加以下依赖项。
黑洞代码
2021/12/04
8240
Spring Boot集成数据源
Spring Boot入门系列(十四)使用JdbcTemplate操作数据库,配置多数据源!
Spring Boot 除了Mybatis数据库ORM框架,还有JdbcTemplate等数据库操作框架,同样也比较简单实用,如果是一般简单的项目,用JdbcTemplate完全可以实现相关的数据库操作。它虽然没有MyBatis功能强大,但使用比较简单,JdbcTemplate应该算是最简单的数据持久化方案,所以下面就来给大家介绍Spring Boot 使用JdbcTemplate操作数据库,配置多数据源!
架构师精进
2020/07/14
2.7K0
Spring Boot入门系列(十四)使用JdbcTemplate操作数据库,配置多数据源!

相似问题

使用Spring JdbcTemplate -注入数据源与jdbcTemplate

44

带有Server的SpringBoot JdbcTemplate

10

如何使用SpringBoot创建动态数据源

14

使用PostgreSQL和多个数据源重新连接JdbcTemplate

11

Springboot JdbcTemplate自动发失败

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文