Создание таблиц в базе данных Node, размещенной в R3 Corda - PullRequest
0 голосов
/ 10 октября 2018

Как мы можем создать новую таблицу в существующей базе данных узлов в Cordapps, которые мы пишем?

Должна ли она быть записана в файл API?

Как установить соединение с базой данных узла, а также использовать его для извлечения данных без получения строки соединения JDBC, сгенерированной в оболочке?

1 Ответ

0 голосов
/ 11 октября 2018

У вас есть два варианта:

Создание таблицы вручную:

Сначала необходимо подключиться к базе данных вашего узла.Предположим, что вы используете встроенную базу данных H2 узла и хотите подключиться к узлу через порт 10008.

В Corda 3 вы можете установить порт H2 узла в задаче Cordform:

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 используя адрес:

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.")
    }
}
...