Hbase 1.0.0连接池
Hbase 1.0.0 connection pool
由于 Hbase 1.0+ API 没有使用 HConnection
处理连接池,我想知道创建连接池的最佳实践是什么?
到目前为止,我已经创建了一个 Connection
object as ThreadLocal
,但我不确定这是否是个好主意。
一般来说,既然连接对象这么重,创建一个连接池是个好主意吗?
有人知道吗?
您可以为每个应用程序使用一个连接,因为创建它很繁重而且 thread-safe
。但是请确保关闭从 Connection
获得的 Table
和 Admin
private static class ConnectionHolder{
private final Connection connection;
private ConnectionHolder(){
connection = ConnectionFactory.createConnection(config);
}
Connection getConnection(){
return connection;
}
}
如果您使用此方法,请不要公开 connection
以免调用者意外关闭它。但是记得关闭 Tables
和 ResultScanners
Table getTable(String name){
Table table = connection.getTable(TableName.valueOf(name));
return table;
}
try(Table table = getTable("tableName")){
...
}
我已经问过 Carter Page 的问题,这是他的回答:
“您不必为每个应用程序只使用一个连接,在某些特定情况下,您可能会发现需要多个连接。
一般来说,需要知道的重要一点是连接是 "heavy" 创建成本高昂但线程安全的对象。 Table、Admin 和 BufferedMutatator 对象是轻量级的,不一定是线程安全的。
连接对象不一定转换为单个 "connection",并且可以在幕后多路复用。最好把它想象成一个工厂。
我建议您尽可能创建单个连接,如果您认为更多工厂会提高性能,请仔细测试增加池。当然没有禁止拥有更多 Connection 对象的规则。这只是潜在的不必要开销的问题。希望这会有所帮助。"
由于 Hbase 1.0+ API 没有使用 HConnection
处理连接池,我想知道创建连接池的最佳实践是什么?
到目前为止,我已经创建了一个 Connection
object as ThreadLocal
,但我不确定这是否是个好主意。
一般来说,既然连接对象这么重,创建一个连接池是个好主意吗?
有人知道吗?
您可以为每个应用程序使用一个连接,因为创建它很繁重而且 thread-safe
。但是请确保关闭从 Connection
Table
和 Admin
private static class ConnectionHolder{
private final Connection connection;
private ConnectionHolder(){
connection = ConnectionFactory.createConnection(config);
}
Connection getConnection(){
return connection;
}
}
如果您使用此方法,请不要公开 connection
以免调用者意外关闭它。但是记得关闭 Tables
和 ResultScanners
Table getTable(String name){
Table table = connection.getTable(TableName.valueOf(name));
return table;
}
try(Table table = getTable("tableName")){
...
}
我已经问过 Carter Page 的问题,这是他的回答:
“您不必为每个应用程序只使用一个连接,在某些特定情况下,您可能会发现需要多个连接。
一般来说,需要知道的重要一点是连接是 "heavy" 创建成本高昂但线程安全的对象。 Table、Admin 和 BufferedMutatator 对象是轻量级的,不一定是线程安全的。 连接对象不一定转换为单个 "connection",并且可以在幕后多路复用。最好把它想象成一个工厂。
我建议您尽可能创建单个连接,如果您认为更多工厂会提高性能,请仔细测试增加池。当然没有禁止拥有更多 Connection 对象的规则。这只是潜在的不必要开销的问题。希望这会有所帮助。"