AppServiceHub中的方法jdbcSession()每次被调用时都会创建一个新的会话吗?

时间:2019-01-02 09:56:55

标签: corda

我们的代码使用定制的CordaService来维护数据库表中的状态。要查询/更新表,该服务使用通过调用AppServiceHub.jdbcSession()获得的JDBC Connection对象。

从文档中还不清楚此调用是否创建了新的(未使用)JDBC Connection对象,或者是否向所有调用者返回了相同的Connection。由于我们的Corda服务将方法公开给同时执行的流程,因此很重要。

documentation  指出该方法

  

使用当前配置的数据库公开JDBC连接(会话)对象。

那个方法

  

返回新的连接

第二个语句建议我们应该在每次调用时获得一个新的Connection,但实际上并发调用似乎返回相同的Connection对象。

有人可以澄清此方法的预期行为和实际行为吗?

1 个答案:

答案 0 :(得分:0)

第二个语句不正确。 jdbcSession方法并不总是返回新的连接对象。参见https://github.com/corda/corda/issues/4498(现已修复)。

相反:

  • 节点在启动时创建一个连接池
    • 如果这些连接之一断开,则节点将新连接添加到池中
  • 当流从检查点开始/从检查点恢复时,节点为该流提供来自该池的连接
    • 可能但不能保证,流将在多个挂起/恢复中流向同一连接
  • 流暂停/结束时,节点将流的连接返回到池中