【发布时间】:2017-09-18 00:03:14
【问题描述】:
我将我的 Clojure 应用程序部署到 AWS,当我的用户开始使用我的应用程序时,我还拥有带有 DynamoDB 的 Datomic Transactor(EC2)一段时间后发生了一些事情,Datomic Transactor 重新启动(出于某种原因),我的应用程序变得无响应,所以我重新启动了我的应用程序服务器(以重新建立事务处理程序连接)然后没有用户数据,根本没有数据!?
我使用的是相同的 URI("datomic:ddb://us-east-1/my-table/my-db"),我也没有不要调用 delete-db 或类似的函数。
我只调用 d/create-database 和 d/connect 来连接 Datomic。
这发生在我的开发过程中,但我不在乎那个时候,因为我认为我做错了什么或类似的事情。
如何恢复旧数据?
P.S:我还可以看到 DynamoDB 表有一些存储大小,比如 900KB 我假设我的数据在那里?虽然只有几个用户。
我的 Datomic 版本:"0.9.5561"
这是我的代码:
(defn establish-conn
[]
(try
;conf/get returns DB URI like: "datomic:ddb://us-east-1/my-table/my-db"
(d/create-database (conf/get :db-uri))
(reset! conn (d/connect (conf/get :db-uri)))
(catch Throwable t
(log/error "Could not establish db conn." t))))
我还有这段代码用于从 Transactor 故障/不可用等中恢复连接。
(defn fix-if-conn-ex
;;getting exception's error message
[err-msg]
(when (any? (str/includes? err-msg %) [":db.error/connection-released"
":db.error/transactor-unavailable"])
(db/establish-conn)))
【问题讨论】:
-
您的连接代码可能有问题,可以给我们看看吗?
-
@ValentinWaeselynck 我用我的代码编辑了问题。
-
我看不出有什么问题,所以我会质疑 conf/get 的作用,以及您如何观察到数据库为空。最后,我会确保代码的其他部分不会干扰
conn原子。 -
@ValentinWaeselynck conf/get 只返回 DB URI,即“datomic:ddb://us-east-1/my-table/my-db”。如果交易者失败/重新启动/成为不可用我检查那些异常,例如(:db.error/connection-released,:db.error/transactor-unavailable)并重新运行此建立连接以恢复连接问题。我认为Datomic中可能存在错误?并且丢失数据非常严重是不可接受的。
-
@ValentinWaeselynck 在我重新启动我的网络应用程序后,我看不到任何数据(用户)我也从我的 repl 连接到交易者(可以肯定)并列出我拥有的所有数据根本没有数据一些它是如何被删除的,并且发生了两次。另外我已经更新了上面的代码。