我正在使用Storm(java)和Cassandra。
我的一个Bolts将数据插入到Cassandra中。有没有办法在这个螺栓的实例之间保持与Cassandra的连接?
我的应用程序的写入速度很快。螺栓需要每秒运行几次,并且每次连接到Cassandra的事实都会阻碍性能。
如果我可以保持打开的静态连接,它会运行得更快,但我不确定在风暴中实现这一点。
澄清问题:
风暴拓扑中静态连接的范围是什么?
与其他具有工作的消息系统不同,其中“工作”在循环或回调中进行,可以在此循环外部使用变量(可能是静态连接),每次调用时,风暴螺栓似乎都会被实例化并且不能将参数传递给它们,那么如何使用与cassandra相同的连接?
答案 0 :(得分:9)
与其他具有工作的消息系统不同,循环或回调中的“工作”可以在此循环之外使用变量(可能是静态连接),风暴螺栓似乎每次都被实例化它们被调用,并且不能将参数传递给它们
说他们打电话给instantiated each time
风暴螺栓并不完全正确。例如,prepare
方法仅在初始化阶段被调用,即仅一次。从文档中说出当在群集上的worker中初始化此组件的任务时调用它。它为螺栓提供螺栓执行的环境。
所以最好的办法是将初始化代码放在准备或打开(如果是spouts)方法,因为它们将在任务启动时被调用。但是你需要使它成为线程安全的,因为它将在它自己的线程中同时被每个任务调用。
另一方面,execute(Tuple tuple)
方法实际上负责处理逻辑,并且每次从相应的喷口或螺栓接收元组时都会调用它。(所以这实际上就是所谓的每个单次螺栓运行)
当 IBolt将要关闭时调用cleanup
方法,文档说
没有保证会调用清理,因为 supervisor kill -9在集群上的工作进程。一个上下文 清除保证被调用的地方是拓扑被杀死的时候 当 以本地模式运行Storm时
因此,您无法将变量传递给它,您可以使用prepare方法实例化任何实例变量,然后在处理过程中使用它。
关于数据库连接,我不完全确定您的用例,因为您没有放任何代码,但维护资源池听起来对我来说是一个不错的选择。