在R3 Corda中托管的节点数据库中创建表

时间:2018-10-10 19:22:27

标签: corda

我们如何在编写的Cordapps的现有节点数据库中创建一个新表?

应该将其写入api文件吗?

如何建立与节点数据库的连接,并使用它来检索数据而又不会在外壳中生成JDBC连接字符串?

1 个答案:

答案 0 :(得分:0)

您有两个选择:

手动创建表格:

首先,您需要连接到节点的数据库。假设您正在使用该节点的内置H2数据库,并且希望通过端口10008连接到该节点。

在Corda 3中,您可以在Cordform任务中设置节点的H2端口:

task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
    directory "./build/nodes"
    ...
    node {
        name "O=MyNode,L=London,C=GB"
        ...
        h2Port 10008
    }
    ...
}

或直接在节点的node.conf文件中:

h2port=10008

如果该节点在本地运行,则可以使用最新的稳定H2 client通过以下地址连接到该节点:

jdbc:h2:tcp://localhost:10008/node

在节点启动时自动创建表:

节点可以托管服务,这些服务在节点启动时初始化,并在节点上连续运行。我们可以编写一个在启动时创建数据库表的服务,如下所示:

private val TABLE_NAME = "crypto_values"

@CordaService
class DatabaseService(private val services: ServiceHub) : SingletonSerializeAsToken() {
    companion object {
        val log = loggerFor<DatabaseService>()
    }

    /**
     * Initialises a database table on the node with name TABlE_NAME.
     */
    init {
        val query = """
            create table if not exists $TABLE_NAME(
                token varchar(64),
                value int
            )"""

        val session = services.jdbcSession()
        val preparedStatement = session.prepareStatement(query)

        try {
            preparedStatement.executeUpdate()
        } catch (e: SQLException) {
            log.error(e.message)
            throw e
        } finally {
            preparedStatement.close()
        }

        log.info("Created $TABLE_NAME table.")
    }
}