我想存储分类帐数据并仅从一个节点查询 我已经检查过this。为了将数据存储在表中,我遵循flow cookbook of Corda中给出的创建交易生成器的常规协议,但是却记录了交易。
可以使用FinalityFlow来记录交易,还是必须使用Service Hub中的recordTransactions函数来记录交易?
记录未分类账数据的首选方式是什么?
预先感谢
答案 0 :(得分:1)
您应该通过直接在流中写入节点数据库来记录分类帐数据。
Flow DB示例here是执行此操作的CorDapp的示例。它创建一个DatabaseService
,该节点驻留在节点上,并读取和写入节点的数据库:
@CordaService
open class DatabaseService(private val services: ServiceHub) : SingletonSerializeAsToken() {
companion object {
val log = loggerFor<DatabaseService>()
}
/**
* Executes a database update.
*
* @param query The query string with blanks for the parameters.
* @param params The parameters to fill the blanks in the query string.
*/
protected fun executeUpdate(query: String, params: Map<Int, Any>) {
val preparedStatement = prepareStatement(query, params)
try {
preparedStatement.executeUpdate()
} catch (e: SQLException) {
log.error(e.message)
throw e
} finally {
preparedStatement.close()
}
}
/**
* Executes a database query.
*
* @param query The query string with blanks for the parameters.
* @param params The parameters to fill the blanks in the query string.
* @param transformer A function for processing the query's ResultSet.
*
* @return The list of transformed query results.
*/
protected fun <T : Any> executeQuery(
query: String,
params: Map<Int, Any>,
transformer: (ResultSet) -> T
): List<T> {
val preparedStatement = prepareStatement(query, params)
val results = mutableListOf<T>()
return try {
val resultSet = preparedStatement.executeQuery()
while (resultSet.next()) {
results.add(transformer(resultSet))
}
results
} catch (e: SQLException) {
log.error(e.message)
throw e
} finally {
preparedStatement.close()
}
}
/**
* Creates a PreparedStatement - a precompiled SQL statement to be
* executed against the database.
*
* @param query The query string with blanks for the parameters.
* @param params The parameters to fill the blanks in the query string.
*
* @return The query string and params compiled into a PreparedStatement
*/
private fun prepareStatement(query: String, params: Map<Int, Any>): PreparedStatement {
val session = services.jdbcSession()
val preparedStatement = session.prepareStatement(query)
params.forEach { (key, value) ->
when (value) {
is String -> preparedStatement.setString(key, value)
is Int -> preparedStatement.setInt(key, value)
is Long -> preparedStatement.setLong(key, value)
else -> throw IllegalArgumentException("Unsupported type.")
}
}
return preparedStatement
}
}
答案 1 :(得分:0)