分享

storm连接oracle数据库失败

lihy114 发表于 2016-3-28 17:23:26 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 5 10518
在网上找了个例子,是storm通过从数组中随机取字符串写入操作系统文本的,我打包后在集群环境跑了一下,一切正常。

在这个基础上,我想先修改为从数组随机取字符串,然后写入到oracle数据库,我重新写了blot的类,具体代码如下

package cn.itcast.storm.bolt;

import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import backtype.storm.task.TopologyContext;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.IRichBolt;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Tuple;

public class WriteOracleBolt extends BaseBasicBolt {

    private static final long serialVersionUID = -6586283337287975719L;
       
        private static final Log log = LogFactory.getLog(WriteOracleBolt.class);
       
        Connection con = null;
        PreparedStatement psta = null;
       
        //boolean flag = false;
       
       
        public WriteOracleBolt() {
                log.warn("&&&&&&&&&&&&&&&&& WriteOracleBolt constructor method invoked");
        }


        public void prepare(Map stormConf, TopologyContext context) {
                log.warn("################# WriteOracleBolt prepare() method invoked");
                        //writer = new FileWriter("/home/" + this);
                        try {
                                String sql = "insert into test(name) values(?)";
                                con = BaseDao.getConnection();
                                con.setAutoCommit(false);
                                //将SQL语句传入进行预编译
                                psta = con.prepareStatement(sql);
                        } catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                       
        }

       
        public void declareOutputFields(OutputFieldsDeclarer declarer) {
                log.warn("################# WriteOracleBolt declareOutputFields() method invoked");
        }
       
       
        public void execute(Tuple input, BasicOutputCollector collector) {
                log.warn("################# WriteOracleBolt execute() method invoked");
                String s = input.getString(0);
                //writer.write(s);
                //writer.write("\n");
                //writer.flush();
                try {
                        psta.setString(1, s);
                       
                        psta.executeUpdate() ;
                       
                        con.commit();
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
               
        }
}



再重新打包后,放到storm集群运行时,ui界面出报出这个错误了
java.lang.RuntimeException: java.lang.NullPointerException        at backtype.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:84)        at backtype.storm.utils.DisruptorQueue.consumeBatchWhen


这是什么问题呢?


是代码有问题还是配置有问题?




已有(5)人评论

跳转到指定楼层
wscl1213 发表于 2016-3-28 18:57:51
storm是分布式,楼主是否每台机器都部署上去了
回复

使用道具 举报

bioger_hit 发表于 2016-3-28 19:00:44
配置应该没有问题,问题应该出在链接数据库上,一些代码确定兼容
回复

使用道具 举报

lihy114 发表于 2016-3-29 09:45:58
wscl1213 发表于 2016-3-28 18:57
storm是分布式,楼主是否每台机器都部署上去了

每台机器都部署?   storm各节点运行是正常的,运行代码只需要部署到nimbus节点的
回复

使用道具 举报

lihy114 发表于 2016-3-29 09:50:56
bioger_hit 发表于 2016-3-28 19:00
配置应该没有问题,问题应该出在链接数据库上,一些代码确定兼容

已经添加了连接数据库的驱动,代码在非storm环境下连接数据库是正常的,我再仔细看看
回复

使用道具 举报

lihy114 发表于 2016-3-29 15:24:41
已经解决了,代码是正常的,是数据库驱动配置出的问题,在linux下面使用java连接数据库的时候,还需要将数据库驱动放置在java_home的路径下面
通过本地调试的模式发现的这个问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条