HBase(五) HBase JAVA API - HTable、HTablePool與底層連接的共享
單表交互的API,HBASE的CRUD操作都是使用這個類。繼承自HTableInterface接口。

HTable實例的創建過程比較消耗資源,如每個實例都要掃描.META.表,以檢查該表是否存在、是否可用,還有其他的一些操作,所以HTable實例不適合頻繁的創建,要盡量復用。
HTable不是線程安全類,并發場景要注意隔離。如果是多線程場景,適合為每個線程分配一個HTable實例,或者使用HTablePool。
HTable的所有操作,都保證也只能保證行級別的原子性。
HTablePool是HTable的池化管理類,有幾種構造函數,無參的構造函數默認會創建一個無限大的池,一般不建議這么用,使用需要指定最大實例數目的構造函數。還有自定義HTableInterfaceFactory的構造函數,使用這種構造函數可以自定義HTable的一些特殊的配置,比如一些初始化操作等。
使用getTable(String tableName)方法從池中取HTable實例,使用后調用putTable(HTableInterface table)方法放回。
有一點需要注意(個人認為也是hbase實現的問題),maxSize參數并不強行限制用戶能得到的HTableInterface實例的上限,客戶端能用getTable方法訪問盡可能多的table實例。這個參數僅僅能設置池中能存放的HTableInterface實例的數目,比如maxSize=5,調用10次getTable會創建10個實例,后調用putTable,只有5次可以發揮作用,后面5次會被忽略,包括工廠的release機制也不會被觸發,只是單純的拋棄。
Configuration conf = HBaseConfiguration.create();
HTablePool pool = new HTablePool(conf, 5);
HTableInterface [] tables = new HTableInterface[10];
// 超出容量一樣可以分配
for(int i=0;i<10;i++){
tables[i] = pool.getTable("t1");
System.out.println(Bytes.toString(tables[i].getTableName()));
}
for(int i=0;i<10;i++){
pool.putTable(tables[i]);
}
pool.closeTablePool("t1");
closeTablePool方法會遍歷所有保存在列表中與參數對應的表的引用,使用工廠的release機制,會釋放一張表的所有資源。所有的資源都要處理異常并釋放,代碼中使用過的表都要調用這個方法去釋放資源
每個HTable實例底層都需要與服務器連接,連接是HConnection類表示的,并使用HConnectionManager類管理和共享。使用API時不需要直接實例化這兩個類,只需要創建一個Configuration實例,然后隱式的使用連接。
deleteConnection(org.apache.hadoop.conf.Configuration conf)
deleteAllConnections(boolean stopProxy)
轉載請注明出處:華為云博客 https://portal.hwclouds.com/blogs
hbase
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。