Skip to content

Commit 3546ec2

Browse files
cache connection url parsing since it typically takes place within a lock
1 parent e39ce61 commit 3546ec2

4 files changed

Lines changed: 25 additions & 6 deletions

File tree

dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
import static datadog.trace.bootstrap.instrumentation.jdbc.DBInfo.DEFAULT;
44

5+
import datadog.trace.api.Function;
6+
import datadog.trace.api.Pair;
7+
import datadog.trace.api.cache.DDCache;
8+
import datadog.trace.api.cache.DDCaches;
59
import datadog.trace.bootstrap.ExceptionLogger;
610
import de.thetaphi.forbiddenapis.SuppressForbidden;
711
import java.io.UnsupportedEncodingException;
@@ -692,6 +696,17 @@ DBInfo.Builder doParse(final String jdbcUrl, final DBInfo.Builder builder) {
692696
}
693697
}
694698

699+
private static final DDCache<Pair<String, Properties>, DBInfo> CACHED_DB_INFO =
700+
DDCaches.newFixedSizeCache(32);
701+
private static final Function<Pair<String, Properties>, DBInfo> PARSE =
702+
new Function<Pair<String, Properties>, DBInfo>() {
703+
704+
@Override
705+
public DBInfo apply(Pair<String, Properties> input) {
706+
return parse(input.getLeft(), input.getRight());
707+
}
708+
};
709+
695710
private final String[] typeKeys;
696711

697712
JDBCConnectionUrlParser(final String... typeKeys) {
@@ -700,6 +715,10 @@ DBInfo.Builder doParse(final String jdbcUrl, final DBInfo.Builder builder) {
700715

701716
abstract DBInfo.Builder doParse(String jdbcUrl, final DBInfo.Builder builder);
702717

718+
public static DBInfo extractDBInfo(String connectionUrl, Properties props) {
719+
return CACHED_DB_INFO.computeIfAbsent(Pair.of(connectionUrl, props), PARSE);
720+
}
721+
703722
public static DBInfo parse(String connectionUrl, final Properties props) {
704723
if (connectionUrl == null) {
705724
return DEFAULT;

dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DriverInstrumentation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public static void addDBInfo(
7070
// Exception was probably thrown.
7171
return;
7272
}
73-
final DBInfo dbInfo = JDBCConnectionUrlParser.parse(url, props);
73+
final DBInfo dbInfo = JDBCConnectionUrlParser.extractDBInfo(url, props);
7474
InstrumentationContext.get(Connection.class, DBInfo.class).put(connection, dbInfo);
7575
}
7676
}

dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,10 @@ public AgentSpan onConnection(
8989
final String url = metaData.getURL();
9090
if (url != null) {
9191
try {
92-
dbInfo = JDBCConnectionUrlParser.parse(url, connection.getClientInfo());
92+
dbInfo = JDBCConnectionUrlParser.extractDBInfo(url, connection.getClientInfo());
9393
} catch (final Throwable ex) {
9494
// getClientInfo is likely not allowed.
95-
dbInfo = JDBCConnectionUrlParser.parse(url, null);
95+
dbInfo = JDBCConnectionUrlParser.extractDBInfo(url, null);
9696
}
9797
} else {
9898
dbInfo = DBInfo.DEFAULT;

dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCConnectionUrlParserTest.groovy

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import datadog.trace.agent.test.AgentTestRunner
22
import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo
33
import spock.lang.Shared
44

5-
import static datadog.trace.bootstrap.instrumentation.jdbc.JDBCConnectionUrlParser.parse
5+
import static datadog.trace.bootstrap.instrumentation.jdbc.JDBCConnectionUrlParser.extractDBInfo
66

77
class JDBCConnectionUrlParserTest extends AgentTestRunner {
88

@@ -24,7 +24,7 @@ class JDBCConnectionUrlParserTest extends AgentTestRunner {
2424

2525
def "invalid url returns default"() {
2626
expect:
27-
parse(url, null) == DBInfo.DEFAULT
27+
extractDBInfo(url, null) == DBInfo.DEFAULT
2828

2929
where:
3030
url | _
@@ -37,7 +37,7 @@ class JDBCConnectionUrlParserTest extends AgentTestRunner {
3737

3838
def "verify #type:#subtype parsing of #url"() {
3939
setup:
40-
def info = parse(url, props)
40+
def info = extractDBInfo(url, props)
4141

4242
expect:
4343
info.url == expected.url

0 commit comments

Comments
 (0)