我正在使用帶有 Hibernate 5.3 和 Hikari 2.7 的 Spring Boot 2 中的官方 JDBC 驅動程序使用 FileMaker 16 數據源。FileMaker 服務器性能較差,對于大表,SQL 查詢執行時間可達一分鐘。有時會導致連接泄漏,因為連接池中充滿了永遠不會釋放的活動連接。問題是如何強制池中已經掛在那里兩分鐘的活動連接關閉,將它們移動到空閑狀態并再次使用。例如,我使用以下findAll方法通過 RestController 訪問 FileMaker 數據源org.springframework.data.repository.PagingAndSortingRepository:@RestControllerpublic class PatientController { @Autowired private PatientRepository repository; @GetMapping("/patients") public Page<Patient> find(Pageable pageable) { return repository.findAll(pageable); }}/patients在 raw 中調用幾次會導致連接泄漏,這是 Hikari 報告的內容:2018-09-20 13:49:00.939 調試 1 --- [l-1 管家] com.zaxxer.hikari.pool.HikariPool :HikariPool-1 - 池統計(總計 = 10,活動 = 10,空閑 = 0,等待=2)它還會拋出這樣的異常:java.lang.Exception: Apparent connection leak detectedat com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128) ~[HikariCP-2.7.9.jar!/:na]我需要的是,如果repository.findAll需要超過 N 秒,則必須終止連接并且控制器方法必須拋出異常。如何實現?
2 回答

慕神8447489
TA貢獻1780條經驗 獲得超1個贊
HikariCP 只專注于連接池管理來管理它從中形成的連接。
loginTimeout
- HikariCP 將等待與數據庫建立連接的時間(基本上是 JDBC 連接)
spring.datasource.hikari.connectionTimeout=30000
maxLifetime
- 連接在關閉前會在池中存活多久
spring.datasource.hikari.maxLifetime=1800000
idleTimeout
- 未使用的連接在池中存在多長時間
spring.datasource.hikari.idleTimeout=30000
如果請求時間超過定義的超時時間,請使用 javax.persistence.query.timeout 取消請求。
javax.persistence.query.timeout(長 - 毫秒)
javax.persistence.query.timeout 提示定義了查詢在被取消之前允許運行多長時間。Hibernate 本身不處理此超時,而是通過 JDBC Statement.setTimeout 方法將其提供給 JDBC 驅動程序。
添加回答
舉報
0/150
提交
取消