HbaseTemplate未複用Connection等坑

個人博客地址:http://www.ltang.me/2019/09/17/hbasetemplate-reusing-connection/

以前都是使用Hbase的java api,自己寫getTable, 自己封裝get、scan、Result解析等方法以實現查詢等功能。

最近用springBoot寫項目,需要查詢Hbase,想到既然都用Spring了,直接就用它封裝好的HbaseTemplate豈不美哉,人家spring封裝的總比自己寫的好吧。於是引入了spring-data-hadoop和spring-data-hadoop-hbase兩個依賴,啓動的時候注入相關參數,構造一個HbaseTemplate的Bean,再注入其他相關Bean中使用。

剛用起來貌似挺美好,但用着用着,發現兩個比較坑的問題:

1. 可用方法太少

HbaseTemplate中只有基本的get、find、put方法,只能滿足類似於一次只查一個rowKey、一次只返回一個列、一次只put一個值等這樣簡單的需求。要實現多行、多列查詢,要不就用效率低下的scan方式,要不就多次調用方法,還要自己在外層封裝。

好在HbaseTemplate中有一個public的execute方法,理論上所有查詢、寫入的操作,都是封裝函數,最終調用這個execute方法完成請求。因此,要實現自己比較複雜的查詢、寫入的需求,就需要自己拓展這個HbaseTemplate類,封裝參數解析結果並返回。

2. 未複用Connection

Hbase的鏈接創建是一個比較重的操作,首先需要去鏈接zookeeper獲取hbase信息,然後再創建到hbase的鏈接。如果是大量頻繁的對hbase的查詢,當然是期望能夠複用鏈接Connection。

我本以爲都已經2.5.0版本了,spring好歹對HbaseTemplate中的connection做了池化吧。結果觀察日誌發現每次請求hbase都會去請求zookeeper,於是調試源碼,發現每次獲取完Table之後,table.close的時候,就把Connection也close掉了,坑爹啊,根本就沒有複用。

要改寫裏面getTable的邏輯太複雜,我選擇放棄…於是貪生怕死,選了簡單點的辦法,啓動的時候不再構造HbaseTemplate了,而是選擇構造一個Connection, 再注入Service中,當然,也要相應修改對hbaseTemplate方法的調用,簡而言之,這個方法,幾乎就是拋棄HbaseTemplate了,只是參考它的方法,封裝成了自己的HbaseTemplate,考慮到在問題1中自己也已經拓展了很多方法,也算是求仁得仁了。

僅做記錄和分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章