storm的bolt中使用redis有两种方式,1)在prepare中初始化jedis链接,在execute方法中,执行提交方法。 2)在prepare中初始化连接池,每次execute中从池中取jedis,然后再提交数据,然后归还连接。
用池好处:万一发生了连接异常,catch捕获调fail,下一条数据执行execute照常进行,从池里取连接不会受影响。另外一个好处,就是如果一个excutetor对应多个task,可以在executor里边建立数据连接池,每个task都从这个池里取连接,避免同时建立多个连接比较慢。
坏处:初始化池的时候比较耗时,也就是在bolt启动初期容易发生fail情况。
不用池好处: 连接分两种,一种全局的,一种每次使用之前建立连接,用完关闭。如果不用池的话,肯定会选择第一种,全局连接,就建立一次。这样的好处是初始化的连接快。后续每次也不用再重复取,关闭。
坏处:一旦发生连接超时或者其他的异常,连接中断了。。如果不捕获,worker就会因为异常自动重启,在重启期间fail的数据会很多。如果捕获了异常,因为在prepare中建的长连接,在下一条数据进来的时候已经不能使用,是broken pipe,必须得在finally中重建jedis,因为建立连接的时候不会判断异常,只有在数据提交的方法中才会有异常判断,所以在finally中可以执行重建连接,不会陷入再次异常的死循环。如果连接恢复了,就会用上一条finally里边新建的连接进行提交操作。 注意,一定要在finally里重建。
这样的坏处是,每一个catch,都要在finally中重建一下连接,如果连接持续异常,finally会建立多次连接。而之后恢复之前的那条连接被用到。