【发布时间】:2018-10-11 16:17:14
【问题描述】:
在我们编写的 Cordapps 中,如何在现有节点数据库中创建新表?
是否应该写在api文件中?
如何建立与节点数据库的连接并使用它来检索数据而不获取 shell 中生成的 JDBC 连接字符串?
【问题讨论】:
标签: corda
在我们编写的 Cordapps 中,如何在现有节点数据库中创建新表?
是否应该写在api文件中?
如何建立与节点数据库的连接并使用它来检索数据而不获取 shell 中生成的 JDBC 连接字符串?
【问题讨论】:
标签: corda
你有两个选择:
手动创建表格:
首先,您需要连接到节点的数据库。假设您正在使用节点的内置 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.")
}
}
【讨论】: