【问题标题】:How can I query SQL just after transaction open?如何在事务打开后查询 SQL?
【发布时间】:2015-09-15 13:49:29
【问题描述】:

就像标题一样。我需要查询数据库上的特定函数,该函数将定义分配给事务的一些值。如果可能的话,我想让它成为与特定配置文件连接的全局配置(我不想加载该功能的请求很少)。

项目基于 Java SE 1.7、Spring Boot 1.1.7 构建,并与 PostgreSQL 数据库连接。

请求建立在 3 层之上,SomeClassController(Controller)、SomeClassService(Service)、SomeClassDB(Repository)。在 SomeClassDB 上,它使用 Spring 中的 JdbcTemplate 与数据库连接并执行 CRUD 操作。在任何这些操作之前,我想查询一个函数。正如我所提到的,我不想要一个可以完成这项工作的方法 - 我需要在 TransactionManager 上进行全局配置?

也许我应该将 TransactionSynchronization 与 beforeCommit 方法一起使用?但我不知道如何在全球范围内使用它。

EDIT1:我可以但我不想;):

@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
@Service
public class SessionService {

Boolean flag;

public SessionService(){
    flag=false;
}

@Value("${appVersion}") String appVersion;  
@Value("${appArtifactId}") String appArtifactId;

public void addSession(){
    if(!flag){
        jdbcTemplate.execute("SELECT add_ses('"+appArtifactId+"','"+appVersion+")");
        flag=true;
    }
}

public void deleteSession(){

    jdbcTemplate.execute("SELECT del_ses()");
    }
}

现在我可以使用@Autowired 这个类在第二层类的开始和结束时调用这两个方法。但我真的不想那样做。有人,总有一天会忘记它传播第二层 SomeClassService 类,我想避免它。

我希望这会让你更接近我的问题。

【问题讨论】:

    标签: java spring postgresql transactions spring-boot


    【解决方案1】:

    这可能是方面的典型用例。您是否尝试为此编写一个方面? Aspect 可以配置为在调用特定包中的方法或由特定注释修饰的方法之前和之后执行一些代码。 Spring 对方面的支持非常好。

    另一种方法是创建一个 proxy(使用 java.lang.reflect.Proxy)对象,该对象将调用您的初始化代码,然后委托给代理对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 2015-12-23
      相关资源
      最近更新 更多