我正在使用hbase-client 1.2.3,我看到Connection.getTable()方法中有一条注释:
检索用于访问表的Table实现。
返回的表不是线程安全的,应该是一个新实例 为每个使用线程创建。
这是一个轻量级的操作,汇集或缓存 返回表
既不需要也不需要。
所以我开始想知道处理连接和表的最佳做法是什么?
例如,我有一个主类,会启动几个线程,让我们调用A,B,C ......
现在我调用“Connection connection = ConnectionFactory.createConnection();”在main方法中,将连接传递给每个线程作为每个线程的参数。然后在每个线程中使用init class。
我想知道这是最好的方法吗?它会导致某些线程安全或效率或任何其他问题吗?
答案 0 :(得分:0)
创建连接是一项繁重的操作。连接实现是线程安全的,因此客户端可以一次创建一个连接,并与其他线程共享。另一方面,表和管理实例重量轻且不是线程安全的。 通常,实例化每个客户端应用程序的单个连接,并且每个线程都将获得自己的Table实例。不建议对Table和Admin进行缓存或池化。
因此,我建议您仅初始化一次连接,并在每次需要时创建一个新表。
示例代码:
//initialize connection
Configuration hBaseConfig = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(hBaseConfig);
//initialize table
try (Table table = connection.getTable(TableName.valueOf("table-name"))) {
//use table
}