- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在尝试为我的应用程序实现一些计数器时遇到了这种奇怪的行为。基本上,我做了一个这样的柜台:
CREATE TABLE stats_dev.log_counters (
date text PRIMARY KEY,
all counter
);
然后我有一些特定类型的消息我也想计算,所以在我的 Go 应用程序中,我更改表格以添加我以前没有的列。
我的应用程序在增长,我开始有超过 30 列(不应超过 50 列),当我想要检索所有这些计数器时,结果中缺少一些列。
query := s.Query(`SELECT * FROM `+_apiCountersTable+` WHERE date IN ?`, dates)
res, err := query.Iter().SliceMap()
这会返回 34 列中的 30 列。虽然,当我在 CQLSH 上发出请求时:
cqlsh:stats_dev> SELECT * FROM api_counters WHERE date = 'total';
我得到了正确的完整结果。所以:
我的临时解决方案是从 system.schema_columns
表中选择列名,并将所有这些列名添加到我的 SELECT 查询 ...
非常感谢您的帮助。
最佳答案
我不熟悉 gocql 库,但听起来您可能遇到了不重新准备语句和 CASSANDRA-7910 的组合.
每当请求准备好时(比如 Select * from ___ where date in 中正在做什么?),它会向 cassandra 发送请求,cassandra 使用该表的列元数据进行响应,因此当您收到对从 cassandra 返回查询,您知道可以查找哪些列。看起来 gocql 有一个名为 Automatic query preparation
的功能,它可能会将您的请求视为准备好的语句。
当你改变一个表时,准备好的语句不会在你的客户端得到更新,所以真正解决这个问题的唯一方法是重新准备你的语句(不确定你是否有来自 gocql 的那个级别的控制)。然而,这仍然不起作用,因为 cassandra ( CASSANDRA-7910 ) 中存在错误,它不返回新列,因为它本身在其一侧缓存准备好的语句,并且在模式更改时不会使其无效。此问题已在 2.1.3 中修复(即将推出),可能值得针对 git 中的 cassandra-2.1 分支尝试此操作,看看是否能解决您的问题。
在您的应用程序运行时更改您的模式并不是异常模式,因此这是一个应该有效的方案,但不幸的是没有。我会看看是否有一种方法可以在 gocql 中重新准备语句。
我看到 cluster.go 中有一个 stmtsLRU
变量。如果你能以某种方式做到这一点,你就可以使准备好的语句无效。如果没有办法做到这一点,最好提出一个针对 gocql 的问题,因为您可以在其他驱动程序中再次重新准备语句。我知道 java 驱动程序允许您这样做,但会给您一个警告。我想这可能是 gocql 和其他驱动程序之间的一个很大的区别,因为在其他驱动程序中,您明确地使用了一个准备好的语句对象,而在 gocql 中,它会在库中自动为您处理。
由于 cassandra 错误突出,我认为您应该坚持不使用准备好的语句,而是进行如下查询:SELECT * FROM api_counters WHERE date = 'total';
关于gocql SELECT * 不返回所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28033756/
我有一个包含元组列的表,该列由一个 int64 和一个 uuid 配对组成: CREATE TABLE ks.mytable { fileid frozen >, hits
我在尝试为我的应用程序实现一些计数器时遇到了这种奇怪的行为。基本上,我做了一个这样的柜台: CREATE TABLE stats_dev.log_counters ( date text PRIM
这个问题在这里已经有了答案: How can I pass a slice as a variadic input? (3 个答案) 关闭 4 年前。 我需要用多个 ips 初始化 gocql,我想
使用 GOCQL(Golang、Cassandra),我最多发出 128 个请求,然后一切都挂起。我相信我正确发布查询的 getTicksForCassandraKey() 函数,但不确定。 GOCQ
我有一个这样设置的 docker compose 文件: version: "3" services: web: image: myApp container_name: web
我正在尝试查询测试键空间,例如: package main import "fmt" import _ "github.com/gocql/gocql" var ( gocql string
我正在开发一个带有聚类列的时间序列数据模型,即 CREATE TABLE events ( id text, time timestamp, type text, va
在我的 Cassandra 配置中,我启用了用户身份验证并通过 ssl 连接到 cqlsh。我在使用 gocql 实现相同时遇到了问题,以下是我的代码: cluster := gocql.NewClu
我在 Cassandra 中插入数据时遇到以下错误。我正在为 Cassandra 使用 gocql 客户端。 {"error":"gocql: too many query timeouts on t
如何接受Cassandra的时间戳并使用gocql转换成字符串?查询是什么? 最佳答案 gocql 可以将其读入 time.Time , 然后可以通过调用 String() 将其转换为字符串.例如:
尝试运行 go 文件(应该运行)时出现此错误 clusterCfg.ConnectTimeout undefined (type *gocql.ClusterConfig has no field o
从 gocql 运行查询时出现问题,但它从控制台运行正常。 DELETE FROM honda.car_v1 WHERE (i
我一直在阅读 http://godoc.org/github.com/gocql/gocql但是我不明白如何使用 gocql 进行 INSERT -- IF NOT EXIST。 它表示 func (
我在 Cassandra 中有一个 UDT,我有一个表,其架构中包含这些 UDT 的数组。这是一个示例: CREATE TYPE keyspace.test_type( x float,
我有以下 gocql 连接。 //cassandra connection cluster := gocql.NewCluster("localhost") cluster.Keyspace
如果您要使用 cqlsh 直接与 Cassandra 交互,您可以执行以下操作: $ cqlsh cqlsh:test> SOURCE '/home/me/reset_db.cql' 我已经多次尝试使
Query.Release() 在幕后做了什么?“将查询返回到池中”是什么意思?何时应使用 Query.Get() 以及何时使用 Query.GetRelease()? 最佳答案 正如您在文档中注意到
我有一个关于使用 blob 类型作为分区键的问题。我使用它,因为我需要保存哈希值。(哈希值返回二进制数据。通常为十六进制。) 我尝试使用 gocql 进行选择查询,但失败并出现以下错误。有什么方法可以
我一直在努力思考如何使用 Golang 中的驱动程序在 Apache Cassandra 中进行分页。 我有以下用于获取行的代码 /// Assume all other prerequisites.
我正在使用具有 9 个节点且复制因子为 3 的 scylla 集群。一个应用程序打开一个连接,读取和写入数据。 但是,我注意到在 scylla CQL 优化监控仪表板中,cross shard 的百分
我是一名优秀的程序员,十分优秀!