Skip to content

Commit 17719e5

Browse files
authored
Merge pull request #1096 from eclipse-vertx/shared-pool
Pool improvements
2 parents 9527c56 + 92d0591 commit 17719e5

File tree

54 files changed

+1446
-882
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1446
-882
lines changed

vertx-db2-client/src/main/asciidoc/index.adoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ The {@link io.vertx.db2client.DB2Pool} allows you to create a pool or a pooled c
109109
- pool operations are not pipelined, only connection client are pipelined
110110
- pooled client operations are pipelined
111111

112+
== Pool sharing
113+
114+
include::pool_sharing.adoc[]
115+
112116
== Configuration
113117

114118
There are several alternatives for you to configure the client.

vertx-db2-client/src/main/java/examples/SqlClientExamples.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import java.util.Arrays;
2020
import java.util.List;
2121

22+
import io.vertx.core.AbstractVerticle;
23+
import io.vertx.core.DeploymentOptions;
2224
import io.vertx.core.Vertx;
2325
import io.vertx.core.tracing.TracingPolicy;
2426
import io.vertx.db2client.DB2ConnectOptions;
@@ -357,4 +359,38 @@ public void poolConfig02(DB2Pool pool, String sql) {
357359
});
358360
});
359361
}
362+
363+
public void poolSharing1(Vertx vertx, DB2ConnectOptions database, int maxSize) {
364+
DB2Pool pool = DB2Pool.pool(database, new PoolOptions().setMaxSize(maxSize));
365+
vertx.deployVerticle(() -> new AbstractVerticle() {
366+
@Override
367+
public void start() throws Exception {
368+
// Use the pool
369+
}
370+
}, new DeploymentOptions().setInstances(4));
371+
}
372+
373+
public void poolSharing2(Vertx vertx, DB2ConnectOptions database, int maxSize) {
374+
vertx.deployVerticle(() -> new AbstractVerticle() {
375+
DB2Pool pool;
376+
@Override
377+
public void start() {
378+
// Get or create a shared pool
379+
// this actually creates a lease to the pool
380+
// when the verticle is undeployed, the lease will be released automaticaly
381+
pool = DB2Pool.pool(database, new PoolOptions()
382+
.setMaxSize(maxSize)
383+
.setShared(true)
384+
.setName("my-pool"));
385+
}
386+
}, new DeploymentOptions().setInstances(4));
387+
}
388+
389+
public static void poolSharing3(Vertx vertx, DB2ConnectOptions database, int maxSize) {
390+
DB2Pool pool = DB2Pool.pool(database, new PoolOptions()
391+
.setMaxSize(maxSize)
392+
.setShared(true)
393+
.setName("my-pool")
394+
.setEventLoopSize(4));
395+
}
360396
}

