簡體   English   中英

連接時從 Spring 引導項目到 PostgreSQL 數據庫的連接問題

[英]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 = 100shared_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 多個連接。

混亂

  1. 這是因為任何數據庫默認設置嗎?
  2. 還是因為連接數據庫引擎時出現 Tomcat 問題?

即使我嘗試在我的數據庫節點中使用連接池工具pgbouncer 然后我也遇到了同樣的問題。

如果這是由於數據庫默認設置或配置造成的,我該如何覆蓋它?

微服務架構是一種將應用程序分解為多個獨立服務的架構,這些服務易於理解、開發、測試並且容易出錯。

現在根據上面的定義,每個獨立的服務都應該有自己獨立的獨立數據庫。 但如果需要,這些服務可以相互通信以獲取數據。

每個服務都應在其特定數據庫中具有選定的實體。

如果您為所有這些獨立服務提供了一個公共數據庫,那么您就違反了微服務架構的規則。

在這種情況下,數據冗余的風險很高。

可能在您的情況下,服務包含重復版本的數據並可能耗盡整個連接池。

更好的方法是為單獨的獨立服務提供單獨的數據庫(僅包含特定於該服務的實體)。

澄清:

  1. 解釋如上。

  2. 為所有 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

按照此鏈接閱讀如何配置:

  1. https://blogs.ashrithgn.com/multiple-data-source-in-spring-boot-using-spring-boot-data-starter/

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM