首页 > 解决方案 > Corda 节点使用 postgresql 和 schema 时结果集大于一行

问题描述

我目前正在尝试让 2 个节点(一个公证人,一个普通节点)使用相同的 Postgresql DB 存储数据(而不是嵌入式 H2),但每个节点使用不同的架构(节点架构,公证人架构)。

啊,顺便说一句,我用的是非企业版,4.3版。

公证节点是第一个启动的节点,它在公证模式中创建所需的表,那里一切似乎都很好。

但是当“正常”节点启动时,它会崩溃说:

[ERROR] 10:17:50+0000 [main] changelog.ChangeSet. - Change Set migration/node-core.changelog-postgres-blob.xml::modify checkpoint_value column type::R3.Corda failed.  Error: Migration failed for change set mig │
│      Reason:                                                                                                                                                                                                      │
│           master.changelog.json : liquibase.precondition.core.SqlPrecondition@7c682e26 : Result set larger than one row                                                                                           │
│  {changeSet=migration/node-core.changelog-postgres-blob.xml::modify checkpoint_value column type::R3.Corda, databaseChangeLog=master.changelog.json}                                                              │
│ [ERROR] 10:17:50+0000 [main] internal.NodeStartupLogging. - Exception during node registration: Could not create the DataSource: Migration failed for change set migration/node-core.changelog-postgres-blob.xml: │
│      Reason:                                                                                                                                                                                                      │
│           master.changelog.json : liquibase.precondition.core.SqlPrecondition@7c682e26 : Result set larger than one row                                                                                           │
│  [errorCode=14m37zv, moreInformationAt=https://errors.corda.net/OS/4.3/14m37zv]                                                                                                                                   │
[ERROR] 10:17:50+0000 [main] internal.NodeStartupLogging. - Exception during node startup: net.corda.core.utilities.Try$Failure cannot be cast to net.corda.core.utilities.Try$Success [errorCode=rmnkpl, moreInf │

我为公证人准备的 node.conf 如下:

dataSourceProperties: {
    dataSourceClassName="org.postgresql.ds.PGSimpleDataSource"
    dataSource.url="jdbc:postgresql://psql-path:5432/postgres?currentSchema=notary"
    dataSource.user="dbUser"
    dataSource.password="xxxxxx"
}

而“正常”节点的一个是:

dataSourceProperties: {
    dataSourceClassName="org.postgresql.ds.PGSimpleDataSource"
    dataSource.url="jdbc:postgresql://psql-path:5432/postgres?currentSchema=node"
    dataSource.user="dbUser"
    dataSource.password="xxxxxx"
}

如您所见,唯一的区别是 ?currentSchema 值。

我错过了什么吗?

编辑 :

文档中,他们说:

如果您的 PostgresSQL 数据库为不同的 Corda 节点托管多个模式实例(使用 JDBC URL currentSchema=my_schema),您将需要为在第一个实例之后添加的每个后续模式手动创建一个 hibernate_sequence 序列对象。Corda 没有为 Hibernate 提供模式命名空间设置,并且可能不会创建序列对象。运行 DDL 语句并将 my_schema 替换为您的模式命名空间:

我已经这样做了,当连接到数据库时,我可以看到我创建的表的两个模式。虽然对于公证人,我有 32 个表,而“普通”节点只有 26 个。

标签: corda

解决方案


我试图对不同的节点使用不同的方案。但我失败了。因为有些自动创建的表没有scheme。所以我决定在同一个数据库服务器上使用不同的数据库实例。

我认为这种方法可能会减轻您的痛苦。


推荐阅读