gpt4 book ai didi

java - 连接到 JDBC 事务的开始

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:29:26 24 4
gpt4 key购买 nike

我有一个连接到 Postgres 9.6 数据库的 Spring Boot webapp。
我使用 Spring 的 JdbcTemplate 来执行 SQL 语句。我数据库中的每个表都有用于 INSERT、CREATE 和 DELETE 语句的触发器。这些触发器将受影响的行复制到历史表中。

我希望触发器还保存进行更改的用户的应用程序用户 ID。

根据 https://stackoverflow.com/a/13172964/2591231我可以通过让应用程序在每个事务开始时将当前用户 ID 插入临时表并从临时表中读取触发器来实现我的目标。
在其他几个地方提到的类似方法正在执行:SET LOCAL application_name = "my_application_user",然后读取触发器内部的 application_name。同样,这必须在每笔交易开始时完成。

我正在寻找与业务代码正交的方式(我不希望每个 DAO 显式设置用户 ID),以 Hook 每个事务的开始以运行特定的 SQL 语句同一交易中的任何其他声明之前。

我需要它同时适用于隐式事务(JdbcTemplate 的单次调用)和使用 Spring 的 @Transactional 注释以声明方式划分的事务。

最佳答案

首先,JdbcTemplate 不提供开箱即用的事务支持(参见 here )。因此,为了拦截所有 @Transaction 注释代码 ANDJdbcTemplate 的每次调用,这可以在 DataSource 级别完成,如前所述Serge Bogatyrev.

我有一个 Spring Web 项目,我在其中测试了这种方法。我定义了一个名为 MyDataSource 的替换 DataSource @Bean,它扩展了 BasicDataSource,并覆盖了它的 getConnection() 方法,以便它创建临时表并在返回连接之前插入 user_id。

它适用于 @Transaction 调用和纯 JdbcTemplate 调用。

如果您想在每个事务开始时严格绑定(bind)此临时表更新,请执行相同的策略来定义PlatformTransactionManager @Bean。您只需要覆盖 doBegin() 方法即可。并且不要忘记用 @Transaction 注释所有调用 JdbcTemplate 的方法。

PS1:确保在创建临时表之前调用DROP TABLE IF EXISTS temp_table_name,以替换连接上的DISCARD ALL回到游泳池,如前所述here .

PS2:创建临时表的整个解决方案不太好闻。我不会自己实现。我宁愿深吸一口气,然后将 created_by 和 updated_by 列添加到我的所有表中。

关于java - 连接到 JDBC 事务的开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48112718/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com