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

标签 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]

最佳答案

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

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

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

关于go - 在 Cassandra 中插入返回空指针错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37221249/

相关文章:

java - 仅当输入值不为空时,查询生成器才创建更新语句

go - 云功能和本地依赖

templates - 使用 Golang 模板如何在每个模板中设置变量?

go - 如何检查通过 logrus 生成的日志,以获取编号。错误和警告

java - 无法解析导入com.datastax.spark.connector.CassandraJavaUtil

cassandra - PreparedStatements 是否由 CQL 字符串缓存? Datastax PreparedStatement 是否保留语句 ID?

windows - 在 user32.dll 中找不到 SetWindowsHookEx 程序

go - 使用Go检查目录中是否不存在文件扩展名

cassandra - Cassandra读取是否存在不一致?

用于 CRUD 事务的 Cassandra 压缩策略