【问题标题】:Create Connection Factory Datasource to use in JdbcTemplate springboot创建连接工厂数据源以在 JdbcTemplate springboot 中使用
【发布时间】:2021-05-04 12:06:13
【问题描述】:

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

最后我需要得到JdbcTemplate 对象来消费许多程序。

如何在 spring 中创建一个 DataSource Factory 以与 jdbcTemplate 一起使用? 我尝试了一些代码,但没有成功;

连接工厂

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));
    }

    
}

在代码上运行

    @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 次后出现错误:

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

【问题讨论】:

  • 我认为这不是春季问题。是网络连接问题。也许端口是非法的,或者端口在数据库端被阻止
  • @Alex 我成功连接了 8,9 个,然后出现错误。有没有其他方法可以在springboot中创建连接工厂来使用没有bean数据源的jdbcTemplate?
  • 连接参数是否一直相同?
  • 不,不幸的是,所有参数连接都是数据库上的一个特定表,这取决于我要连接的连接并调用特定数据库中的一些程序。

标签: spring-boot datasource jdbctemplate


【解决方案1】:

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

使用 HikariConfig 管理连接池

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));
    }
    
}

跑步

 @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");
    
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2019-09-28
    • 2018-12-16
    相关资源
    最近更新 更多