Java Storm拓扑的Mongo连接池

Java Storm拓扑的Mongo连接池,java,mongodb,apache-storm,Java,Mongodb,Apache Storm,要连接到mongo数据库,在非storm应用程序中,我们将创建mongo类的单例实例,并在应用程序中共享它 想知道在storm框架中实现Mongo连接池的正确方法是什么吗? 我们尝试过的选项: 我们有一个从Mongo数据库读取数据的喷口。我们只是将singleton Mongo类放在喷口中,并在open方法中初始化它?-但这种方法使得在需要时无法将Mongo实例共享给bolt。 想要有正确的方式做一些指针。 风暴中的连接池有点复杂,因为你需要考虑两件事: 您正在群集环境中运行->多台计算机需

要连接到mongo数据库,在非storm应用程序中,我们将创建mongo类的单例实例,并在应用程序中共享它

想知道在storm框架中实现Mongo连接池的正确方法是什么吗?

我们尝试过的选项:
我们有一个从Mongo数据库读取数据的喷口。我们只是将singleton Mongo类放在喷口中,并在open方法中初始化它?-但这种方法使得在需要时无法将Mongo实例共享给bolt。

想要有正确的方式做一些指针。

风暴中的连接池有点复杂,因为你需要考虑两件事:

  • 您正在群集环境中运行->多台计算机需要自己的连接
  • 每个Storm worker都在单独的JVM中运行->执行器很可能不是在同一个worker中运行。。。这意味着没有共享连接
  • 所以,不要太担心。继续使用你的类的Singleton实例(比如@bridiver's answer),就像正常的那样在你的壶嘴和螺栓中使用。如果他们碰巧共享同一个JVM,那么他们将共享同一个池,您就可以开始了

    关于初始化,我的工作如下:

  • 通过构造器将配置信息传递到喷口/螺栓
  • 打开
    (用于喷嘴)或
    准备
    (用于螺栓)方法中初始化连接
  • 喷嘴和螺栓之间的连接不是共用的

  • 缺少拓扑初始化方法可能会有问题。我们所做的是在一个单例上调用一个方法,该方法在使用它的任何螺栓的prepare方法中初始化连接池(以获取配置)。我们使用带有标志的同步方法来确保实际初始化只执行一次。调用synchronized方法会有很小的性能损失,但在大多数情况下这不是问题

    Mongo.create_connection_pool(conf)
    
    方法呢

    public static synchronized void create_connection_pool(Config conf) {
      if (connected)
         return;
      else {
        initialize connection...
        connected = true;
      }
    }
    

    我认为austin指的是池初始化本身。这取决于你是否能自动处理的实现。@Bridriver说得好,我明白你的意思。我更新了我的答案,以包括我对初始化所做的操作。现在我不使用单例,每个喷口/螺栓管理自己的连接。每个Storm执行器在单独的JVM中运行?不是工人在一个单独的地方工作吗JVM@user2759265哦,你是对的。。是工人。我更新了答案。