All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mchange.v2.c3p0.PooledDataSource Maven / Gradle / Ivy

Go to download

Enables C3P0 with Hibernate connections in the GuicedPersistence provider Requires JDK 8 and up

There is a newer version: 62
Show newest version
/*
 * Distributed as part of c3p0 v.0.9.5.3
 *
 * Copyright (C) 2018 Machinery For Change, Inc.
 *
 * Author: Steve Waldman 
 *
 * This library is free software; you can redistribute it and/or modify
 * it under the terms of EITHER:
 *
 *     1) The GNU Lesser General Public License (LGPL), version 2.1, as 
 *        published by the Free Software Foundation
 *
 * OR
 *
 *     2) The Eclipse Public License (EPL), version 1.0
 *
 * You may choose which license to accept if you wish to redistribute
 * or modify this work. You may offer derivatives of this work
 * under the license you have chosen, or you may provide the same
 * choice of license which you have been offered here.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received copies of both LGPL v2.1 and EPL v1.0
 * along with this software; see the files LICENSE-EPL and LICENSE-LGPL.
 * If not, the text of these licenses are currently available at
 *
 * LGPL v2.1: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
 *  EPL v1.0: http://www.eclipse.org/org/documents/epl-v10.php 
 * 
 */

package com.mchange.v2.c3p0;

import java.sql.SQLException;
import javax.sql.DataSource;
import java.util.Collection;
import java.util.Map;

