如题。我需要查询数据库中的特定函数,该函数将定义分配给事务的一些值。如果可能的话,我想让它成为一个与特定配置文件相关的全局配置(很少有我不想加载该功能的请求)。
项目基于 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 类,我想避免它。
我希望这能让你更接近我的问题。
最佳答案
这可能是方面的典型用例。你试过为此写一个方面吗?方面可以配置为在调用特定包中的方法或由特定注释修饰的方法之前和之后执行一些代码。 Spring 对方面有很好的支持。
另一种方法是创建一个代理(使用 java.lang.reflect.Proxy)对象,它将调用您的初始化代码,然后委托(delegate)给代理对象。
关于java - 如何在事务打开后立即查询 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31109914/