Skip to content

Commit 0d9aa37

Browse files
authored
Clear virtual fields from jdbc statement when the statement is closed (#13767)
1 parent 9f13b04 commit 0d9aa37

File tree

3 files changed

+24
-0
lines changed

3 files changed

+24
-0
lines changed

instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/StatementInstrumentation.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ public void transform(TypeTransformer transformer) {
5555
transformer.applyAdviceToMethod(
5656
namedOneOf("executeBatch", "executeLargeBatch").and(takesNoArguments()).and(isPublic()),
5757
StatementInstrumentation.class.getName() + "$ExecuteBatchAdvice");
58+
transformer.applyAdviceToMethod(
59+
named("close").and(isPublic()).and(takesNoArguments()),
60+
StatementInstrumentation.class.getName() + "$CloseAdvice");
5861
}
5962

6063
@SuppressWarnings("unused")
@@ -195,4 +198,13 @@ public static void stopSpan(
195198
}
196199
}
197200
}
201+
202+
@SuppressWarnings("unused")
203+
public static class CloseAdvice {
204+
205+
@Advice.OnMethodEnter(suppress = Throwable.class)
206+
public static void closeStatement(@Advice.This Statement statement) {
207+
JdbcData.close(statement);
208+
}
209+
}
198210
}

instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcData.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,17 @@ public static Long getPreparedStatementBatchSize(PreparedStatement statement) {
9595
return batchInfo != null ? batchInfo.getBatchSize() : null;
9696
}
9797

98+
public static void close(Statement statement) {
99+
// when statement is closed remove all of our virtual fields in case the JDBC driver reuses the
100+
// same statement instance for a subsequent query
101+
statementBatch.set(statement, null);
102+
if (statement instanceof PreparedStatement) {
103+
PreparedStatement prepared = (PreparedStatement) statement;
104+
preparedStatement.set(prepared, null);
105+
preparedStatementBatch.set(prepared, null);
106+
}
107+
}
108+
98109
/**
99110
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
100111
* any time.

instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/OpenTelemetryStatement.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ public int[] executeBatch() throws SQLException {
116116

117117
@Override
118118
public void close() throws SQLException {
119+
JdbcData.close(this);
119120
delegate.close();
120121
}
121122

0 commit comments

Comments
 (0)