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

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

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

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

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

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

连接工厂

代码语言:javascript
运行
复制
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
运行
复制
    @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
运行
复制
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-05 04:35:04

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

使用HikariConfig管理连接池

代码语言:javascript
运行
复制
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
运行
复制
 @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

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档