vertx-db2-client/src/main/java/io/vertx/db2client/DB2Pool.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.vertx.core.Future;
2222
import io.vertx.core.Handler;
2323
import io.vertx.core.Vertx;
24+
import io.vertx.db2client.impl.Db2PoolOptions;
2425
import io.vertx.db2client.spi.DB2Driver;
2526
import io.vertx.sqlclient.Pool;
2627
import io.vertx.sqlclient.PoolOptions;
@@ -105,7 +106,7 @@ static DB2Pool pool(List<DB2ConnectOptions> databases, PoolOptions options) {
105106
* {@link Vertx} instance.
106107
*/
107108
static DB2Pool pool(Vertx vertx, List<DB2ConnectOptions> databases, PoolOptions options) {
108-
return new DB2Driver().createPool(vertx, databases, options);
109+
return (DB2Pool) DB2Driver.INSTANCE.createPool(vertx, databases, options);
109110
}
110111

111112
/**
@@ -174,7 +175,7 @@ static SqlClient client(List<DB2ConnectOptions> databases, PoolOptions options)
174175
* {@link Vertx} instance.
175176
*/
176177
static SqlClient client(Vertx vertx, List<DB2ConnectOptions> databases, PoolOptions options) {
177-
return new DB2Driver().createClient(vertx, databases, options);
178+
return DB2Driver.INSTANCE.createPool(vertx, databases, new Db2PoolOptions(options).setPipelined(true));
178179
}
179180

180181
@Override

vertx-db2-client/src/main/java/io/vertx/db2client/impl/DB2ConnectionImpl.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@
2424
import io.vertx.db2client.DB2ConnectOptions;
2525
import io.vertx.db2client.DB2Connection;
2626
import io.vertx.db2client.impl.command.PingCommand;
27+
import io.vertx.db2client.spi.DB2Driver;
2728
import io.vertx.sqlclient.impl.Connection;
28-
import io.vertx.sqlclient.impl.SqlConnectionImpl;
29+
import io.vertx.sqlclient.impl.SqlConnectionBase;
2930
import io.vertx.sqlclient.impl.tracing.QueryTracer;
3031
import io.vertx.sqlclient.spi.ConnectionFactory;
3132

32-
public class DB2ConnectionImpl extends SqlConnectionImpl<DB2ConnectionImpl> implements DB2Connection {
33+
public class DB2ConnectionImpl extends SqlConnectionBase<DB2ConnectionImpl> implements DB2Connection {
3334

3435
public static Future<DB2Connection> connect(Vertx vertx, DB2ConnectOptions options) {
3536
ContextInternal ctx = (ContextInternal) vertx.getOrCreateContext();
@@ -44,7 +45,7 @@ public static Future<DB2Connection> connect(Vertx vertx, DB2ConnectOptions optio
4445
}
4546

4647
public DB2ConnectionImpl(ContextInternal context, ConnectionFactory factory, Connection conn, QueryTracer tracer, ClientMetrics metrics) {
47-
super(context, factory, conn, tracer, metrics);
48+
super(context, factory, conn, DB2Driver.INSTANCE, tracer, metrics);
4849
}
4950

5051
@Override

vertx-db2-client/src/main/java/io/vertx/db2client/impl/DB2PoolImpl.java

Lines changed: 3 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -15,81 +15,15 @@
1515
*/
1616
package io.vertx.db2client.impl;
1717

18-
import io.vertx.core.Future;
19-
import io.vertx.core.Handler;
20-
import io.vertx.core.Vertx;
2118
import io.vertx.core.impl.CloseFuture;
22-
import io.vertx.core.impl.ContextInternal;
2319
import io.vertx.core.impl.VertxInternal;
24-
import io.vertx.core.spi.metrics.ClientMetrics;
25-
import io.vertx.core.spi.metrics.VertxMetrics;
26-
import io.vertx.db2client.DB2ConnectOptions;
2720
import io.vertx.db2client.DB2Pool;
28-
import io.vertx.db2client.spi.DB2Driver;
29-
import io.vertx.sqlclient.PoolOptions;
30-
import io.vertx.sqlclient.SqlConnectOptions;
31-
import io.vertx.sqlclient.SqlConnection;
32-
import io.vertx.sqlclient.impl.Connection;
21+
import io.vertx.sqlclient.Pool;
3322
import io.vertx.sqlclient.impl.PoolBase;
34-
import io.vertx.sqlclient.impl.SqlConnectionImpl;
35-
import io.vertx.sqlclient.impl.tracing.QueryTracer;
36-
import io.vertx.sqlclient.spi.ConnectionFactory;
37-
38-
import java.util.List;
39-
import java.util.function.Supplier;
40-
import java.util.stream.Collectors;
4123

4224
public class DB2PoolImpl extends PoolBase<DB2PoolImpl> implements DB2Pool {
4325

44-
public static DB2PoolImpl create(VertxInternal vertx, boolean pipelined, List<? extends SqlConnectOptions> servers, PoolOptions poolOptions) {
45-
DB2ConnectOptions baseConnectOptions = DB2ConnectOptions.wrap(servers.get(0));
46-
VertxInternal vx;
47-
if (vertx == null) {
48-
if (Vertx.currentContext() != null) {
49-
throw new IllegalStateException(
50-
"Running in a Vertx context => use DB2Pool#pool(Vertx, DB2ConnectOptions, PoolOptions) instead");
51-
}
52-
vx = (VertxInternal) Vertx.vertx();
53-
} else {
54-
vx = vertx;
55-
}
56-
QueryTracer tracer = vx.tracer() == null ? null : new QueryTracer(vx.tracer(), baseConnectOptions);
57-
VertxMetrics vertxMetrics = vx.metricsSPI();
58-
int pipeliningLimit = pipelined ? baseConnectOptions.getPipeliningLimit() : 1;
59-
ClientMetrics metrics = vertxMetrics != null ? vertxMetrics.createClientMetrics(baseConnectOptions.getSocketAddress(), "sql", baseConnectOptions.getMetricsName()) : null;
60-
DB2PoolImpl pool = new DB2PoolImpl(vx, pipeliningLimit, poolOptions, baseConnectOptions, null, tracer, metrics);
61-
pool.init();
62-
DB2Driver driver = new DB2Driver();
63-
List<ConnectionFactory> lst = servers.stream().map(options -> driver.createConnectionFactory(vx, options)).collect(Collectors.toList());
64-
ConnectionFactory factory = ConnectionFactory.roundRobinSelector(lst);
65-
pool.connectionProvider(factory::connect);
66-
CloseFuture closeFuture = pool.closeFuture();
67-
closeFuture.add(factory);
68-
if (vertx == null) {
69-
closeFuture.future().onComplete(ar -> vx.close());
70-
} else {
71-
ContextInternal ctx = vx.getContext();
72-
if (ctx != null) {
73-
ctx.addCloseHook(closeFuture);
74-
} else {
75-
vx.addCloseHook(closeFuture);
76-
}
77-
}
78-
return pool;
79-
}
80-
81-
private DB2PoolImpl(VertxInternal vertx, int pipeliningLimit, PoolOptions poolOptions, DB2ConnectOptions baseConnectOptions, Supplier<Future<SqlConnectOptions>> connectOptionsProvider, QueryTracer tracer, ClientMetrics metrics) {
82-
super(vertx, baseConnectOptions, connectOptionsProvider, tracer, metrics, pipeliningLimit, poolOptions);
83-
}
84-
85-
@SuppressWarnings("rawtypes")
86-
@Override
87-
protected SqlConnectionImpl wrap(ContextInternal context, ConnectionFactory factory, Connection conn) {
88-
return new DB2ConnectionImpl(context, factory, conn, tracer, metrics);
89-
}
90-
91-
@Override
92-
public DB2Pool connectHandler(Handler<SqlConnection> handler) {
93-
return (DB2Pool) super.connectHandler(handler);
26+
public DB2PoolImpl(VertxInternal vertx, CloseFuture closeFuture, Pool delegate) {
27+
super(vertx, closeFuture, delegate);
9428
}
9529
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright (C) 2017 Julien Viet
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*
16+
*/
17+
package io.vertx.db2client.impl;
18+
19+
import io.vertx.sqlclient.PoolOptions;
20+
21+
public class Db2PoolOptions extends PoolOptions {
22+
23+
public Db2PoolOptions(PoolOptions other) {
24+
super(other);
25+
}
26+
27+
private boolean pipelined;
28+
29+
public boolean isPipelined() {
30+
return pipelined;
31+
}
32+
33+
public Db2PoolOptions setPipelined(boolean pipelined) {
34+
this.pipelined = pipelined;
35+
return this;
36+
}
37+
}

vertx-db2-client/src/main/java/io/vertx/db2client/spi/DB2Driver.java

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,61 @@
1616
package io.vertx.db2client.spi;
1717

1818
import io.vertx.core.Vertx;
19+
import io.vertx.core.impl.CloseFuture;
20+
import io.vertx.core.impl.ContextInternal;
1921
import io.vertx.core.impl.VertxInternal;
22+
import io.vertx.core.spi.metrics.ClientMetrics;
23+
import io.vertx.core.spi.metrics.VertxMetrics;
2024
import io.vertx.db2client.DB2ConnectOptions;
2125
import io.vertx.db2client.DB2Pool;
2226
import io.vertx.db2client.impl.DB2ConnectionFactory;
27+
import io.vertx.db2client.impl.DB2ConnectionImpl;
2328
import io.vertx.db2client.impl.DB2PoolImpl;
29+
import io.vertx.db2client.impl.Db2PoolOptions;
2430
import io.vertx.sqlclient.PoolOptions;
2531
import io.vertx.sqlclient.SqlConnectOptions;
32+
import io.vertx.sqlclient.impl.Connection;
33+
import io.vertx.sqlclient.impl.PoolImpl;
34+
import io.vertx.sqlclient.impl.SqlConnectionInternal;
35+
import io.vertx.sqlclient.impl.tracing.QueryTracer;
2636
import io.vertx.sqlclient.spi.Driver;
2737
import io.vertx.sqlclient.spi.ConnectionFactory;
2838

2939
import java.util.List;
40+
import java.util.stream.Collectors;
3041

3142
public class DB2Driver implements Driver {
3243

44+
private static final String SHARED_CLIENT_KEY = "__vertx.shared.db2client";
45+
46+
public static final DB2Driver INSTANCE = new DB2Driver();
47+
3348
@Override
34-
public DB2Pool createPool(Vertx vertx, List<? extends SqlConnectOptions> databases, PoolOptions options) {
35-
return DB2PoolImpl.create((VertxInternal) vertx, false, databases, options);
49+
public DB2Pool newPool(Vertx vertx, List<? extends SqlConnectOptions> databases, PoolOptions options, CloseFuture closeFuture) {
50+
VertxInternal vx = (VertxInternal) vertx;
51+
PoolImpl pool;
52+
if (options.isShared()) {
53+
pool = vx.createSharedClient(SHARED_CLIENT_KEY, options.getName(), closeFuture, cf -> newPoolImpl(vx, databases, options, cf));
54+
} else {
55+
pool = newPoolImpl(vx, databases, options, closeFuture);
56+
}
57+
return new DB2PoolImpl(vx, closeFuture, pool);
3658
}
3759

38-
public DB2Pool createClient(Vertx vertx, List<? extends SqlConnectOptions> servers, PoolOptions options) {
39-
return DB2PoolImpl.create((VertxInternal) vertx, true, servers, options);
60+
private PoolImpl newPoolImpl(VertxInternal vertx, List<? extends SqlConnectOptions> databases, PoolOptions options, CloseFuture closeFuture) {
61+
DB2ConnectOptions baseConnectOptions = DB2ConnectOptions.wrap(databases.get(0));
62+
QueryTracer tracer = vertx.tracer() == null ? null : new QueryTracer(vertx.tracer(), baseConnectOptions);
63+
VertxMetrics vertxMetrics = vertx.metricsSPI();
64+
ClientMetrics metrics = vertxMetrics != null ? vertxMetrics.createClientMetrics(baseConnectOptions.getSocketAddress(), "sql", baseConnectOptions.getMetricsName()) : null;
65+
boolean pipelinedPool = options instanceof Db2PoolOptions && ((Db2PoolOptions) options).isPipelined();
66+
int pipeliningLimit = pipelinedPool ? baseConnectOptions.getPipeliningLimit() : 1;
67+
PoolImpl pool = new PoolImpl(vertx, this, baseConnectOptions, null, tracer, metrics, pipeliningLimit, options, closeFuture);
68+
List<ConnectionFactory> lst = databases.stream().map(o -> createConnectionFactory(vertx, o)).collect(Collectors.toList());
69+
ConnectionFactory factory = ConnectionFactory.roundRobinSelector(lst);
70+
pool.connectionProvider(factory::connect);
71+
pool.init();
72+
closeFuture.add(factory);
73+
return pool;
4074
}
4175

4276
@Override
@@ -48,4 +82,9 @@ public boolean acceptsOptions(SqlConnectOptions options) {
4882
public ConnectionFactory createConnectionFactory(Vertx vertx, SqlConnectOptions database) {
4983
return new DB2ConnectionFactory((VertxInternal) vertx, DB2ConnectOptions.wrap(database));
5084
}
85+
86+
@Override
87+
public SqlConnectionInternal wrapConnection(ContextInternal context, ConnectionFactory factory, Connection conn, QueryTracer tracer, ClientMetrics metrics) {
88+
return new DB2ConnectionImpl(context, factory, conn, tracer, metrics);
89+
}
5190
}

vertx-mssql-client/src/main/asciidoc/index.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,11 @@ For example, {@link io.vertx.core.net.PemTrustOptions} can be used if a PEM file
279279

280280
For further details about SSL support in Vert.x, please refer to the https://vertx.io/docs/vertx-core/java/#ssl[Vert.x Core documentation].
281281

282+
== Pool sharing
283+
284+
include::pool_sharing.adoc[]
285+
282286
== Advanced pool configuration
283287

284288
include::pool_config.adoc[]
289+

vertx-mssql-client/src/main/java/examples/SqlClientExamples.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
package examples;
1818

19+
import io.vertx.core.AbstractVerticle;
20+
import io.vertx.core.DeploymentOptions;
1921
import io.vertx.core.Vertx;
2022
import io.vertx.core.tracing.TracingPolicy;
2123
import io.vertx.docgen.Source;
@@ -356,4 +358,38 @@ public void poolConfig02(MSSQLPool pool, String sql) {
356358
});
357359
});
358360
}
361+
362+
public void poolSharing1(Vertx vertx, MSSQLConnectOptions database, int maxSize) {
363+
MSSQLPool pool = MSSQLPool.pool(database, new PoolOptions().setMaxSize(maxSize));
364+
vertx.deployVerticle(() -> new AbstractVerticle() {
365+
@Override
366+
public void start() throws Exception {
367+
// Use the pool
368+
}
369+
}, new DeploymentOptions().setInstances(4));
370+
}
371+
372+
public void poolSharing2(Vertx vertx, MSSQLConnectOptions database, int maxSize) {
373+
vertx.deployVerticle(() -> new AbstractVerticle() {
374+
MSSQLPool pool;
375+
@Override
376+
public void start() {
377+
// Get or create a shared pool
378+
// this actually creates a lease to the pool
379+
// when the verticle is undeployed, the lease will be released automaticaly
380+
pool = MSSQLPool.pool(database, new PoolOptions()
381+
.setMaxSize(maxSize)
382+
.setShared(true)
383+
.setName("my-pool"));
384+
}
385+
}, new DeploymentOptions().setInstances(4));
386+
}
387+
388+
public static void poolSharing3(Vertx vertx, MSSQLConnectOptions database, int maxSize) {
389+
MSSQLPool pool = MSSQLPool.pool(database, new PoolOptions()
390+
.setMaxSize(maxSize)
391+
.setShared(true)
392+
.setName("my-pool")
393+
.setEventLoopSize(4));
394+
}
359395
}

vertx-mssql-client/src/main/java/io/vertx/mssqlclient/MSSQLPool.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ static MSSQLPool pool(List<MSSQLConnectOptions> databases, PoolOptions options)
9494
* Like {@link #pool(List, PoolOptions)} with a specific {@link Vertx} instance.
9595
*/
9696
static MSSQLPool pool(Vertx vertx, List<MSSQLConnectOptions> databases, PoolOptions options) {
97-
return new MSSQLDriver().createPool(vertx, databases, options);
97+
return (MSSQLPool) MSSQLDriver.INSTANCE.createPool(vertx, databases, options);
9898
}
9999

100100
@Override

0 commit comments

Comments
 (0)