Java 在Akka模型中共享Cassandra群集/会话

Java 在Akka模型中共享Cassandra群集/会话,java,cassandra,akka,cassandra-2.0,Java,Cassandra,Akka,Cassandra 2.0,我在Cassandra驱动程序中面临内存泄漏问题。在检查内存不足堆错误后,我可以看到一条警告,指出我正在为每个物理群集创建多个群集/会话,我不应该这样做。因为在我的Akka配置中,我最多有32个,我可以想象我正在创建32个集群/会话实例,很可能是我在强制内存泄漏 我现在的问题是。如何在参与者之间共享Cassandra集群/会话的一个实例,而不破坏Akka的不可变参与者范例 考虑拥有一个单例(例如,您知道的一个类在您的世界末日引导时仅实例化一次),并在构建参与者时将其传递到道具中 object M

我在Cassandra驱动程序中面临内存泄漏问题。在检查内存不足堆错误后,我可以看到一条警告,指出我正在为每个物理群集创建多个群集/会话,我不应该这样做。因为在我的Akka配置中,我最多有32个,我可以想象我正在创建32个集群/会话实例,很可能是我在强制内存泄漏

我现在的问题是。如何在参与者之间共享Cassandra集群/会话的一个实例,而不破坏Akka的不可变参与者范例

考虑

拥有一个单例(例如,您知道的一个类在您的世界末日引导时仅实例化一次),并在构建参与者时将其传递到
道具中

object Main extends App {
   val services = new Services
   // ...
   val actor1 = system.actorOf(Props(classOf[MyActor], services), "actor1")
   val actor2 = system.actorOf(Props(classOf[MyActor], services), "actor2")
}

class Services {
   val cassandraSession = ??? // ... however you create it
}
您也可以从
对象创建一个Cassandra会话并引用它,但它通常不太可测试


示例代码是Scala,但同样的方法也适用于Java。

我在Java,但即使我将集群和会话设置为静态,它也不会打破Akka的不可变参与者状态教条?这就是我问题的原因。我想用Akka agentI来代替,恐怕没那么容易,我们正在用一种非常古老的方式用spring初始化actor。但我明白你的意思。谢谢无论如何,使用代理的想法最糟糕吗?避免使用代理,因为根据“代理已被弃用,并计划在下一个主要版本中删除”很好,谢谢。您是否建议其他解决方案?@paul您也可以按照您的方式创建actor,并在启动actor(如John所建议)后立即使用tell传递singleton,然后在receive方法中进行设置。您也可以将会话存储在singleton/静态对象中(在Java中,它将是一个类的静态字段)并从Actor处引用。我不喜欢这种做法,因为它的可测试性很差(因此我在Actor道具中传递服务),但这是一个选项。@paul如果可以,请接受答案。