![](/img/trans.png)
[英]Spring Boot gives error while connecting Oracle database: Unable to open JDBC Connection for DDL execution
[英]Connection issue from Spring Boot projects to PostgreSQL database while connecting
我正在使用 Spring MVC、Spring Boot 和 PostgreSQL 開發面向微服務的多租戶應用程序。 在我的服務域中,我有不同的 30 個 Spring 引導項目連接到同一個數據庫。
問題
當我啟動超過 11 個 Spring 並行啟動項目時,我無法從數據庫中檢索數據。 我只收到空白 JSON 響應。 但是如果我開始的項目少於 11 個,那么到那時,我就能得到微服務的結果。 當我從第 12 次服務開始時遇到問題。
故障排除和我的調查
根據閱讀,我做了如下一些改動,
我設置了 PostgreSQL 配置文件, max_connections = 100
和shared_buffers = 128MB
。
但這並沒有解決我的問題。 並且還在我的application.property
中為hikari
連接池添加了額外的行,如下所示,
spring.datasource.hikari.minimumIdle=3
spring.datasource.hikari.maximum-pool-size=3
即使這也不能解決我的問題。 我仍然只能一次啟動最多 12 個 Spring 引導項目。
在 pom.xml 上添加了以下內容,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>9.0.10</version>
</dependency>
application.property 更新了以下內容,
spring.datasource.tomcat.initial-size=15
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=20
spring.datasource.tomcat.max-idle=20
spring.datasource.tomcat.min-idle=5
spring.datasource.tomcat.default-auto-commit=true
更新
正如我上面提到的,我總共有 100 個最大連接。 當我啟動第一個微服務並通過查詢(以下查詢)監視數據庫連接時,我得到了 10 個連接。
select max_conn,used,res_for_super,max_conn-used-res_for_super res_for_normal
from
(select count(*) used from pg_stat_activity) t1,
(select setting::int res_for_super from pg_settings where
name=$$superuser_reserved_connections$$) t2,
(select setting::int max_conn from pg_settings where
name=$$max_connections$$) t3
活動截圖 - 當我只啟動 1 個微服務時,我得到了這樣的結果,
活動截圖二:
所以在這里,對於每個微服務啟動,10 個數據庫連接在后端數據庫級別啟動。 所以如果我啟動超過 30 個微服務應用程序,它會 go 到 300 多個連接。
混亂
即使我嘗試在我的數據庫節點中使用連接池工具pgbouncer
。 然后我也遇到了同樣的問題。
如果這是由於數據庫默認設置或配置造成的,我該如何覆蓋它?
微服務架構是一種將應用程序分解為多個獨立服務的架構,這些服務易於理解、開發、測試並且容易出錯。
現在根據上面的定義,每個獨立的服務都應該有自己獨立的獨立數據庫。 但如果需要,這些服務可以相互通信以獲取數據。
每個服務都應在其特定數據庫中具有選定的實體。
如果您為所有這些獨立服務提供了一個公共數據庫,那么您就違反了微服務架構的規則。
在這種情況下,數據冗余的風險很高。
可能在您的情況下,服務包含重復版本的數據並可能耗盡整個連接池。
更好的方法是為單獨的獨立服務提供單獨的數據庫(僅包含特定於該服務的實體)。
澄清:
解釋如上。
為所有 spring 引導模塊/項目維護單獨的數據源 hikari 連接池。
例如:假設您有兩個模塊/項目的兩個數據源 -
在 application.properties 中。
## datasource for first service/module ##
datasource1.url=jdbc:postgresql://localhost:3306/service1
datasource1.username=service1
datasource1.password=password1
datasource1.driver-class-name=org.postgresql.Driver
datasource1.initial-size=15
datasource1.max-wait=20000
datasource1.max-active=20
datasource1.max-idle=20
datasource1.min-idle=5
datasource1.default-auto-commit=true
## datasource for second service/module ##
datasource2.url=jdbc:postgresql://localhost:3306/service2
datasource2.username=service2
datasource2.password=password2
datasource2.driver-class-name=org.postgresql.Driver
datasource2.initial-size=15
datasource2.max-wait=20000
datasource2.max-active=20
datasource2.max-idle=20
datasource2.min-idle=5
datasource2.default-auto-commit=true
按照此鏈接閱讀如何配置:
https://blogs.ashrithgn.com/multiple-data-source-in-spring-boot-using-spring-boot-data-starter/
https://www.ru-rocker.com/2018/01/28/configure-multiple-data-source-spring-boot/
或者您可能需要 go 用於 Hibernate 與 Hikari-CP 的多租戶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.