Skip to content

Commit 46ddc56

Browse files
abhishekchandamp911de
authored andcommitted
Isolate prepared statement caching.
Use PreparedStatement cache per connection and no longer a single cache held at the ConnectionFactory level to avoid mixing prepared statement id's across connections. [#303][resolves #273][resolves #276][resolves #289] Signed-off-by: Abhishek Chanda <[email protected]>
1 parent 4211478 commit 46ddc56

2 files changed

Lines changed: 9 additions & 7 deletions

File tree

src/main/java/io/r2dbc/mssql/MssqlConnectionConfiguration.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.r2dbc.mssql.client.ssl.ExpectedHostnameX509TrustManager;
2525
import io.r2dbc.mssql.client.ssl.SslConfiguration;
2626
import io.r2dbc.mssql.client.ssl.TrustAllTrustManager;
27+
import io.r2dbc.mssql.codec.Codecs;
2728
import io.r2dbc.mssql.codec.DefaultCodecs;
2829
import io.r2dbc.mssql.message.tds.Redirect;
2930
import io.r2dbc.mssql.util.Assert;
@@ -199,8 +200,8 @@ ClientConfiguration toClientConfiguration() {
199200
);
200201
}
201202

202-
ConnectionOptions toConnectionOptions() {
203-
return new ConnectionOptions(this.preferCursoredExecution, new DefaultCodecs(), new IndefinitePreparedStatementCache(), this.sendStringParametersAsUnicode);
203+
ConnectionOptions toConnectionOptions(Codecs codecs) {
204+
return new ConnectionOptions(this.preferCursoredExecution, codecs, new IndefinitePreparedStatementCache(), this.sendStringParametersAsUnicode);
204205
}
205206

206207
@Override

src/main/java/io/r2dbc/mssql/MssqlConnectionFactory.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.r2dbc.mssql.client.Client;
2020
import io.r2dbc.mssql.client.ClientConfiguration;
2121
import io.r2dbc.mssql.client.ReactorNettyClient;
22+
import io.r2dbc.mssql.codec.DefaultCodecs;
2223
import io.r2dbc.mssql.message.tds.Redirect;
2324
import io.r2dbc.mssql.util.Assert;
2425
import io.r2dbc.spi.ConnectionFactory;
@@ -44,7 +45,7 @@ public final class MssqlConnectionFactory implements ConnectionFactory {
4445

4546
private final MssqlConnectionConfiguration configuration;
4647

47-
private final ConnectionOptions connectionOptions;
48+
private final DefaultCodecs codecs = new DefaultCodecs();
4849

4950
/**
5051
* Creates a new connection factory.
@@ -61,7 +62,6 @@ public MssqlConnectionFactory(MssqlConnectionConfiguration configuration) {
6162

6263
this.clientFactory = Assert.requireNonNull(clientFactory, "clientFactory must not be null");
6364
this.configuration = Assert.requireNonNull(configuration, "configuration must not be null");
64-
this.connectionOptions = configuration.toConnectionOptions();
6565
}
6666

6767
private static Mono<Client> connect(MssqlConnectionConfiguration configuration) {
@@ -113,10 +113,11 @@ public Mono<MssqlConnection> create() {
113113
return initializeClient(this.configuration, true)
114114
.flatMap(it -> {
115115

116+
ConnectionOptions connectionOptions = this.configuration.toConnectionOptions(this.codecs);
116117
Mono<MssqlConnection> connectionMono =
117-
new SimpleMssqlStatement(it, this.connectionOptions, this.METADATA_QUERY).execute()
118+
new SimpleMssqlStatement(it, connectionOptions, this.METADATA_QUERY).execute()
118119
.flatMap(result -> result.map((row, rowMetadata) -> toConnectionMetadata(it.getDatabaseVersion().orElse("unknown"), row))).map(metadata -> {
119-
return new MssqlConnection(it, metadata, this.connectionOptions);
120+
return new MssqlConnection(it, metadata, connectionOptions);
120121
}).last();
121122

122123
if (this.configuration.getLockWaitTimeout() != null) {
@@ -142,7 +143,7 @@ ClientConfiguration getClientConfiguration() {
142143
}
143144

144145
ConnectionOptions getConnectionOptions() {
145-
return this.connectionOptions;
146+
return this.configuration.toConnectionOptions(this.codecs);
146147
}
147148

148149
@Override

0 commit comments

Comments
 (0)