Skip to content

Commit 1f12772

Browse files
committed
#37 - Add pool size() method as fast simple way to get the current size of the pool (vs getStatus())
1 parent 2673481 commit 1f12772

6 files changed

Lines changed: 50 additions & 2 deletions

File tree

src/main/java/io/ebean/datasource/DataSourcePool.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ public interface DataSourcePool extends DataSource {
1313
*/
1414
String getName();
1515

16+
/**
17+
* Return the current size of the pool. This includes both busy and idle connections.
18+
*/
19+
int size();
20+
1621
/**
1722
* Return true if the pool defaults to using autocommit.
1823
*/

src/main/java/io/ebean/datasource/pool/ConnectionPool.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.Timer;
2727
import java.util.TimerTask;
2828
import java.util.concurrent.atomic.AtomicBoolean;
29+
import java.util.concurrent.atomic.AtomicInteger;
2930

3031
/**
3132
* A robust DataSource implementation.
@@ -46,6 +47,8 @@ public class ConnectionPool implements DataSourcePool {
4647
*/
4748
private final String name;
4849

50+
private final AtomicInteger size = new AtomicInteger(0);
51+
4952
private final DataSourceConfig config;
5053

5154
/**
@@ -351,6 +354,25 @@ public String getName() {
351354
return name;
352355
}
353356

357+
@Override
358+
public int size() {
359+
return size.get();
360+
}
361+
362+
/**
363+
* Increment the current pool size.
364+
*/
365+
public void inc() {
366+
size.incrementAndGet();
367+
}
368+
369+
/**
370+
* Decrement the current pool size.
371+
*/
372+
public void dec() {
373+
size.decrementAndGet();
374+
}
375+
354376
/**
355377
* Return the max size of stack traces used when trying to find connection pool leaks.
356378
* <p>

src/main/java/io/ebean/datasource/pool/PooledConnection.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ public PooledConnection(ConnectionPool pool, int uniqueId, Connection connection
169169
this.maxStackTrace = pool.getMaxStackTraceSize();
170170
this.creationTime = System.currentTimeMillis();
171171
this.lastUseTime = creationTime;
172+
pool.inc();
172173
}
173174

174175
/**
@@ -273,6 +274,7 @@ void closeConnectionFully(boolean logErrors) {
273274
}
274275
try {
275276
connection.close();
277+
pool.dec();
276278
} catch (SQLException ex) {
277279
if (logErrors || logger.isDebugEnabled()) {
278280
logger.error("Error when fully closing connection [" + getFullDescription() + "]", ex);

src/test/java/io/ebean/datasource/pool/ConnectionPoolOfflineTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,20 @@ public void testOffline() throws InterruptedException, SQLException {
3838

3939
ConnectionPool pool = new ConnectionPool("testOffline", config);
4040
assertThat(pool.isOnline()).isFalse();
41+
assertThat(pool.size()).isEqualTo(0);
4142
log.info("pool created ");
4243
Thread.sleep(3000);
4344

4445
assertEquals(0, pool.getStatus(false).getFree());
4546
assertEquals(0, pool.getStatus(false).getBusy());
47+
assertThat(pool.size()).isEqualTo(0);
4648

4749
pool.online();
4850
log.info("pool online");
4951
assertThat(pool.isOnline()).isTrue();
5052
assertEquals(2, pool.getStatus(false).getFree());
5153
assertEquals(0, pool.getStatus(false).getBusy());
54+
assertThat(pool.size()).isEqualTo(2);
5255

5356
Thread.sleep(3000);
5457

@@ -57,6 +60,7 @@ public void testOffline() throws InterruptedException, SQLException {
5760
assertThat(pool.isOnline()).isFalse();
5861
assertEquals(0, pool.getStatus(false).getFree());
5962
assertEquals(0, pool.getStatus(false).getBusy());
63+
assertThat(pool.size()).isEqualTo(0);
6064

6165
Thread.sleep(3000);
6266

@@ -65,13 +69,15 @@ public void testOffline() throws InterruptedException, SQLException {
6569
assertThat(pool.isOnline()).isTrue();
6670
assertEquals(2, pool.getStatus(false).getFree());
6771
assertEquals(0, pool.getStatus(false).getBusy());
72+
assertThat(pool.size()).isEqualTo(2);
6873
Thread.sleep(3000);
6974

7075
pool.shutdown();
7176

7277
assertThat(pool.isOnline()).isFalse();
7378
assertEquals(0, pool.getStatus(false).getFree());
7479
assertEquals(0, pool.getStatus(false).getBusy());
80+
assertThat(pool.size()).isEqualTo(0);
7581
}
7682

7783
@Test
@@ -119,17 +125,20 @@ public void offline_whenBusy_allowed() throws SQLException, InterruptedException
119125
Thread.sleep(200);
120126
System.out.println("-- taking pool offline (with a busy connection)");
121127
assertEquals(1, pool.getStatus(false).getBusy());
128+
assertThat(pool.size()).isEqualTo(2);
122129

123130
pool.offline();
124131
assertEquals(0, pool.getStatus(false).getFree());
125132
assertEquals(1, pool.getStatus(false).getBusy()); // still 1 busy connection
133+
assertThat(pool.size()).isEqualTo(1);
126134

127135
// a bit of time to let busy connection finish and close
128136
Thread.sleep(4000);
129137

130138
// all done now
131139
assertEquals(0, pool.getStatus(false).getFree());
132140
assertEquals(0, pool.getStatus(false).getBusy());
141+
assertThat(pool.size()).isEqualTo(0);
133142
}
134143

135144
@Test

src/test/java/io/ebean/datasource/pool/ConnectionPoolTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,22 +44,27 @@ public void getConnection_expect_poolGrowsAboveMin() throws SQLException {
4444

4545
assertThat(pool.getStatus(false).getBusy()).isEqualTo(2);
4646
assertThat(pool.getStatus(false).getFree()).isEqualTo(0);
47+
assertThat(pool.size()).isEqualTo(2);
4748

4849
Connection con3 = pool.getConnection();
4950
assertThat(pool.getStatus(false).getBusy()).isEqualTo(3);
5051
assertThat(pool.getStatus(false).getFree()).isEqualTo(0);
52+
assertThat(pool.size()).isEqualTo(3);
5153

5254
con2.close();
5355
assertThat(pool.getStatus(false).getBusy()).isEqualTo(2);
5456
assertThat(pool.getStatus(false).getFree()).isEqualTo(1);
57+
assertThat(pool.size()).isEqualTo(3);
5558

5659
con3.close();
5760
assertThat(pool.getStatus(false).getBusy()).isEqualTo(1);
5861
assertThat(pool.getStatus(false).getFree()).isEqualTo(2);
62+
assertThat(pool.size()).isEqualTo(3);
5963

6064
con1.close();
6165
assertThat(pool.getStatus(false).getBusy()).isEqualTo(0);
6266
assertThat(pool.getStatus(false).getFree()).isEqualTo(3);
67+
assertThat(pool.size()).isEqualTo(3);
6368
}
6469

6570
@Test

src/test/java/io/ebean/datasource/pool/ConnectionPoolTrimIdleTest.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,25 @@ private ConnectionPool createPool() {
3232
public void test() throws SQLException, InterruptedException {
3333

3434
ConnectionPool pool = createPool();
35+
assertThat(pool.size()).isEqualTo(1);
3536
try {
3637
Connection con1 = pool.getConnection();
3738
Connection con2 = pool.getConnection();
3839
Connection con3 = pool.getConnection();
3940
Connection con4 = pool.getConnection();
41+
assertThat(pool.size()).isEqualTo(4);
4042

4143
con1.close();
4244
con2.close();
4345
con3.close();
4446
con4.close();
45-
47+
assertThat(pool.size()).isEqualTo(4);
4648
assertThat(pool.getStatus(false).getFree()).isEqualTo(4);
4749

4850
Thread.sleep(5000);
4951

5052
assertThat(pool.getStatus(false).getFree()).isEqualTo(1);
53+
assertThat(pool.size()).isEqualTo(1);
5154

5255
} finally {
5356
pool.shutdown();
@@ -70,6 +73,7 @@ public void test_withDecreasingActivity_expect_trimToActivityLevel() throws SQLE
7073

7174
// start at 10 connections
7275
assertThat(pool.getStatus(false).getFree()).isEqualTo(10);
76+
assertThat(pool.size()).isEqualTo(10);
7377

7478
// keep 4 connections busy
7579
Timer timer0 = createTimer(pool, 4);
@@ -88,6 +92,7 @@ public void test_withDecreasingActivity_expect_trimToActivityLevel() throws SQLE
8892
// Go Idle
8993
Thread.sleep(5000);
9094
assertThat(pool.getStatus(false).getFree()).isEqualTo(1);
95+
assertThat(pool.size()).isEqualTo(1);
9196

9297
} finally {
9398
pool.shutdown();
@@ -100,7 +105,7 @@ private Timer createTimer(ConnectionPool pool, int count) {
100105
return timer;
101106
}
102107

103-
class Task extends TimerTask {
108+
static class Task extends TimerTask {
104109

105110
final ConnectionPool pool;
106111

0 commit comments

Comments
 (0)