在Cassandra中插入返回空指针错误

时间:2016-05-14 00:42:12

标签: go cassandra

使用Cassandra如下插入数据,我担心在IntializeCassandra中初始化的东西不再存在?

var csession gocql.Session 

func IntializeCassandra(){
    fmt.Println("Intializing Cassandra")
    cluster := gocql.NewCluster("10.0.0.60")
    cluster.Keyspace = "tickdata"
    cluster.Consistency = gocql.Quorum
    csession, _ := cluster.CreateSession()
    defer csession.Close()
}

func main() {
    IntializeCassandra()
}

稍后在函数回调中,当我尝试将数据插入cassandra时,我得到一个空指针错误

func msgHandler(src *net.UDPAddr, n int, b []byte) {
    t := time.Now().UTC()
    tformat := t.Format("2006-01-02 15:04:05")
    md := &MarketData.MD{}
    proto.Unmarshal(b[:n], md)
    log.Printf("%d %d %d %d %s %.5f %.5f", md.Firm, md.Symbol, md.Expiry, md.Id, tformat, md.Bid, md.Ask)
    if err := csession.Query(`INSERT INTO timeseries (firm, symbol, expiry, quote_id, time, bid, ask) VALUES (?, ?, ?, ?, ?, ?, ?)`,
         md.Firm, md.Symbol, md.Expiry, md.Id, tformat, md.Bid, md.Ask).Exec(); err != nil {
         log.Fatal(err)
    }


panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x594687]

2 个答案:

答案 0 :(得分:0)

我认为你不想defer csession.Close()它在哪里。 <{1}}将在csession.Close()即将返回时被调用,因此会立即发生。

编辑:我刚刚意识到这个代码的另一个大问题。 IntializeCassandra创建一个名为csession, _ := cluster.CreateSession()的局部变量,它隐藏全局变量。您应该使用csession代替=

答案 1 :(得分:0)

代码有两个问题: 你应该在这里检查错误。如果失败,则不要继续

csession, err := cluster.CreateSession()
if err != nil {
     log.Fatal(err)
}

此外,您不需要延迟session.Close()或session.Close(),因为它将使您的连接无效并关闭。在从IntializeCassandra返回到main()的会话后,在main中写入延迟session.Close()。你还应该有一个名为Csession的全局变量,它可以在任何地方使用