先说下背景:
项目中用到Hbase,而然监控到控制台报线LinkeList线程安全问题,遂百度,得知Hbase是线程不安全的。
过程:
代码创建table的时候,用到了单例,单例table多线程进行写操作,肯定有问题。
所以,想找了线程池解决一下,找到个老哥用了HbasePool,可实际使用,发现,该类已经被官方弃用。
翻看源码,HconnectionManager 的 getTbale函数有个参数 getBatchPool(),让我们具体看下代码
@Override
public HTableInterface getTable(TableName tableName) throws IOException {
return getTable(tableName, getBatchPool());
}

这里,官方已经贴心的给创建的连接添加了线程池,和连接保持时间。
所以,在我们用的时候,直接调用getTable() 就可以了。
不需要单例table对象。
博客讨论了在项目中遇到的Hbase线程安全问题,由于使用单例Table对象进行多线程写操作导致问题。作者发现Hbase本身并不线程安全,并尝试使用HbasePool来解决,但发现该类已被弃用。通过深入Hbase源码,发现在`HconnectionManager`的`getTable`函数中,官方已内置线程池和连接超时管理。因此,建议直接调用`getTable`方法,避免单例Table,从而实现线程安全的操作。
11万+

被折叠的 条评论
为什么被折叠?



