我发现的另一件事是,似乎Javers正在从我的连接池中获取所有可用的连接(通过Spring DataSourceBuilder创建)。我没有使用Hibernate / JPA,只是通过JdbcTemplate直接使用JDBC,而且主要使用MyBatis进行实体查询。
我已经为Javers的ConnectionProvider添加了一个日志语句,并且在应用程序启动时查询模式时,它会提取4个连接来检查每个表,然后再也不返回任何表。它们甚至在从PlatformTransactionManager提交之后。
我从https://stackoverflow.com/a/35147884/570291了解到它应该参与与当前交易相同的连接。由于我没有使用Hibernate / JPA,这是否意味着我需要实现从MyBatis到Javers ConnectionProvider的连接跟踪/等以返回相同的连接(如果有的话),然后处理关闭(返回到在交易结束时该连接的哪个池?
答案 0 :(得分:1)
我发现DataSourceUtils.getConnection(DataSource)是一个Spring实用程序类,用于从给定的DataSource获取连接,包括它是否与当前事务相关联。在ConnectionProvider中使用它看起来就像保持现有事务的连接一样。
答案 1 :(得分:0)
JaVers不会返回与应用程序连接池的连接,原因与它不会调用sql commit或rollback相同。 管理连接和事务是应用程序的责任,而不是JaVers。我们称之为被动模式,来自Javers doc:
- 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应该处理提交事务和关闭连接。