使用zookeeper实现分布式锁时的注意点
一. 指定一个空的Watcher实现,可以消除控制台的错误
1 Zookeeper zk = new Zookeeper("ip:port",timeout,new Watcher(){ 2 @Override 3 process(WatcherEvent watcherEvent){ 4 // 留空 5 } 6 });
二. 注意zookeeper连接的复用
class 你的类{ // 方法一: 维护静态成员 private static Zookeeper client=null; public Zookeeper getClient(){ if(client==null){ client = new Zookeeper("ip:port",timeout,空的Watcher); } return client; } // 方法二: 每次新构造一个连接 public Zookeeper getClient(){ return new Zookeeper("ip:port",timeout,空的Watcher); } }
上述原理和mybatis操作数据库一样,使用for循环每次insert一条vs使用foreach进行批量插入,节省IO,性能大幅提高,而且对于没有修改zookeeper配置的同学,不会报错
三. 注意创建逻辑
// 很多同学会遇到NoNodeFor的错误,这是因为层级必须一层一层来 public void checkRoot(){ Stat result = getClient().exists("/你的根目录",false); if(result==null){ String parent = getClient().create("/你的根目录",字节数组byte[], 权限字段Ids.open_ACL, 模式EPHEMERAL_SEQUENTIAL); } } public String getLock(){
//先检查根目录 checkRoot(); String lock = getClient().create("/你的根目录/你的子目录",字节数组byte[], 权限字段Ids.open_ACL, 模式EPHEMERAL_SEQUENTIAL); //这样不会因为没有"/你的根目录"而导致创建失败 ....后续拿锁 }
posted on 2022-12-20 16:26 gu0zh1q1ang 阅读(43) 评论(0) 编辑 收藏 举报