Springboot Hikari Centos 首次連數據庫很慢


前言:

springboot項目默認使用了hikari作為數據庫連接池,在開發機器上一切正常.
但是把程序部署到Centos7 x64上之后發現,每次首頁登錄的時候都要停頓幾十秒.
於是,在程序啟動后, 迅速執行ps -ef|grep java獲取到程序的pid,然后在首頁點擊了幾下登錄, 再然后執行jstack <pid> > 123.txt獲取程序堆棧信息.
以下只是一部分信息,從以下信息中可以看到好幾個線程都是阻塞狀態, 都在等待鎖, 而鎖住的線程指向了SecureRandom

"Thread-8" #36 prio=5 os_prio=0 tid=0x00007fab159e5800 nid=0x4b2b runnable [0x00007faad91cb000]
   java.lang.Thread.State: RUNNABLE
	at java.io.FileInputStream.readBytes(Native Method)
	at java.io.FileInputStream.read(FileInputStream.java:255)
	at sun.security.provider.SeedGenerator$URLSeedGenerator.getSeedBytes(SeedGenerator.java:539)
	at sun.security.provider.SeedGenerator.generateSeed(SeedGenerator.java:144)
	at sun.security.provider.SecureRandom$SeederHolder.<clinit>(SecureRandom.java:203)
	at sun.security.provider.SecureRandom.engineNextBytes(SecureRandom.java:221)
	"- locked <0x00000000d82b9b80> (a sun.security.provider.SecureRandom) 問題所在"
	at java.security.SecureRandom.nextBytes(SecureRandom.java:468)
	at oracle.security.o5logon.O5Logon.a(Unknown Source)
	at oracle.security.o5logon.O5Logon.<clinit>(Unknown Source)
	at oracle.jdbc.driver.T4CTTIoauthenticate.<init>(T4CTTIoauthenticate.java:582)
	at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:401)
	at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553)
	at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254)
	at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
	at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
	at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:136)
	at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:369)
	at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:198)
	at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:467)
	at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:541)
	at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
	at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
	"- locked <0x00000000eeb7c898> (a com.zaxxer.hikari.HikariDataSource) "
	at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:157)


"http-nio-8080-exec-1" #23 daemon prio=5 os_prio=0 tid=0x00007fab1593b000 nid=0x4b1f waiting for monitor entry [0x00007faaf4313000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:107)
	"- waiting to lock <0x00000000eeb7c898> (a com.zaxxer.hikari.HikariDataSource) "
	at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:157)

"http-nio-8080-exec-2" #24 daemon prio=5 os_prio=0 tid=0x00007fab15995800 nid=0x4b20 waiting for monitor entry [0x00007faaf4212000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:107)
	"- waiting to lock <0x00000000eeb7c898> (a com.zaxxer.hikari.HikariDataSource)"
	at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:157)

從以上可以看到,問題出在SecureRandom處, 網上查詢后, 發現很多Java程序在Linux下都需要把獲取隨機數的方式從 /dev/random改為/dev/urandom .

參考https://blog.csdn.net/weixin_40581980/article/details/81630501后, 我在啟動腳本中加入了參數 java -Djava.security.egd=file:/dev/urandom -jar my.jar, 重啟后,發現問題解決.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM