使用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编辑  收藏  举报

导航