如何扩展Corda节点以使用H2以外的数据库?

如何扩展Corda节点以使用H2以外的数据库?,corda,Corda,我用PostgreSQL运行了Corda。如何将Corda扩展到其他数据库?将数据库驱动程序添加为Gradle依赖项并尝试连接到其他数据库是否足够?Corda使用Hibernate 5.x和HikariCP JDBC连接池 所有查询都由Hibernate生成,除了来自finance模块的一个查询(CashSelection使用JDBCPreparedStatement以及特定于每个数据库供应商的SQL构造) 配置数据库 在运行时,节点在其node.conf文件中查找JDBC设置。默认情况下,它连

我用PostgreSQL运行了Corda。如何将Corda扩展到其他数据库?将数据库驱动程序添加为Gradle依赖项并尝试连接到其他数据库是否足够?

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]
其中,
datasourceproperty
是典型的JDBC设置,
database
条目包含特定于Hibernate的设置,
jarDirs
是指向包含驱动程序的目录的路径列表(例如,
jarDirs=['/Library/postgres']

在部署节点中配置数据库

通过在
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
中指定的位置

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


(*)Corda开放源码随H2文件数据库一起提供,并对Postgres和Sql Server提供了实验性支持。Corda Enterprise对其他数据库有更广泛的测试支持,包括Sql Server、AzureSQL、Postgres和Oracle数据库。尽管使用了Hibernate/JDBC,但有些查询可能需要修改才能兼容所有受支持的数据库。Corda Enterprise支持这种兼容性。

只是为了补充Joel的答案: 选项
schema=[schema]
在Corda开源中不可用,一些驱动程序允许在JDBC URL字符串中设置当前架构。 对于Corda 3.X DataSourceProperty,包含
的键应使用双引号括起来,以正确覆盖默认设置(如中所述),例如

或在部署节点中:

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

根据simon_sz的更正,删除了对模式的引用。这很有效。任何关于通过gradle.properties文件或类似文件输入用户名/密码的建议。运行deployNodes时,参数替换遇到问题。>方法调用方中的错误:无法从:[密码\u值]创建ConfigValue
extraConfig = [
               'dataSourceProperties': [
                          '"dataSource.url"': 'jdbc:postgresql://localhost:5432/postgres',
                          ...