【发布时间】:2019-10-09 08:07:17
【问题描述】:
我想要做的是在任何 DQL ("SELECT ...") 或 DML (INSERT/UPDATE/DELETE ...) 之后收集数据库统计值为当前会话执行。
目前,我利用 Spring AOP 来实现这一点,如下所示:
@Aspect
@Component
public class StatisticalValueCollector {
@After("execution(* org.springframework.jdbc.core..*JdbcOperations.*(String, ..))")
public void collectStatisTicalValues(JoinPoint jp) {
//Collect DB statistical values
}
}
它对JdbcTemplate 和NamedParameterJdbcTemplate 都非常有效,由@Autowired 注释,但是当我自己创建它们的实例ㄋ时,它不起作用。
工作示例:
@Autowired
JdbcTemplate jdbcTemplate;
...
List<Map<String, Object>> result = jdbcTemplate.queryForList("SELECT ...");
无效示例:
DriverManagerDatasource ds = new DriverManagerDatasource();
...
JdbcTemplate jdbcTemplate = new JdbcTemplate (ds);
List<Map<String, Object>> result = jdbcTemplate.queryForList("SELECT ...");
据我所知,如果JdbcTemplate是由Spring创建的,则可以根据这篇文章-AOP: Able to Intercept JDBCTemplate calls but not NamedParameterJdbcTemplate calls
进行代理。
因此,我的问题是“如何拦截自己创建的JdbcTemplate或NamedParameterJdbcTemplate?”;
任何意见和建议将不胜感激。谢谢!
更新
我还调查了 p6spy 和 datasource-proxy 等不同的方法,似乎唯一的解决方案是使用纯 AspectJ 或其他方法?
【问题讨论】:
-
你好。你问了一个问题,我回答了。所以请检查我的答案,如果你认为它是正确的,请接受+upvote(我当然这样做)。
标签: java spring spring-boot aop jdbctemplate