jdbc中自帶MySQL 連接池實踐示例
引言
在上期文章自定義 MySQL 連接池中,我提到瞭沒找到一個特別合適的 MySQL 連接池實現,所以自己寫瞭一個基於通用池化框架commons-pool2
的 MySQL 連接池,並且模仿瞭 Go 語言的gorm
框架設計思路,把借和還的操作不暴露給用戶,隻處理用戶發來的 SQL 語句的思路,封裝瞭一個com.funtester.db.mysql.MysqlPool
。
可惜打臉的事情來的太快瞭,在錄制視頻的時候偶然發現瞭 Intellij 代碼提示有個com.mysql.cj.jdbc.MysqlConnectionPoolDataSource
的類。這還瞭得,看名字就知道是我想要的那款。
經過查閱資料,好像也沒搜到太多詳細的資料。看官方的文檔,也是遮遮掩掩,仿佛並不很推薦這個實現。關於 MySQL 連接池的管理,在 spring 語境下,應該有相當多更好的實踐。但是對於測試來講,那些太重,不太適合腳本化使用。不管怎樣,我還是註意到瞭這個 MySQL 連接池的實現類。
關於它的名字,我在 stackoverflow 看到有人討論,表示說叫它 MySQL 連接池並不恰當,因為它隻是高效管理瞭連接的資源使用,並沒有池化。這一點在我實測中也發現瞭,使用獲取連接的時候,一直都是在創建新的連接。然後再連接空閑時間超過瞭設置之後,回收掉這個連接,回收的方法就是調用close()
方法。
對於一般池化技術來講,就是為瞭解決重用問題。如果連接並不重用,而是進行高效資源回收管理,其實並不算一個非常優秀的解決方案。
下面是com.mysql.cj.jdbc.MysqlConnectionPoolDataSource
使用實踐,比較簡單,API 倒是挺多的,但是大多數都用不到。
package com.funtest.groovytest import com.funtester.frame.SourceCode import com.mysql.cj.jdbc.MysqlConnectionPoolDataSource class MysqlPoolTe extends SourceCode { public static void main(String[] args) { def query = "select * from testers limit 2;" def source = new MysqlConnectionPoolDataSource() source.setServerName("localhost") source.setPort(3306) source.setUser("root") source.setPassword("root123456") source.setDatabaseName("funtester") source.setAllowMultiQueries(true) def connection = source.getPooledConnection() def statement = connection.getConnection().createStatement() while (true) { sleep(1) def query = statement.executeQuery(query) while (query.next()) { output query.getString("name") } } } }
這裡有個很容易的坑,就是有個setURL()
還有一個setUrl()
,其實這兩個沒有任何區別,我隻能說可能為瞭兼容舊版本把。還有就是設置瞭 URL 之後,好像 database 設置不起作用瞭,也是妙明感覺設計真糟心,所以在上面的案例中我也沒有用到這倆方法。
下面是我的測試結果,如圖所示創建瞭超級多的線程,但是一直連接的隻有很少。大概是經過幾秒鐘就會被回收一次,但是總創建數依舊非常高。
以後大概率我不會使用這個com.mysql.cj.jdbc.MysqlConnectionPoolDataSource
實現類,依舊會繼續完善自己的連接池功能。
以上就是jdbc中自帶MySQL 連接池實踐示例的詳細內容,更多關於jdbc MySQL 連接池的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- MySQL數據庫 JDBC 編程(Java 連接 MySQL)
- JDBC編程的詳細步驟
- MySQL五步走JDBC編程全解讀
- MySQL詳解進行JDBC編程與增刪改查方法
- Data Source與數據庫連接池簡介(JDBC簡介)