【发布时间】: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