MySQLNonTransientConnectionException資料庫連線異常

佛俠石破天發表於2020-10-12

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:Data source rejected establishment of connection, message from server:"Too many connections"
今天在新搭建的HDP平臺上提交Spark程式過程中,在Yarn後臺檢視了Job日誌後報出的該問題,當時分析有以下幾個方面的原因:

  1. 資料庫驅動jar版本過低
  2. 資料庫安裝之後預設最大連線數太少
  3. Spark程式碼中配置的資料庫連線池初始化連線數量過少
  4. Spark程式碼中獲取的資料庫連線使用完畢後未進行釋放,導致連線資源不足

該報錯出來之後首先分析了這幾點原因,最開始就排除了第一個可能性,因為我們的資料庫驅動版本是公司規定的()資料庫版本是MySQL5.7,其他的Spark程式跑的都很穩定,沒有理由在新搭建的HDP環境中Spark程式跑不起來,另外將該平臺的Spark任務在老的HDP環境中執行是沒有任何問題的,所以排除了3,4問題。那麼最有可能的就是資料庫安裝之後的預設最大連線數了。

其實在搭建環境的過程中,安裝MySQL資料庫的時候確實沒有注意到預設初始化最大連線數為多少,但是我們在Spark程式碼中配置的連線池的最小連線數量是30,最大連線數量為300 ;然後就登入到MySQL資料庫後臺檢視當前配置的資料庫最大連線數量 :

  1. 檢視資料庫當前連線數、ip、使用者、連線數量、連線狀態、連線時長
SHOW FULL processlist;

在這裡插入圖片描述
2. 檢視資料庫配置的最大連線數

show variables like '%max_connections%';

在這裡插入圖片描述
這裡可以看出來,剛剛安裝的資料庫預設的最大連線數量為151個,如果一旦超出這個數量就會導致Spark任務報錯,從而導致任務失敗。

  1. 修改資料庫最大連線數
    在/etc/my.cnf配置檔案中修改資料庫的最大連線數
vi /etc/my.cnf

在mysqlId中新增以下配置

max_connections=3000

儲存後重啟mysql服務

systemctl restart mysqld

重新登入mysql後臺檢視當前的資料庫最大連線數量

show variables like '%max_connections%';

可以看見資料修改為了3000,最後又提交了一此Spark任務,完美執行~~

最後:寫這個部落格是為了記錄下在工作過程中遇到的一些問題,如果有遇到相同問題的小夥伴,也需要注意嘍,同樣也給自己敲了警鐘,做事情一定要認真對待~

相關文章