1

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

我已经为 Javers 的 ConnectionProvider 添加了一个日志记录语句,并且在应用程序开始时,当它查询架构时,它会拉取 4 个连接来检查每个表,然后即使在提交之后也不会返回任何一个来自 PlatformTransactionManager。

我从https://stackoverflow.com/a/35147884/570291了解到,它应该参与与当前事务相同的连接。由于我没有使用 Hibernate/JPA,这是否意味着我需要实现从 MyBatis 到 Javers ConnectionProvider 的连接跟踪/等以返回相同的连接(如果有),然后处理关闭(返回池)交易结束时的连接?

4

2 回答 2

2

我发现DataSourceUtils.getConnection(DataSource)是一个 Spring 实用程序类,用于从给定的 DataSource 获取连接,包括它是否与当前事务相关联。在 ConnectionProvider 中使用它看起来已经完成了为现有事务保持连接的技巧。

于 2016-03-30T22:11:20.587 回答
0

JaVers 不会将连接返回到应用程序的连接池,原因与它不会调用 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 连接。它应该返回作为当前应用程序事务基础的连接。通常,它是使用ThreadLocal. 正如您所提到的, ConnectionProvider 应该处理提交事务和关闭连接。

于 2016-03-30T22:11:19.917 回答