@Override public int getLoginTimeout() throws SQLException { return (int) ceil(getMaxConnectionWaitMillis() / 1000.0); }
@Override public Connection getConnection() throws SQLException { long start = System.nanoTime(); try { acquirePermit(); boolean checkedOut = false; try { Connection connection = createConnection(); checkedOut = true; return connection; } finally { if (!checkedOut) { semaphore.release(); } } } finally { stats.connectionCheckedOut(nanosSince(start)); } }
@Override protected void connectionReturned(PooledConnection pooledConnection, long checkoutTime) { // if this pool has been disposed, or if we have too many connections already if (disposed.get() || getConnectionsActive() + pool.size() > getMaxConnections()) { // close this connection super.connectionReturned(pooledConnection, checkoutTime); } else { // otherwise add it to the pool pool.addLast(pooledConnection); } }
protected Connection createConnection() throws SQLException { boolean success = false; try { // todo do not create on caller's thread long start = System.nanoTime(); PooledConnection pooledConnection = createConnectionInternal(); Connection connection = prepareConnection(pooledConnection); stats.connectionCreated(nanosSince(start)); success = true; return connection; } finally { if (!success) { stats.creationErrorOccurred(); } } }
assertEquals(dataSource.getMaxConnectionWaitMillis(), 10); Connection connection = dataSource.getConnection(); assertEquals(dataSource.getConnectionsActive(), 1); dataSource.getConnection(); fail("Expected SQLException from timeout"); assertEquals(dataSource.getConnectionsActive(), 1); dataSource.setMaxConnectionWaitMillis(new Duration(50, MILLISECONDS)); assertEquals(dataSource.getMaxConnectionWaitMillis(), 50); start = System.nanoTime(); try { dataSource.getConnection(); fail("Expected SQLException from timeout"); assertEquals(dataSource.getConnectionsActive(), 1); dataSource.setMaxConnectionWaitMillis(null); fail("NullPointerException IllegalArgumentException"); assertEquals(dataSource.getMaxConnectionWaitMillis(), 50); dataSource.setMaxConnectionWaitMillis(new Duration(0, MILLISECONDS)); fail("Expected IllegalArgumentException"); assertEquals(dataSource.getMaxConnectionWaitMillis(), 50);
assertEquals(dataSource.getMaxConnections(), 1); connections.add(dataSource.getConnection()); assertEquals(dataSource.getConnectionsActive(), 1); dataSource.getConnection(); fail("Expected SQLException from timeout"); assertEquals(dataSource.getConnectionsActive(), 1); dataSource.setMaxConnections(3); assertEquals(dataSource.getMaxConnections(), 3); connections.add(dataSource.getConnection()); connections.add(dataSource.getConnection()); dataSource.getConnection(); fail("Expected SQLException from timeout"); assertEquals(dataSource.getConnectionsActive(), 3); dataSource.setMaxConnections(2); assertEquals(dataSource.getMaxConnections(), 2); assertEquals(dataSource.getConnectionsActive(), 3); dataSource.getConnection(); fail("Expected SQLException from timeout"); assertEquals(dataSource.getConnectionsActive(), 3);
@Test public void testConnectionException() throws Exception { ManagedDataSource dataSource = new MockManagedDataSource(1, new Duration(10, MILLISECONDS)); MockConnection connection = (MockConnection) dataSource.getConnection(); assertNotNull(connection); assertEquals(dataSource.getConnectionsActive(), 1); connection.errorOccurred(); assertEquals(dataSource.getConnectionsActive(), 0); }
assertEquals(dataSource.getMaxConnectionWaitMillis(), 5000); Connection connection = dataSource.getConnection(); assertEquals(dataSource.getConnectionsActive(), 1); assertEquals(dataSource.getConnectionsActive(), 0);
@Test public void testBasic() throws Exception { ManagedDataSource dataSource = new MockManagedDataSource(1, new Duration(10, MILLISECONDS)); assertEquals(dataSource.getConnectionsActive(), 0); assertEquals(dataSource.getStats().getCheckout().getAllTime().getCount(), 0.0); assertEquals(dataSource.getStats().getCreate().getAllTime().getCount(), 0.0); assertEquals(dataSource.getStats().getHeld().getAllTime().getCount(), 0.0); assertEquals(dataSource.getStats().getConnectionErrorCount(), 0); Connection connection = dataSource.getConnection(); assertNotNull(connection); assertTrue(connection instanceof MockConnection); assertEquals(dataSource.getConnectionsActive(), 1); assertEquals(dataSource.getStats().getCheckout().getAllTime().getCount(), 1.0); assertEquals(dataSource.getStats().getCreate().getAllTime().getCount(), 1.0); assertEquals(dataSource.getStats().getHeld().getAllTime().getCount(), 0.0); assertEquals(dataSource.getStats().getConnectionErrorCount(), 0); connection.close(); assertEquals(dataSource.getConnectionsActive(), 0); assertEquals(dataSource.getStats().getCheckout().getAllTime().getCount(), 1.0); assertEquals(dataSource.getStats().getCreate().getAllTime().getCount(), 1.0); assertEquals(dataSource.getStats().getHeld().getAllTime().getCount(), 1.0); assertEquals(dataSource.getStats().getConnectionErrorCount(), 0); }
@Test public void testLoginTimeoutIsNeverSet() throws SQLException { MockConnectionPoolDataSource mockConnectionPoolDataSource = new MockConnectionPoolDataSource(); mockConnectionPoolDataSource.loginTimeout = 42; ManagedDataSource dataSource = new MockManagedDataSource(mockConnectionPoolDataSource, 1, new Duration(5, SECONDS)); // login timeout should always be max connection wait assertEquals(dataSource.getLoginTimeout(), 5); // set to a new value int newTimeout = 12345; dataSource.setLoginTimeout(newTimeout); // data source timeout should still be max connection wait assertEquals(dataSource.getLoginTimeout(), 5); // core data source should remain unaffected assertEquals(mockConnectionPoolDataSource.loginTimeout, 42); }
@Test public void testLogWriterIsNeverSet() throws SQLException { MockConnectionPoolDataSource mockConnectionPoolDataSource = new MockConnectionPoolDataSource(); PrintWriter expectedLogWriter = new PrintWriter(new StringWriter()); mockConnectionPoolDataSource.logWriter = expectedLogWriter; ManagedDataSource dataSource = new MockManagedDataSource(mockConnectionPoolDataSource, 1, new Duration(10, MILLISECONDS)); // data source log writer should start with null assertNull(dataSource.getLogWriter()); // set the writer PrintWriter newWriter = new PrintWriter(new StringWriter()); dataSource.setLogWriter(newWriter); // data source log writer should still be null assertNull(dataSource.getLogWriter()); // core data source should remain unaffected assertSame(mockConnectionPoolDataSource.logWriter, expectedLogWriter); }
@Override public void run() { startLatch.countDown(); try { dataSource.getConnection(); } catch (SQLException e) { exception.set(e); } finally { wasInterrupted.set(isInterrupted()); endLatch.countDown(); } } };
@Override protected Connection createConnection() throws SQLException { assertNotDisposed(); // check for a pooled connection PooledConnection pooledConnection = pool.pollLast(); if (pooledConnection != null) { return prepareConnection(pooledConnection); } // otherwise create a new one return super.createConnection(); }
@Override public void connectionErrorOccurred(ConnectionEvent event) { // was the connection already returned if (!returned.compareAndSet(false, true)) { return; } PooledConnection pooledConnection = null; try { pooledConnection = (PooledConnection) event.getSource(); pooledConnection.removeConnectionEventListener(this); stats.connectionErrorOccurred(); } finally { semaphore.release(); if (pooledConnection != null) { connectionDestroyed(pooledConnection, checkoutTime); } } } }
assertEquals(dataSource.getMaxConnectionWaitMillis(), 10); Connection connection = dataSource.getConnection(); assertEquals(dataSource.getConnectionsActive(), 1); dataSource.getConnection(); fail("Expected SQLException from timeout"); assertEquals(dataSource.getConnectionsActive(), 1); dataSource.setMaxConnectionWaitMillis(new Duration(50, MILLISECONDS)); assertEquals(dataSource.getMaxConnectionWaitMillis(), 50); start = System.nanoTime(); try { dataSource.getConnection(); fail("Expected SQLException from timeout"); assertEquals(dataSource.getConnectionsActive(), 1); dataSource.setMaxConnectionWaitMillis(null); fail("NullPointerException IllegalArgumentException"); assertEquals(dataSource.getMaxConnectionWaitMillis(), 50); dataSource.setMaxConnectionWaitMillis(new Duration(0, MILLISECONDS)); fail("Expected IllegalArgumentException"); assertEquals(dataSource.getMaxConnectionWaitMillis(), 50);
assertEquals(dataSource.getMaxConnections(), 1); connections.add(dataSource.getConnection()); assertEquals(dataSource.getConnectionsActive(), 1); dataSource.getConnection(); fail("Expected SQLException from timeout"); assertEquals(dataSource.getConnectionsActive(), 1); dataSource.setMaxConnections(3); assertEquals(dataSource.getMaxConnections(), 3); connections.add(dataSource.getConnection()); connections.add(dataSource.getConnection()); dataSource.getConnection(); fail("Expected SQLException from timeout"); assertEquals(dataSource.getConnectionsActive(), 3); dataSource.setMaxConnections(2); assertEquals(dataSource.getMaxConnections(), 2); assertEquals(dataSource.getConnectionsActive(), 3); dataSource.getConnection(); fail("Expected SQLException from timeout"); assertEquals(dataSource.getConnectionsActive(), 3);
@Test public void testConnectionException() throws Exception { ManagedDataSource dataSource = new MockManagedDataSource(1, new Duration(10, MILLISECONDS)); MockConnection connection = (MockConnection) dataSource.getConnection(); assertNotNull(connection); assertEquals(dataSource.getConnectionsActive(), 1); connection.errorOccurred(); assertEquals(dataSource.getConnectionsActive(), 0); }
assertEquals(dataSource.getMaxConnectionWaitMillis(), 5000); Connection connection = dataSource.getConnection(); assertEquals(dataSource.getConnectionsActive(), 1); assertEquals(dataSource.getConnectionsActive(), 0);
@Test public void testBasic() throws Exception { ManagedDataSource dataSource = new MockManagedDataSource(1, new Duration(10, MILLISECONDS)); assertEquals(dataSource.getConnectionsActive(), 0); assertEquals(dataSource.getStats().getCheckout().getAllTime().getCount(), 0.0); assertEquals(dataSource.getStats().getCreate().getAllTime().getCount(), 0.0); assertEquals(dataSource.getStats().getHeld().getAllTime().getCount(), 0.0); assertEquals(dataSource.getStats().getConnectionErrorCount(), 0); Connection connection = dataSource.getConnection(); assertNotNull(connection); assertTrue(connection instanceof MockConnection); assertEquals(dataSource.getConnectionsActive(), 1); assertEquals(dataSource.getStats().getCheckout().getAllTime().getCount(), 1.0); assertEquals(dataSource.getStats().getCreate().getAllTime().getCount(), 1.0); assertEquals(dataSource.getStats().getHeld().getAllTime().getCount(), 0.0); assertEquals(dataSource.getStats().getConnectionErrorCount(), 0); connection.close(); assertEquals(dataSource.getConnectionsActive(), 0); assertEquals(dataSource.getStats().getCheckout().getAllTime().getCount(), 1.0); assertEquals(dataSource.getStats().getCreate().getAllTime().getCount(), 1.0); assertEquals(dataSource.getStats().getHeld().getAllTime().getCount(), 1.0); assertEquals(dataSource.getStats().getConnectionErrorCount(), 0); }
@Test public void testLoginTimeoutIsNeverSet() throws SQLException { MockConnectionPoolDataSource mockConnectionPoolDataSource = new MockConnectionPoolDataSource(); mockConnectionPoolDataSource.loginTimeout = 42; ManagedDataSource dataSource = new MockManagedDataSource(mockConnectionPoolDataSource, 1, new Duration(5, SECONDS)); // login timeout should always be max connection wait assertEquals(dataSource.getLoginTimeout(), 5); // set to a new value int newTimeout = 12345; dataSource.setLoginTimeout(newTimeout); // data source timeout should still be max connection wait assertEquals(dataSource.getLoginTimeout(), 5); // core data source should remain unaffected assertEquals(mockConnectionPoolDataSource.loginTimeout, 42); }