Javers 占用了我所有可用的连接

Javers is grabbing all of my available Connections

我发现的另一件事是,Javers 似乎正在从我的连接池(通过 Spring DataSourceBuilder 创建)中获取所有可用的连接。我没有使用 Hibernate/JPA,只是通过 JdbcTemplate 直接使用 JDBC,主要是 MyBatis 用于我的实体查询。

我已经为 Javers 添加了一个日志记录语句到我的 ConnectionProvider 中,并且在应用程序开始时查询模式时,它拉出 4 个连接来检查每个表,然后从不 return即使在从 PlatformTransactionManager 提交之后,它们中的任何一个。

我从 了解到,它应该参与与当前事务相同的连接。由于我没有使用 Hibernate/JPA,这是否意味着我需要实现从 MyBatis 到 Javers ConnectionProvider 的连接 tracking/etc 到 return 相同的连接(如果有的话),然后在事务结束时处理该连接的关闭(returning 到池中)?

JaVers 不会 return 连接到应用程序的连接池,原因与它不会调用 sql 提交或回滚的原因相同。 管理连接和事务是应用程序的责任,而不是 JaVers。我们称之为 被动模式,来自 Javers 文档:

- JaVers doesn’t create JDBC connections on its own and uses connections provided by an application (via ConnectionProvider.getConnection()).
- JaVers philosophy is to use application’s transactions and never to call SQL commit or rollback commands on its own.

Thanks to this approach, data managed by an application (domain objects) and data managed by JaVers (object snapshots) can be saved to SQL database in one transaction.

JaVers项目中没有mybatis支持,需要自己实现mybatis的ConnectionProvider

正确实施 ConnectionProvider 不应为每个 getConnection() 调用创建新的 sql 连接。它应该 return 作为当前应用程序事务基础的连接。通常,它是使用 ThreadLocal 实现的。 正如您提到的,ConnectionProvider 应该处理提交事务和关闭连接。

我发现 DataSourceUtils.getConnection(DataSource) 这是一个 Spring 实用程序 class 从给定的数据源获取连接,包括它是否绑定到当前事务或不合适。在 ConnectionProvider 中使用它看起来已经完成了为现有事务保持连接的技巧。