[英]Using multiple DataSources in Spring
我在 Spring 中構建了一個 web 應用程序。到目前為止,我只能連接到一個數據源,但我需要連接到兩個數據源。
這是代碼:
數據庫配置 class:
@Configuration
public class DbConfig {
@Bean
@Primary
public DataSource dataSourceMail() {
HikariConfig config = new HikariConfig();
config.setDriverClassName("oracle.jdbc.OracleDriver");
config.setJdbcUrl("jdbc:oracle:thin:@1");
config.setUsername("xxx");
config.setPassword("xxx");
config.setConnectionTimeout(20000);
config.setMaximumPoolSize(100);
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
return new HikariDataSource(config);
}
@Bean(name="inregIvg")
public DataSource dataSourceInregIvg() {
HikariConfig config = new HikariConfig();
config.setDriverClassName("oracle.jdbc.OracleDriver");
config.setJdbcUrl("jdbc:oracle:thin:@2");
config.setUsername("yyy");
config.setPassword("yyy");
config.setConnectionTimeout(20000);
config.setMaximumPoolSize(100);
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
return new HikariDataSource(config);
}
}
存儲庫:
@Repository
public class TelefonMailRepository {
public List<Map<String, Object>> findByNumber(String telefon){
DbConfig dbc = new DbConfig();
JdbcTemplate jdbcTemplate = new JdbcTemplate(dbc.dataSourceInregIvg());
List<Map<String, Object>> info1 = jdbcTemplate.queryForList("select cif, den_client from b101_conturi where telefon=?", telefon);
return info1;
}
public Map<String, Object> findByNumber2(String telefon) {
DbConfig dbc = new DbConfig();
String query2 = "select cnp, nume, prenume from utilizatori where telefon=?";
JdbcTemplate jdbcTemplate = new JdbcTemplate(dbc.dataSourceMail());
Map<String, Object> info = jdbcTemplate.queryForMap(query2,telefon);
return info;
} }
服務:
@Service
public class TelefonMailService {
@Autowired
private TelefonMailRepository repository;
public List<Map<String, Object>> getRaspuns(String telefon) {
List<Map<String, Object>> mapList = new ArrayList<>();
mapList = repository.findByNumber(telefon);
return mapList;
}
public Raspuns getRaspunsB(String telefon) {
Map<String, Object> map = repository.findByNumber2(telefon);
String cnp = (String)map.get("cnp").toString();
String nume = (String)map.get("nume");
String prenume = (String)map.get("prenume");
Raspuns raspuns = new Raspuns();
raspuns.setCnp(cnp);
raspuns.setNume(nume);
raspuns.setPrenume(prenume);
return raspuns;
} }
Controller:
@PostMapping("/raspuns")
public String postDbRequest(@RequestParam("text2")String telefon, Model model) {
Raspuns x = service.getRaspunsB(telefon);
model.addAttribute("raspuns", x);
List<Map<String, Object>> mapList = service.getRaspuns(telefon);
model.addAttribute("map_list",mapList);
return "raspuns";
}}
數據 class:
import lombok.Data;
@Data
public class Raspuns {
private String cnp;
private String nume;
private String prenume;
private String cif;
private String den_client;
}
Thymeleaf 索引.html class:
<!DOCTYPE html>
<html xmlns:th ="http://www.thymeleaf.org" >
<head>
<meta charset ="UTF-8" ></meta>
<meta name ="viewport" content ="width=device-width, initial-scale=1, shrink-to-fit=no" >
<!-- Read CSS -->
<link rel ="stylesheet" th:href ="@{/webjars/bootstrap/css/bootstrap.min.css}" >
<link rel ="stylesheet" th:href ="@{/stil.css}" >
<!-- Read JS -->
<script th:src ="@{/webjars/jquery/jquery.min.js}" defer ></script>
<script th:src ="@{/webjars/bootstrap/js/bootstrap.min.js}" defer ></script>
<title> Cautare telefon sau e-mail</title>
</head>
<body class ="bg-light" >
<h2 text-align="center">Cautare telefon sau email</h2>
<div class ="text-center" >
<form method ="post" action ="/raspuns" >
<div class="form-group">
<input type ="number" minlength="10" maxlength="10" class="form-control" name ="text2" th:value ="${text2_value}" placeholder="Numar telefon"/>
<input type ="submit" value ="Cauta" class ="btn btn-primary" margin-top="2%"/>
</div>
</form>
<br></br>
<form method ="post" action ="/raspuns2" >
<div class ="form-group" >
<input type ="email" class ="form-control" placeholder ="Adresa email" th:value="${email_value}"
name ="email" />
<input type ="submit" value ="Cauta" class ="btn btn-primary" margin-top="2%"/>
</div>
</form>
</div>
</body>
</html>
Thymleaf html 響應並顯示答案 class:
<!DOCTYPE html>
<html xmlns:th ="http://www.thymeleaf.org" >
<head>
<meta charset ="UTF-8" ></meta>
<meta name ="viewport" content ="width=device-width, initial-scale=1, shrink-to-fit=no" >
<!-- Read CSS -->
<link rel ="stylesheet" th:href ="@{/webjars/bootstrap/css/bootstrap.min.css}" >
<link rel ="stylesheet" th:href ="@{/stil.css}" >
<!-- Read JS -->
<script th:src ="@{/webjars/jquery/jquery.min.js}" defer ></script>
<script th:src ="@{/webjars/bootstrap/js/bootstrap.min.js}" defer ></script>
<title> Cautare telefon sau email</title>
</head>
<body>
<form action="/">
<button class ="btn btn-primary">Acasa</button>
</form>
<h1> Cautare telefon</h1>
<table class="table">
<tbody>
<tr th:each="map : ${map_list}" >
<td> CNP:</td>
<td th:text ="${map.get('cif')}" ></td>
<td> Nume:</td>
<td th:text ="${map.get('den_client')}" ></td>
</tr>
</tbody>
</table>
<table>
<tr>
<td> CNP:</td>
<td th:text ="${raspuns.cnp}" ></td>
</tr>
<tr>
<td> Nume:</td>
<td th:text ="${raspuns.nume}" ></td>
</tr>
<tr>
<td> Prenume:</td>
<td th:text ="${raspuns.prenume}" ></td>
</tr>
</table>
</body>
</html>
昨天我詢問了一個存在於數據庫 A 中的電話號碼,我收到了答復,當我詢問數據庫 B 時,它沒有給我任何結果。 今天我做了一個構建和清理,當我查詢數據庫 B 時,它給了我一個響應,但是數據庫 A 沒有給我一個答案,它沒有給我任何結果。 我不明白它如何以及為什么不同時連接到兩個數據庫。 謝謝
在您的配置 class 中為每個數據源創建一個 JdbcTemplate。然后,將這些 JdbcTemplate beans 注入適當的存儲庫 class。
您不應實例化由 Spring 管理的類,配置類除外。
您必須將數據源注入存儲庫 class。如果調用 db.getDatasource(),則每次調用都會創建數據源。
class Repository{
private final Datasource dtSource;
private final JdbcTemplate jdbcTemplate;
public Repository(@Qualifier("mydatasource") Datasource dtSource){
This.jdbcTemplate = new JdbcTemplate(dtSource);
}
}
只需使用 @Bean 注釋方法注入 bean。 它在 spring 上下文中創建 bean
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.