/* * Copyright (c) 2009 Los Alamos National Security, LLC. * * Los Alamos National Laboratory * Research Library * Digital Library Research & Prototyping Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ package gov.lanl.util; import gov.lanl.adore.djatoka.openurl.ResolverException; import java.util.Date; import java.util.Properties; 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.impl.GenericObjectPool; import org.apache.log4j.Logger; /** * DBCP / JDBC Utilities Wrapper * @author Ryan Chute * */ public class DBCPUtils { static Logger log = Logger.getLogger(DBCPUtils.class.getName()); /** * Set-up a DBCP DataSource from a properties object. Uses a properties * key prefix to identify the properties associated with profile. If * a database profile has a prefix of djatoka, the props object would * contain the following pairs: * djatoka.url=jdbc:mysql://localhost/djatoka * djatoka.driver=com.mysql.jdbc.Driver * djatoka.login=root * djatoka.pwd= * djatoka.maxActive=50 * djatoka.maxIdle=10 * @param dbid database profile properties file prefix * @param props properties object containing relevant pairs */ public static DataSource setupDataSource(String dbid, Properties props) throws Exception { String url = props.getProperty(dbid + ".url"); String driver = props.getProperty(dbid + ".driver"); String login = props.getProperty(dbid + ".login"); String pwd = props.getProperty(dbid + ".pwd"); int maxActive = 50; if (props.containsKey(dbid + ".maxActive")) maxActive = Integer.parseInt(props.getProperty(dbid + ".maxActive")); int maxIdle = 10; if (props.containsKey(dbid + ".maxIdle")) maxIdle = Integer.parseInt(props.getProperty(dbid + ".maxIdle")); log.debug(url + ";" + driver + ";" + login + ";" + pwd + ";" + maxActive + ";" + maxIdle); return setupDataSource(url, driver, login, pwd, maxActive, maxIdle); } /** * Set-up a DBCP DataSource from core connection properties. * @param connectURI jdbc connection uri * @param jdbcDriverName qualified classpath to jdbc driver for database * @param username database user account * @param password database password * @param maxActive max simultaneous db connections (default: 50) * @param maxIdle max idle db connections (default: 10) */ public static DataSource setupDataSource(String connectURI, String jdbcDriverName, String username, String password, int maxActive, int maxIdle) throws Exception{ try { java.lang.Class.forName(jdbcDriverName).newInstance(); } catch (Exception e) { log.error("Error when attempting to obtain DB Driver: " + jdbcDriverName + " on " + new Date().toString(), e); throw new ResolverException(e); } if (maxActive <= 0) maxActive = 50; if (maxIdle <= 0) maxIdle = 10; GenericObjectPool connectionPool = new GenericObjectPool( null, // PoolableObjectFactory, can be null maxActive, // max active GenericObjectPool.WHEN_EXHAUSTED_BLOCK, // action when exhausted 3000, // max wait (milli seconds) maxIdle, // max idle false, // test on borrow false, // test on return 60000, // time between eviction runs (millis) 5, // number to test on eviction run 30000, // min evictable idle time (millis) true // test while idle ); ConnectionFactory connectionFactory = new DriverManagerConnectionFactory( connectURI, username, password); PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory( connectionFactory, connectionPool, null, null, false, true); PoolingDataSource dataSource = new PoolingDataSource(connectionPool); return dataSource; } }