Java tutorial
/* * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later version. * * This program 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. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package lineage2.commons.dbcp; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import java.util.logging.Logger; import javax.sql.DataSource; import org.apache.commons.dbcp.ConnectionFactory; import org.apache.commons.dbcp.DriverManagerConnectionFactory; import org.apache.commons.dbcp.PoolableConnectionFactory; import org.apache.commons.dbcp.PoolingDataSource; import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.impl.GenericKeyedObjectPool; import org.apache.commons.pool.impl.GenericKeyedObjectPoolFactory; import org.apache.commons.pool.impl.GenericObjectPool; /** * @author Mobius * @version $Revision: 1.0 $ */ public class BasicDataSource implements DataSource { /** * Field _source. */ private final PoolingDataSource _source; /** * Field _connectionPool. */ private final ObjectPool<?> _connectionPool; /** * Constructor for BasicDataSource. * @param driver String * @param connectURI String * @param uname String * @param passwd String * @param maxActive int * @param maxIdle int * @param idleTimeOut int * @param idleTestPeriod int * @param poolPreparedStatements boolean */ public BasicDataSource(String driver, String connectURI, String uname, String passwd, int maxActive, int maxIdle, int idleTimeOut, int idleTestPeriod, boolean poolPreparedStatements) { GenericObjectPool<?> connectionPool = new GenericObjectPool<>(null); connectionPool.setMaxActive(maxActive); connectionPool.setMaxIdle(maxIdle); connectionPool.setMinIdle(1); connectionPool.setMaxWait(-1L); connectionPool.setWhenExhaustedAction(GenericObjectPool.WHEN_EXHAUSTED_GROW); connectionPool.setTestOnBorrow(false); connectionPool.setTestWhileIdle(true); connectionPool.setTimeBetweenEvictionRunsMillis(idleTestPeriod * 1000L); connectionPool.setNumTestsPerEvictionRun(maxActive); connectionPool.setMinEvictableIdleTimeMillis(idleTimeOut * 1000L); GenericKeyedObjectPoolFactory<?, ?> statementPoolFactory = null; if (poolPreparedStatements) { statementPoolFactory = new GenericKeyedObjectPoolFactory<>(null, -1, GenericObjectPool.WHEN_EXHAUSTED_FAIL, 0L, 1, GenericKeyedObjectPool.DEFAULT_MAX_TOTAL); } Properties connectionProperties = new Properties(); connectionProperties.put("user", uname); connectionProperties.put("password", passwd); ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI, connectionProperties); @SuppressWarnings("unused") PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, connectionPool, statementPoolFactory, "SELECT 1", false, true); PoolingDataSource dataSource = new PoolingDataSource(connectionPool); _connectionPool = connectionPool; _source = dataSource; } /** * Method getConnection. * @param con Connection * @return Connection * @throws SQLException */ public Connection getConnection(Connection con) throws SQLException { return (con == null) || con.isClosed() ? _source.getConnection() : con; } /** * Method getBusyConnectionCount. * @return int */ public int getBusyConnectionCount() { return _connectionPool.getNumActive(); } /** * Method getIdleConnectionCount. * @return int */ public int getIdleConnectionCount() { return _connectionPool.getNumIdle(); } /** * Method shutdown. * @throws Exception */ public void shutdown() throws Exception { _connectionPool.close(); } /** * Method getLogWriter. * @return PrintWriter * @see javax.sql.CommonDataSource#getLogWriter() */ @Override public PrintWriter getLogWriter() { return _source.getLogWriter(); } /** * Method setLogWriter. * @param out PrintWriter * @see javax.sql.CommonDataSource#setLogWriter(PrintWriter) */ @Override public void setLogWriter(PrintWriter out) { _source.setLogWriter(out); } /** * Method setLoginTimeout. * @param seconds int * @see javax.sql.CommonDataSource#setLoginTimeout(int) */ @Override public void setLoginTimeout(int seconds) { throw new UnsupportedOperationException(); } /** * Method getLoginTimeout. * @return int * @see javax.sql.CommonDataSource#getLoginTimeout() */ @Override public int getLoginTimeout() { throw new UnsupportedOperationException(); } /** * Method getParentLogger. * @return Logger * @see javax.sql.CommonDataSource#getParentLogger() */ @Override public Logger getParentLogger() { throw new UnsupportedOperationException(); } /** * Method unwrap. * @param iface Class<T> * @return T * @see java.sql.Wrapper#unwrap(Class<T>) */ @Override public <T> T unwrap(Class<T> iface) { throw new UnsupportedOperationException(); } /** * Method isWrapperFor. * @param iface Class<?> * @return boolean * @see java.sql.Wrapper#isWrapperFor(Class<?>) */ @Override public boolean isWrapperFor(Class<?> iface) { return false; } /** * Method getConnection. * @return Connection * @throws SQLException * @see javax.sql.DataSource#getConnection() */ @Override public Connection getConnection() throws SQLException { return _source.getConnection(); } /** * Method getConnection. * @param username String * @param password String * @return Connection * @see javax.sql.DataSource#getConnection(String, String) */ @Override public Connection getConnection(String username, String password) { throw new UnsupportedOperationException(); } }