筆者最近在換工作的時,被面試官問數據庫和連接池相關的一些問題。
下面從面試這塊開始
簡單介紹一下筆者項目中MySQL的使用情況。
項目中使用MySQL做數據存儲,Redis做數據緩存。讀寫數據流程如下:
- 讀數據:先查詢Redis中是否存在,存在直接取出數據,不存在從MySQL查詢並保存包Redis中緩存起來。
- 寫數據:先寫入Redis,然后異步提交到MySQL寫入線程,實現數據落地。
問題1:如何保證數據讀寫的“原子性”?如何解決臟數據?
眾所周知,當使用數據庫跨表操作時,利用數據庫引擎提供的事務和回滾機制,可以保證數據庫跨表操作的原子性。
一方面在項目中引入數據緩存層也是一種常見的減輕數據庫壓力的做法。另一方面引入了緩存增加了數據操作的復雜度。
如何解決緩存中和數據庫中數據不一致的問題?
筆者以線上項目為例簡單的說了說。在線上的代碼,主要以緩存層數據為主,數據不統一的情況,會在下一次落地時覆蓋數據庫的數據,實現同步。
假如是因為版本迭代數據庫字段變更導致數據庫落地錯誤時,由於Redis緩存的有效期是7天,在7天內,手動執行腳本將數據重新落地。
由於面試官一再強調是自動修復臟數據。
說實話筆者在保證Redis和MySQL兩者數據操作的原子性這塊。所以也沒有什么好的辦法。
由於面試官一再詢問,筆者就稍微講了講一個思路。也許是否可以使用數據庫的原子性,回滾的時候回退數據?
當然事實證明一時的想法總是有漏洞的。數據回退涉及到數據回退前多次被修改的復雜情況。顯得不是很合適。
最后尷尬的是面試官的結論:(大意如下)
在修改數據前,盡可能多的判定用戶是否滿足操作的條件,以便於提早發現問題並退出, 以避免數據操作。同時避免異步操作數據庫,同步操作及早出現問題並退出。
wtf... 當時一下子感覺自己有點懵逼的。才發現整個就理解錯了。瞬間也是好尷尬。
問題2:HikariCP是什么?
HikariCP是一個高性能的JDBC連接池。Hikari是日語“光”的意思。可能是目前java業界最快的數據庫連接池(BoneCP因此停止維護,其作者推薦HikariCP)。
面試官說項目用的c3p0作為數據庫連接池。還問了何時連接池會關閉數據庫的連接。
說實在的,當時筆者沒回答好,一般數據庫連接池會自動管理數據庫連接建立、復用和關閉。一般情況下不會關閉已經建立的數據庫連接。
連接池關閉連接方面,其他連接池不清楚,HikariCP會在設置的最大生命周期后,最大空閑時間后等多個條件作用下自動關閉釋放連接。
下面是總結
數據庫連接池技術
數據庫連接池負責分配、管理和釋放數據庫的連接。
- 數據庫連接復用。重復使用現有的數據庫連接,可以避免連接頻繁建立、關閉的開銷。
- 統一的連接管理。釋放空閑時間超過最大空閑時間的數據庫連接,避免因為沒有釋放數據庫連接而引起的數據庫連接泄漏。
一些數據庫連接池的對比
首先明確:無論任何形式的數據庫連接復用(數據庫連接池技術)都避免了頻繁建立、關閉數據庫連接帶來的開銷。性能相對於沒有連接池有質的提升。
另外一點需要明確:數據庫連接池一般不會成為整個程序的性能瓶頸。更多的出現在數據庫讀寫,帶寬,cpu等方面(開始人雲亦雲模式,o(∩_∩)o 哈哈)。
下面引入正文,先來一個對比。
文章數據庫連接池性能比對很早之前看到過,但一直沒找到原帖。
皇天不負有心人,今天總算是挖出來了原帖(鄙視一下盜鏈和轉帖不掛源地址的)。
HikariCP
HikariCP可能是目前業內最快的數據庫連接池。
說到HikariCP就不得不說BoneCP。筆者之前也是BoneCP的使用者。突然那么一天(忘記具體是哪天了)想看看BoneCP是否有新版本。
然后發現BoneCP作者在項目主頁的描述說不再更新BoneCP並且推薦了HikariCP。
筆者也有段時間沒關注這個類庫了,面試的時候因為也好久沒看了,所以講的也不是很清楚。於是就抽空復習總結一下。
筆者之前在博客園發表過一篇關於HikariCP的文章,簡單講了Spring+Mybatis+HikariCP的配合使用。
那時候剛接觸HikariCP,被官方的測試數據所吸引,畢竟BoneCP停產了,而且在代碼基本上不需要改動的情況下就能獲得更好的性能,何樂而不為呢? 所以決定試試這個“新家伙”
HikariCP的官方Wiki中提到的為什么HikariCP是如何實現這么高效率。詳細見:
Down the Rabbit Hole
掉進兔子洞? 反正我是不懂這是什么諺語。o(∩_∩)o 哈哈。
大概內容如下:
- 優化字節碼(JVM內聯),減少生成的機器碼
- 精簡代碼, 使用Javassist生成委托。
- 無鎖容器。FastStatementList、ConcurrentBag
- 等等針對BoneCP的優化。(好針對BoneCP啊,o(∩_∩)o 哈哈)
Druid
Druid是阿里巴巴開源的“為監控而生的數據庫連接池!”。
性能測試過程略低雨HikariCP,但是提供了強大的監控和擴展功能。支持psCache。
有興趣可以去GitHub查看。有中文文檔。o(∩_∩)o 哈哈。阿里威武
作者:TinyZ 出處:http://www.cnblogs.com/zou90512/ 關於作者:努力學習,天天向上。不斷探索學習,提升自身價值。記錄經驗分享。 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接 如有問題,可以通過 tinyzzh815@gmail.com 聯系我,非常感謝。 筆者網店: https://shop70768633.taobao.com/. 歡迎廣大讀者圍觀