spring-data-jpa - 如何在不使用 Tomcat JDBC 的情况下为基于 Hikari 的项目设置 AWS X-Ray SQL Instrumentation?
问题描述
AWS X-Ray的AWS 文档目前没有为不使用 Tomcat JDBC 的 Java 项目提供任何解决方案。
为了使用 来检测数据库查询spring-boot-data-jpa
,您还需要包含 Tomcat JDBC 作为依赖项,并设置一个 Tomcat DataSource 对象以及您的 Hikari 对象,并通过以下任一方式将 XRay 拦截器作为 JDBC 拦截器包括在内:
- 使用以下命令将其添加到您的配置中:
dataSource.setJdbcInterceptors("com.amazonaws.xray.sql.postgres.TracingInterceptor;");
- 作为财产:
spring.datasource.jdbc-interceptors=com.amazonaws.xray.sql.postgres.TracingInterceptor
摇篮:
dependencies {
...
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation "com.amazonaws:aws-java-sdk-core"
implementation "com.amazonaws:aws-xray-recorder-sdk-core" // Required for core xray features
implementation "com.amazonaws:aws-xray-recorder-sdk-spring" // Required for spring annotations
implementation "com.amazonaws:aws-xray-recorder-sdk-sql-postgres" // required for db callouts
implementation 'org.apache.tomcat:tomcat-jdbc:9.0.31'
...
}
数据库配置(春季):
@Bean(name = "dataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
final org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource();
dataSource.setUsername(getUsername());
dataSource.setPassword(getPassword());
dataSource.setUrl(POSTGRES_URL_PREFIX
+ getHost()
+ ":" + getPort()
+ "/" + getName()
+ "?stringtype=unspecified");
dataSource.setDriverClassName(getDriver());
dataSource.setJdbcInterceptors("com.amazonaws.xray.sql.postgres.TracingInterceptor;");
final HikariDataSource hikariDataSource = new HikariDataSource();
hikariDataSource.setDataSource(dataSource);
return hikariDataSource;
}
我觉得这很笨拙,如果可能的话,我宁愿不必将 Tomcat JDBC 作为附加依赖项。
不使用Tomcat就没有办法解决这个问题吗?
其他注意事项:
春季启动 2.1.7
摇篮 6.0.1
适用于 Java 2.4.0 的 AWS 开发工具包
解决方案
原来有人有这个问题。AWS 开发人员一直在一个功能分支中进行此工作,该功能分支已于 2019 年 11 月合并为 SDK 版本2.3.0
。
我还没有找到任何关于这个新特性的文档,所以在深入研究了 PR 代码之后,我发现它比以前的实现还要简单。
只需将以下依赖项而不是 postgres 特定的依赖项添加到您的build.gradle
文件(或类似文件):
implementation "com.amazonaws:aws-java-sdk-core:2.4.0"
implementation "com.amazonaws:aws-xray-recorder-sdk-core:2.4.0"
implementation "com.amazonaws:aws-xray-recorder-sdk-sql:2.4.0"
然后只需在您的 DataSource 配置中创建一个TracingDataSource
对象,并将您的原始javax.sql.DataSource
对象传递给它。这应该在@Configuration
您用来创建DataSource
bean 的任何带注释的类中完成。
@Bean(name = "dataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
final DataSource dataSource = DataSourceBuilder
.create()
.username(getUsername())
.password(getPassword())
.url(POSTGRES_URL_PREFIX
+ getHost()
+ ":" + getPort()
+ "/" + getName()
+ "?stringtype=unspecified")
.driverClassName(getDriver())
.build();
final TracingDataSource tracingDataSource = new TracingDataSource(dataSource);
return tracingDataSource;
}
这里的所有都是它的。我真的希望这对某人有所帮助,因为我花了很多时间试图在没有 Tomcat 的情况下让它工作,而且 AWS 文档在这里也没有帮助。
推荐阅读
- python - xlwings 使用对 pywin32 的 api 参考设置对齐方式
- r - 如何向 Plotly 子图添加第二个 x 轴
- javascript - phantomjs:document.querySelectorAll() 不适用于动态页面
- postman - 404 在邮递员中找不到方法
- python-3.x - 相邻文件的导入在 Python/ROS 中不起作用
- amazon-web-services - 如何查明没有电子邮件地址的用户是否尝试重设密码
- sql - 如何将条件应用于 T-SQL 中的分组查询?
- javascript - 在javascript中对字符串数组和子数组求和而不连接它们
- android - 应用程序不断停止,logcat 错误无法理解
- reactjs - 用玩笑反应应用程序测试 - 获取组件并应用 toHaveStyleRule