由于Hbase 1.0+ API没有使用HConnection
处理连接池,我想知道创建连接池的最佳做法是什么?
到目前为止,我已经创建了一个Connection
对象ThreadLocal
,但我不确定这是不是一个好主意。
一般情况下,由于连接对象太重,创建连接池是个好主意吗?
有没有人有任何想法?
答案 0 :(得分:3)
每个应用程序可以使用一个连接,因为创建它很重,而且是thread-safe
。但请确保您关闭Table
Admin
和Connection
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")){
...
}
答案 1 :(得分:3)
我问过Carter Page的问题,这是他的回答:
"您不必每个应用程序只使用一个连接,在某些情况下,您可能会发现需要多个连接。
一般来说,重要的是要知道连接是重的"创建成本高但对线程安全的对象。 Table,Admin和BufferedMutatator对象是轻量级的,不一定是线程安全的。 连接对象不一定转换为单个连接",并且可以在后台进行多路复用。最好把它想象成一个工厂。
我建议您尽可能创建一个Connection,如果您认为更多工厂可以提高性能,请仔细测试增加池。当然没有规则反对拥有更多的Connection对象。这只是一个可能不必要的开销问题。希望这会有所帮助。"