專案實訓(十三)資料庫連線池的實現
阿新 • • 發佈:2019-02-11
1.為什麼需要資料庫連線池:
資料庫連線是一種關鍵的、有限的、昂貴的資源。對資料庫連線的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式的效能指標。資料庫連線池正是針對這個問題提出來的。
資料庫連線池負責分配、管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而不是再重新建立一個;釋放空閒時間超過最大空閒時間的資料庫連線來避免因為沒有釋放資料庫連線而引起的資料庫連線遺漏。這項技術能明顯提高對資料庫操作的效能。
常見的資料庫連線池有:dbcp、cp30、druid。其中Druid是阿里巴巴開源平臺上一個資料庫連線池實現,是“Java語言中最好的資料庫連線池”。Druid能夠提供強大的監控和擴充套件功能。原始碼地址: https://github.com/alibaba/druid。
2.實現自己的資料庫連線池
參考okhttp3的ConnectionPool以及RealConnection的實現,學習okhttp3網路連線池的思想,實現資料庫連線池。
ConnectionPool類維護一個RealConnection的列表。
在增加新的連線時會清除空閒時間超過最大空閒時間的連線,保證資源的有效回收和記憶體的高效利用。
在提供連線是會返回負載最低的連線,保證所有連線的負載均衡。
3.使用代理模式實現RealConnection和RealPreparedStatement
1.RealConnection持有一個數據庫連線Connection,並且管理連線的負載和空閒時間。
2.RealPreparedStatement持有一個PreparedStatement,並且使用介面注入的方式回撥新建和關閉事件。
4.實現資料庫連線管理的介面類
ConnectionManager負責提供獲取連線的介面,使用單例模式。
使用的時候要保證ResultSet和RealPreparedStatement的正常關閉。
RealConnection conn = ConnectionManager.inst().getRealConnection(); String sql; RealPreparedStatement statement=null; ResultSet resultSet=null; try { sql = "..."; statement = conn.prepareStatement(sql); resultSet = statement.executeQuery(); ... } catch (SQLException e) { } finally { ToolUtil.closeQuietly(resultSet,statement); }