【问题标题】:How can the Corda node be extended to work with databases other than H2?如何扩展 Corda 节点以使用 H2 以外的数据库?
【发布时间】:2018-10-18 07:28:09
【问题描述】:

我已经用 PostgreSQL 运行 Corda。如何扩展 Corda 以与其他数据库一起使用?将数据库驱动添加为 Gradle 依赖并尝试连接其他数据库是否足够?

【问题讨论】:

    标签: corda


    【解决方案1】:

    Corda 使用 Hibernate 5.x 和 HikariCP JDBC 连接池。

    所有查询均由 Hibernate 生成,预计来自 finance 模块的一个查询(CashSelection 使用 JDBC PreparedStatement 和特定于每个数据库供应商的 SQL 构造)。

    配置数据库

    在运行时,节点会在其node.conf 文件中查找 JDBC 设置。默认情况下,它连接到嵌入式 H2 服务器(参见 Corda 源代码中的文件/node/src/main/resources/reference.conf)。

    要将 Corda 与其他数据库(*)一起使用或以非默认设置连接,node.conf 文件需要设置节点的数据源属性:

    dataSourceProperties = {
        dataSourceClassName = "org.postgresql.ds.PGSimpleDataSource"
        dataSource.url = "jdbc:postgresql://[HOST]:[PORT]/postgres"
        dataSource.user = [USER]
        dataSource.password = [PASSWORD]
    }
    database = {
        transactionIsolationLevel = READ_COMMITTED
    }
    jarDirs = [PATH_TO_JDBC_DRIVER_DIR]
    

    其中dataSourceProperties 是典型的 JDBC 设置,database 条目包含 Hibernate 特定设置,jarDirs 是包含驱动程序的目录的路径列表(例如 jarDirs = ['/Library/postgres-lib'])。

    在 deployNodes 中配置数据库

    您可以通过在deployNodes 中传递设置来避免手动配置数据库设置。例如:

    node {
        name "O=Bank C,L=Tokyo,C=JP"
        p2pPort 10010
        webPort 10011
        rpcSettings {
            address("localhost:10036")
            adminAddress("localhost:10037")
        }
        cordapps = ["$project.group:finance:$corda_release_version"]
        rpcUsers = ext.rpcUsers
        extraConfig = [
            ‘dataSourceProperties.dataSource.url’ : ‘jdbc:postgresql://localhost:32774/postgres’,
            ‘dataSourceProperties.dataSourceClassName’ : ‘org.postgresql.ds.PGSimpleDataSource’,
            ‘dataSourceProperties.dataSource.user’ : ‘postgres’,
            ‘dataSourceProperties.dataSource.password’ : ‘postgres’,
            ‘jarDirs’ : [ ‘/Library/Java/postgres’ ]
        ]
    }
    

    添加驱动程序

    添加这些设置后,需要在部署节点后将 JDBC 驱动程序添加到 extraConfig.jarDirs 中指定的位置。

    另一种方法是在 node/build.gradle 中添加 JDBC 驱动程序依赖项(就像对 PostgreSQL 所做的那样)。每当编译/构建节点时,它都会包含开箱即用的驱动程序。

    (*) Corda Open Source 附带 H2 文件数据库,并且对 Postgres 和 Sql Server 具有实验性支持。 Corda Enterprise 已对包括 Sql Server、AzureSQL、Postgres 和 Oracle 数据库在内的其他数据库提供更广泛的测试支持。尽管使用了 Hibernate/JDBC,但某些查询可能需要修改才能在所有支持的数据库中兼容。 Corda Enterprise 支持这种兼容性。

    【讨论】:

    • 根据 simon_sz 的更正删除了对 schema 的引用。
    • 这行得通。通过 gradle.properties 文件或类似文件引入用户名/密码的任何建议。运行 deployNodes 时,参数替换遇到了麻烦。 > 方法调用者中的错误:无法从以下位置创建 ConfigValue:[PASSWORD_VALUE]
    【解决方案2】:

    只是为了补充乔尔的答案: schema = [SCHEMA] 选项在 Corda Open Source 中不可用,一些驱动程序允许在 JDBC URL 字符串中设置当前模式。 对于 Corda 3.X 包含 . 的 dataSourceProperties 键应该用双引号括起来以正确覆盖默认设置(在 https://github.com/corda/corda/issues/4037 中描述),例如

    dataSourceProperties = {
        "dataSource.url" = "jdbc:postgresql://[HOST]:[PORT]/postgres"
        ...
    

    或在 deployNodes 中:

    extraConfig = [
                   'dataSourceProperties': [
                              '"dataSource.url"': 'jdbc:postgresql://localhost:5432/postgres',
                              ...  
    

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      相关资源
      最近更新 更多