我们目前正在为 Spanner 检索 DatabaseClient,如下所示:
DatabaseClient dbClient = spanner.getDatabaseClient(...)
Run Code Online (Sandbox Code Playgroud)
跨多个线程使用这个 DatabaseClient 对象是否安全?具体来说,我们想要依赖注入 DatabaseClient 的一个实例,并想了解它是否是线程安全的并且可以重用,或者每个线程是否应该调用 spanner?
这是在 Web API 服务中使用的,因此对 URL 的大量传入请求,每个传入请求都需要一个扳手连接。什么是最好的分享对象?例如,我们不希望每个会话都必须加载 Google JSON 凭据(我们假设发生在 SpannerOptions Builder 中)。
java thread-safety google-cloud-platform google-cloud-spanner
我在 Cloud Spanner 中创建了一个测试表并填充了 1.2 亿行。我为表创建了一个复合主键。
当我运行一个简单的“select count(*) from”查询时,云扳手 Web UI 大约需要一分钟才能返回结果。
有没有其他人面临类似的问题?
使用主键快速执行的现有查询在没有通知的情况下大幅减慢(10 毫秒 -> 8 秒),因为现在会自动使用为另一个用例创建的二级索引。
Cloud-Spanner-Web-Query 的“说明”告诉我使用了二级索引。如果我更改顺序(仅用于测试目的)或提供 FORCE_INDEX 查询再次快速。
我可以通过使用Cloud Spanner 查询语法文档中记录的FORCE_INDEX=_BASE_TABLE来“修复”这个问题。
我的问题是:我真的必须为每个查询都这样做以避免这种影响吗?
这将查询定义与索引定义混合在一起,恕我直言,这不是一件好事。
带有主索引的表:
CREATE TABLE change_history (
userId INT64 NOT NULL,
createdAtUnique INT64 NOT NULL,
itemId STRING(512) NOT NULL,
newValue FLOAT64 NOT NULL,
oldValue FLOAT64 NOT NULL,
) PRIMARY KEY (userId, itemId, createdAtUnique DESC)
Run Code Online (Sandbox Code Playgroud)
二级指标:
CREATE INDEX ch_userid_createdatunique_all ON change_history (
userId,
createdAtUnique
) STORING (
newValue,
oldValue
)
Run Code Online (Sandbox Code Playgroud)
原始查询:
SELECT * FROM change_history WHERE
userId = 2563
AND itemId = "215414"
AND createdAtUnique …Run Code Online (Sandbox Code Playgroud) 默认情况下,我在 Google Spanner 中定义的表存储在“未命名”的默认架构中,如信息架构文档中所述。
我需要什么:我需要我定义的表具有命名模式。有没有办法创建命名模式并在其中包含表?
我做了什么:我跑SELECT * from INFORMATION_SCHEMA.SCHEMATA了,结果有两行。一个是SCHEMA_NAMEas INFORMATION_SCHEMA,另一个是空字符串,这是我定义表的地方。
我试图更新表中的SCHEMA_NAME列,该列是一个空字符串,但似乎不支持 DML 语句。INFORMATION_SCHEMA.SCHEMATASCHEMA_NAME
有人可以给我一个关于如何进行这项工作的提示,或者这是否可能?已经谢谢了!
在比较 Cloud Spanner 与 BigQuery 时,我试图弄清楚与 ANSI SQL(仅限选择部分)相比,BigQuery 在 SQL 中存在哪些限制?
BigQuery 是否支持 ANSI SQL 的所有复杂联接?
此外,有什么是 Cloud Spanner 可以做而 BigQuery 不能做的吗?
即使对于非常小的表(10行),在线更新扳手架构也需要几分钟.
即 - 添加/删除/更改列,添加表等.这对于开发过程和新版本部署来说非常令人沮丧.
有改进的计划吗?
几个问题:
提前致谢
如何查看我的数据库是否有任何索引?
对于特定的表呢?
在本地使用 Google Spanner 模拟器运行 (0.8.0)
export SPANNER_EMULATOR_HOST=localhost:9010
Executing: docker run -p 127.0.0.1:9010:9010 -p 127.0.0.1:9020:9020 gcr.io/cloud-spanner-emulator/emulator:0.8.0
[cloud-spanner-emulator] 2020/07/17 22:23:21 gateway.go:135: Cloud Spanner emulator running.
[cloud-spanner-emulator] 2020/07/17 22:23:21 gateway.go:136: REST server listening at 0.0.0.0:9020
[cloud-spanner-emulator] 2020/07/17 22:23:21 gateway.go:137: gRPC server listening at 0.0.0.0:9010
Run Code Online (Sandbox Code Playgroud)
这可以与Google JDBC Spanner 驱动程序一起使用吗?
在我的测试中,我的猜测是:
不,目前不支持此功能。
我可以设法连接到 Spanner 的 GCP 实例,但不能连接到模拟器。当我尝试使用端口 9010 或 9020 时,它基本上挂起。
我的jdbc连接字符串如下(项目、实例和数据库都已创建):
gcloud spanner databases list --project=local-project --instance=local-instance --configuration=spanner-emulator --format json
[
{
"name": "projects/local-project/instances/local-instance/databases/myDatabase",
"state": "READY"
}, …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置一个启动云扳手并初始化它的 Docker 容器。
使用谷歌提供的官方 docker 镜像:gcr.io/cloud-spanner-emulator/emulator
我希望在启动时自动初始化扳手。
我用 docker 文件尝试了各种方法,总结一下:
FROM gcr.io/cloud-spanner-emulator/emulator
RUN some gcloud command after to initialize local spanner db
Run Code Online (Sandbox Code Playgroud)
但是,由于缺乏有关该映像如何工作的信息,因此很难确定是否可以在每次容器启动时对其进行初始化。
我重复一遍,我需要在容器安装时自动运行它。它将建设管道。
有没有办法用这个提供的 docker 镜像来做到这一点?或者我应该创建自己的 dockerfile 通过 gcloud cli 安装模拟器?