/**
 *  

Most clients need never use or know about this interface -- c3p0 pooled DataSources * can be treated like any other DataSource.

* *

The functionality in this interface will be only be of interest if 1) for administrative * reasons you like to keep close track of the number and status of all Connections your application * is using; 2) to work around problems encountered while managing a DataSource whose clients are * poorly coded applications that leak Connections, but which you are not permitted to fix; * or 3) to work around problems that may occur if an underlying jdbc driver / DBMS system is * unreliable. In the third case, most users will be better off not using the present interface * at all, and using the DataSources' maxIdleTime, idleConnectionTestPeriod, * or testConnectionOnCheckout parameters to help your DataSources "automatically" heal. * But for those who prefer a more direct, manual approach, this interface is for you. It is anticipated * that the methods of this interface will primarily be of use to administrators managing c3p0 * PooledDataSources via JMX MBeans.

* *

Method Names & Per-User Pools

* *

To understand this interface, you need to realize that a c3p0 PooledDataSource may represent * not just one pool of Connections, but many, if users call the method * Connection getConnection(String username, String password) rather than the * no-argument getConnection() method. If users make use of non-default username, password * combinations, there will be a separate pool for each set of authentification criteria supplied.

* *

Many methods in this interface have three variants:

*
    *
  1. <method-name>DefaultUser()
  2. *
  3. <method-name>(String username, String password)
  4. *
  5. <method-name>AllUsers()
  6. *
*

The first variant makes use of the pool maintained for the default user -- * Connections created by calls to the no argument getConnection(), * the second variant lets you keeps track of pools created by calling * getConnection( username, password ), and the third variant * provides aggregate information or performs operation on all pools.

* *

Under most circumstances, non-default authentication credentials will not * be used, and methods of the first variant are sufficient to manage the DataSource.

* *

Soft and Hard Resets

* *

A properly configured PooledDataSource whose applications are careful to close all checked-out Connections * would never need to use these methods. But, sometimes applications are untrustworthy * and leak Connections, or database administrators suspect that Connections may be corrupt or invalid, * and would like to force a pool to flush and acquire fresh Connections. This interface provides two * ways to do so.

* *
    *
  1. hardReset() immediately closes all Connections managed by the DataSource, including * those that are currently checked out, bringing the DataSource back to the state it was in before * the first client called getConnection(). This method is obviously disruptive, and should be with * great care. Administrators who need to work around client applications that leak Connections, can * periodically poll for pool exhaustion (using the methods of this class, or by attempting to retrieve * a Connection and timing out) and use this method clean-up all Connections and start over. But calling * this method risks breaking Connections in current use by valid applications.

  2. * *
  3. softResetDefaultUser(), softReset( username, password ) and * softResetAllUsers() asks the DataSource to flush its current pool of Connections and * reacquire without invalidating currently checked-out Connections. Currently checked out Connections * are logically removed from the pool, but their destruction is deferred until a client attempts to close() / check-in * the Connection. Administrators who suspect that some Connections in the pool may be invalid, but who do not * wish to rely upon c3p0's automatic testing and detection mechanisms to resolve the problem, may call these * methods to force a refresh without disrupting current clients. Administrators who suspect that clients may be * leaking Connections may minimize disruptive hardReset() calls by using softReset() until the number of unclosed * orphaned connections reaches an unacceptable level. (See above to understand * why there are three variants of this method.)
  4. *
* *

Understanding Connection Counts

* *

For each per-user pool, four different statistics are available:

* *
    *
  1. numConnections represents the total number of Connections in the pool.

  2. *
  3. numIdleConnections represents the number of Connections in the pool that are currently available for checkout.

  4. *
  5. numBusyConnections represents the number of Connections in the pool that are currently checked out. The * invariant numIdleConnections + numBusyConnections == numConnections should always hold.

  6. *
  7. numUnclosedOrphanedConnections will only be non-zero following a call to softReset(). It represents * the number of Connections that were checked out when a soft reset occurred and were therefore * silently excluded from the pool, and which remain unclosed by the client application.
  8. *
*/ public interface PooledDataSource extends DataSource /*, AutoCloseable // save for 0.9.6 */ { public String getIdentityToken(); public String getDataSourceName(); public void setDataSourceName(String dataSourceName); public Map getExtensions(); public void setExtensions(Map extensions); /** @deprecated use getNumConnectionsDefaultUser() */ public int getNumConnections() throws SQLException; /** @deprecated use getNumIdleConnectionsDefaultUser() */ public int getNumIdleConnections() throws SQLException; /** @deprecated use getNumBusyConnectionsDefaultUser() */ public int getNumBusyConnections() throws SQLException; /** @deprecated use getNumUnclosedOrphanedConnectionsDefaultUser() */ public int getNumUnclosedOrphanedConnections() throws SQLException; public int getNumConnectionsDefaultUser() throws SQLException; public int getNumIdleConnectionsDefaultUser() throws SQLException; public int getNumBusyConnectionsDefaultUser() throws SQLException; public int getNumUnclosedOrphanedConnectionsDefaultUser() throws SQLException; public int getStatementCacheNumStatementsDefaultUser() throws SQLException; public int getStatementCacheNumCheckedOutDefaultUser() throws SQLException; public int getStatementCacheNumConnectionsWithCachedStatementsDefaultUser() throws SQLException; public long getStartTimeMillisDefaultUser() throws SQLException; public long getUpTimeMillisDefaultUser() throws SQLException; public long getNumFailedCheckinsDefaultUser() throws SQLException; public long getNumFailedCheckoutsDefaultUser() throws SQLException; public long getNumFailedIdleTestsDefaultUser() throws SQLException; public float getEffectivePropertyCycleDefaultUser() throws SQLException; public int getNumThreadsAwaitingCheckoutDefaultUser() throws SQLException; /** * Discards all Connections managed by the PooledDataSource's default-authentication pool * and reacquires new Connections to populate. * Current checked out Connections will still * be valid, and should still be checked into the * PooledDataSource (so the PooledDataSource can destroy * them). */ public void softResetDefaultUser() throws SQLException; public int getNumConnections(String username, String password) throws SQLException; public int getNumIdleConnections(String username, String password) throws SQLException; public int getNumBusyConnections(String username, String password) throws SQLException; public int getNumUnclosedOrphanedConnections(String username, String password) throws SQLException; public int getStatementCacheNumStatements(String username, String password) throws SQLException; public int getStatementCacheNumCheckedOut(String username, String password) throws SQLException; public int getStatementCacheNumConnectionsWithCachedStatements(String username, String password) throws SQLException; public float getEffectivePropertyCycle(String username, String password) throws SQLException; public int getNumThreadsAwaitingCheckout(String username, String password) throws SQLException; /** * Discards all Connections managed by the PooledDataSource with the specified authentication credentials * and reacquires new Connections to populate. * Current checked out Connections will still * be valid, and should still be checked into the * PooledDataSource (so the PooledDataSource can destroy * them). */ public void softReset(String username, String password) throws SQLException; public int getNumBusyConnectionsAllUsers() throws SQLException; public int getNumIdleConnectionsAllUsers() throws SQLException; public int getNumConnectionsAllUsers() throws SQLException; public int getNumUnclosedOrphanedConnectionsAllUsers() throws SQLException; public int getStatementCacheNumStatementsAllUsers() throws SQLException; public int getStatementCacheNumCheckedOutStatementsAllUsers() throws SQLException; public int getStatementCacheNumConnectionsWithCachedStatementsAllUsers() throws SQLException; public int getStatementDestroyerNumConnectionsInUseAllUsers() throws SQLException; public int getStatementDestroyerNumConnectionsWithDeferredDestroyStatementsAllUsers() throws SQLException; public int getStatementDestroyerNumDeferredDestroyStatementsAllUsers() throws SQLException; public int getThreadPoolSize() throws SQLException; public int getThreadPoolNumActiveThreads() throws SQLException; public int getThreadPoolNumIdleThreads() throws SQLException; public int getThreadPoolNumTasksPending() throws SQLException; public int getStatementDestroyerNumThreads() throws SQLException; public int getStatementDestroyerNumActiveThreads() throws SQLException; public int getStatementDestroyerNumIdleThreads() throws SQLException; public int getStatementDestroyerNumTasksPending() throws SQLException; public String sampleThreadPoolStackTraces() throws SQLException; public String sampleThreadPoolStatus() throws SQLException; public String sampleStatementDestroyerStackTraces() throws SQLException; public String sampleStatementDestroyerStatus() throws SQLException; public String sampleStatementCacheStatusDefaultUser() throws SQLException; public String sampleStatementCacheStatus(String username, String password) throws SQLException; public Throwable getLastAcquisitionFailureDefaultUser() throws SQLException; public Throwable getLastCheckinFailureDefaultUser() throws SQLException; public Throwable getLastCheckoutFailureDefaultUser() throws SQLException; public Throwable getLastIdleTestFailureDefaultUser() throws SQLException; public Throwable getLastConnectionTestFailureDefaultUser() throws SQLException; public int getStatementDestroyerNumConnectionsInUseDefaultUser() throws SQLException; public int getStatementDestroyerNumConnectionsWithDeferredDestroyStatementsDefaultUser() throws SQLException; public int getStatementDestroyerNumDeferredDestroyStatementsDefaultUser() throws SQLException; public Throwable getLastAcquisitionFailure(String username, String password) throws SQLException; public Throwable getLastCheckinFailure(String username, String password) throws SQLException; public Throwable getLastCheckoutFailure(String username, String password) throws SQLException; public Throwable getLastIdleTestFailure(String username, String password) throws SQLException; public Throwable getLastConnectionTestFailure(String username, String password) throws SQLException; public int getStatementDestroyerNumConnectionsInUse(String username, String password) throws SQLException; public int getStatementDestroyerNumConnectionsWithDeferredDestroyStatements(String username, String password) throws SQLException; public int getStatementDestroyerNumDeferredDestroyStatements(String username, String password) throws SQLException; public String sampleLastAcquisitionFailureStackTraceDefaultUser() throws SQLException; public String sampleLastCheckinFailureStackTraceDefaultUser() throws SQLException; public String sampleLastCheckoutFailureStackTraceDefaultUser() throws SQLException; public String sampleLastIdleTestFailureStackTraceDefaultUser() throws SQLException; public String sampleLastConnectionTestFailureStackTraceDefaultUser() throws SQLException; public String sampleLastAcquisitionFailureStackTrace(String username, String password) throws SQLException; public String sampleLastCheckinFailureStackTrace(String username, String password) throws SQLException; public String sampleLastCheckoutFailureStackTrace(String username, String password) throws SQLException; public String sampleLastIdleTestFailureStackTrace(String username, String password) throws SQLException; public String sampleLastConnectionTestFailureStackTrace(String username, String password) throws SQLException; /** * Discards all Connections managed by the PooledDataSource * and reacquires new Connections to populate. * Current checked out Connections will still * be valid, and should still be checked into the * PooledDataSource (so the PooledDataSource can destroy * them). */ public void softResetAllUsers() throws SQLException; public int getNumUserPools() throws SQLException; public int getNumHelperThreads() throws SQLException; public Collection getAllUsers() throws SQLException; /** * Destroys all pooled and checked-out Connections associated with * this DataSource immediately. The PooledDataSource is * reset to its initial state prior to first Connection acquisition, * with no pools yet active, but ready for requests. */ public void hardReset() throws SQLException; /** *

C3P0 pooled DataSources use no resources before they are actually used in a VM, * and they close themselves in their finalize() method. When they are active and * pooling, they may have open database connections and their pool may spawn several threads * for its maintenance. You can use this method to clean these resource methods up quickly * when you will no longer be using this DataSource. The resources will actually be cleaned up only if * no other DataSources are sharing the same pool.

* *

You can equivalently use the static method destroy() in the DataSources class to clean-up * these resources.

* *

This is equivalent to calling close( false ).

* * @see DataSources#destroy */ public void close() throws SQLException; /** *

Should be used only with great caution. If force_destroy is set to true, * this immediately destroys any pool and cleans up all resources * this DataSource may be using, even if other DataSources are sharing that * pool! In general, it is difficult to know whether a pool is being shared by * multiple DataSources. It may depend upon whether or not a JNDI implementation returns * a single instance or multiple copies upon lookup (which is undefined by the JNDI spec).

* *

In general, this method should be used only when you wish to wind down all c3p0 pools * in a ClassLoader. For example, when shutting down and restarting a web application * that uses c3p0, you may wish to kill all threads making use of classes loaded by a * web-app specific ClassLoader, so that the ClassLoader can be cleanly garbage collected. * In this case, you may wish to use force destroy. Otherwise, it is much safer to use * the simple destroy() method, which will not shut down pools that may still be in use.

* *

To close a pool normally, use the no argument close method, or set force_destroy * to false.

* * @deprecated the force_destroy argument is now meaningless, as pools are no longer * potentially shared between multiple DataSources. * * @see #close() */ public void close(boolean force_destory) throws SQLException; }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy