/** * Gets a Builder for creating a new ConnectionPoolSettings instance. * * @param connectionPoolSettings the existing connection pool settings to configure the builder with * @return a new Builder for ConnectionPoolSettings * @since 3.5 */ public static Builder builder(final ConnectionPoolSettings connectionPoolSettings) { return builder().applySettings(connectionPoolSettings); }
/** * Gets the list of added {@code ConnectionPoolListener}. The default is an empty list. * * @return the unmodifiable list of connection pool listeners * @since 3.5 */ public List<ConnectionPoolListener> getConnectionPoolListeners() { return connectionPoolSettings.getConnectionPoolListeners(); }
private MongoWaitQueueFullException createWaitQueueFullException() { return new MongoWaitQueueFullException(format("Too many threads are already waiting for a connection. " + "Max number of threads (maxWaitQueueSize) of %d has been exceeded.", settings.getMaxWaitQueueSize())); }
private boolean shouldPrune() { return settings.getMaxConnectionIdleTime(MILLISECONDS) > 0 || settings.getMaxConnectionLifeTime(MILLISECONDS) > 0; }
private ExecutorService createMaintenanceTimer() { if (maintenanceTask == null) { return null; } else { ScheduledExecutorService newTimer = Executors.newSingleThreadScheduledExecutor(new DaemonThreadFactory("MaintenanceTimer")); newTimer.scheduleAtFixedRate(maintenanceTask, settings.getMaintenanceInitialDelay(MILLISECONDS), settings.getMaintenanceFrequency(MILLISECONDS), MILLISECONDS); return newTimer; } }
@Override public int getMaxSize() { return settings.getMaxSize(); }
/** * Creates a new ConnectionPoolSettings object with the settings initialised on this builder. * * @return a new ConnectionPoolSettings object */ public ConnectionPoolSettings build() { return new ConnectionPoolSettings(this); }
private boolean pastMaxIdleTime(final UsageTrackingInternalConnection connection) { return expired(connection.getLastUsedAt(), System.currentTimeMillis(), settings.getMaxConnectionIdleTime(MILLISECONDS)); }
private boolean pastMaxLifeTime(final UsageTrackingInternalConnection connection) { return expired(connection.getOpenedAt(), System.currentTimeMillis(), settings.getMaxConnectionLifeTime(MILLISECONDS)); }
private ExecutorService createMaintenanceTimer() { if (maintenanceTask == null) { return null; } else { ScheduledExecutorService newTimer = Executors.newSingleThreadScheduledExecutor(new DaemonThreadFactory("MaintenanceTimer")); newTimer.scheduleAtFixedRate(maintenanceTask, settings.getMaintenanceInitialDelay(MILLISECONDS), settings.getMaintenanceFrequency(MILLISECONDS), MILLISECONDS); return newTimer; } }
private boolean shouldPrune() { return settings.getMaxConnectionIdleTime(MILLISECONDS) > 0 || settings.getMaxConnectionLifeTime(MILLISECONDS) > 0; }
DefaultConnectionPool(final ServerId serverId, final InternalConnectionFactory internalConnectionFactory, final ConnectionPoolSettings settings) { this.serverId = notNull("serverId", serverId); this.settings = notNull("settings", settings); UsageTrackingInternalConnectionItemFactory connectionItemFactory = new UsageTrackingInternalConnectionItemFactory(internalConnectionFactory); pool = new ConcurrentPool<UsageTrackingInternalConnection>(settings.getMaxSize(), connectionItemFactory); maintenanceTask = createMaintenanceTask(); sizeMaintenanceTimer = createMaintenanceTimer(); this.connectionPoolListener = getConnectionPoolListener(settings); connectionPoolListener.connectionPoolOpened(new ConnectionPoolOpenedEvent(serverId, settings)); }
/** * Creates a new ConnectionPoolSettings object with the settings initialised on this builder. * * @return a new ConnectionPoolSettings object */ public ConnectionPoolSettings build() { return new ConnectionPoolSettings(this); }
private boolean pastMaxIdleTime(final UsageTrackingInternalConnection connection) { return expired(connection.getLastUsedAt(), System.currentTimeMillis(), settings.getMaxConnectionIdleTime(MILLISECONDS)); }
private boolean pastMaxLifeTime(final UsageTrackingInternalConnection connection) { return expired(connection.getOpenedAt(), System.currentTimeMillis(), settings.getMaxConnectionLifeTime(MILLISECONDS)); }
private ConnectionPoolSettings getConnectionPoolSettings(final ConnectionPoolSettings connPoolSettings, final ConnectionPoolListener connPoolListener) { return ConnectionPoolSettings.builder(connPoolSettings).addConnectionPoolListener(connPoolListener).build(); } }
@Override public InternalConnection get(final long timeout, final TimeUnit timeUnit) { try { if (waitQueueSize.incrementAndGet() > settings.getMaxWaitQueueSize()) { throw createWaitQueueFullException(); } try { connectionPoolListener.waitQueueEntered(new ConnectionPoolWaitQueueEnteredEvent(serverId)); PooledConnection pooledConnection = getPooledConnection(timeout, timeUnit); if (!pooledConnection.opened()) { try { pooledConnection.open(); } catch (Throwable t) { pool.release(pooledConnection.wrapped, true); if (t instanceof MongoException) { throw (MongoException) t; } else { throw new MongoInternalException(t.toString(), t); } } } return pooledConnection; } finally { connectionPoolListener.waitQueueExited(new ConnectionPoolWaitQueueExitedEvent(serverId)); } } finally { waitQueueSize.decrementAndGet(); } }
public static ConnectionPoolListener getConnectionPoolListener(final ConnectionPoolSettings connectionPoolSettings) { switch (connectionPoolSettings.getConnectionPoolListeners().size()) { case 0: return NO_OP_CONNECTION_POOL_LISTENER; case 1: return connectionPoolSettings.getConnectionPoolListeners().get(0); default: return new ConnectionPoolListenerMulticaster(connectionPoolSettings.getConnectionPoolListeners()); } }
@Override public int getMaxSize() { return settings.getMaxSize(); }
static ConnectionPoolSettings pool(final ConnectionString cstr, final Config conf) { ConnectionPoolSettings.Builder pool = ConnectionPoolSettings.builder() .applyConnectionString(cstr); withConf("pool", conf, c -> { withMs("maintenanceFrequency", c, s -> pool.maintenanceFrequency(s, TimeUnit.MILLISECONDS)); withMs("maintenanceInitialDelay", c, s -> pool.maintenanceInitialDelay(s, TimeUnit.MILLISECONDS)); withMs("maxConnectionIdleTime", c, s -> pool.maxConnectionIdleTime(s, TimeUnit.MILLISECONDS)); withMs("maxConnectionLifeTime", c, s -> pool.maxConnectionLifeTime(s, TimeUnit.MILLISECONDS)); withInt("maxSize", c, pool::maxSize); withInt("maxWaitQueueSize", c, pool::maxWaitQueueSize); withMs("maxWaitTime", c, s -> pool.maxWaitTime(s, TimeUnit.MILLISECONDS)); withInt("minSize", c, pool::minSize); }); return pool.build(); }