org.jamwiki.db.LocalDataSource.java Source code

Java tutorial

Introduction

Here is the source code for org.jamwiki.db.LocalDataSource.java

Source

/**
 * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, version 2.1, dated February 1999.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the latest version of the GNU Lesser General
 * Public License as published by the Free Software Foundation;
 *
 * 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program (LICENSE.txt); if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package org.jamwiki.db;

import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.lang3.StringUtils;
import org.jamwiki.Environment;
import org.jamwiki.utils.Encryption;
import org.jamwiki.utils.ResourceUtil;

/**
 * Extension of the Commons DBCP BasicDataSource class that
 * initializes itself from the JAMWiki Environment.
 * <p>
 * Note that we do not directly use the "BasicDataSource" supplied by the commons-dbcp package,
 * because as of version 1.2.2 it does not allow to modify the "WhenExhaustedAction" of the 
 * underlying commons-pool GenericObjectPool instance.
 */
public class LocalDataSource extends BasicDataSource {

    /**
     * Constructs a new WikiDataSource
     */
    public LocalDataSource() throws SQLException, ClassNotFoundException {
        super();
        if (!StringUtils.isBlank(Environment.getValue(Environment.PROP_DB_DRIVER))) {
            ResourceUtil.forName(Environment.getValue(Environment.PROP_DB_DRIVER));
        }
        setUrl(Environment.getValue(Environment.PROP_DB_URL));
        setUsername(Environment.getValue(Environment.PROP_DB_USERNAME));
        setPassword(Encryption.getEncryptedProperty(Environment.PROP_DB_PASSWORD, null));
        setDefaultReadOnly(false);
        // AutoCommit should NOT be set to true 
        // set pool properties
        setMaxActive(Environment.getIntValue(Environment.PROP_DBCP_MAX_ACTIVE));
        setMaxIdle(Environment.getIntValue(Environment.PROP_DBCP_MAX_IDLE));
        setMinEvictableIdleTimeMillis(
                Environment.getIntValue(Environment.PROP_DBCP_MIN_EVICTABLE_IDLE_TIME) * 1000);
        setTestOnBorrow(Environment.getBooleanValue(Environment.PROP_DBCP_TEST_ON_BORROW));
        setTestOnReturn(Environment.getBooleanValue(Environment.PROP_DBCP_TEST_ON_RETURN));
        setTestWhileIdle(Environment.getBooleanValue(Environment.PROP_DBCP_TEST_WHILE_IDLE));
        setTimeBetweenEvictionRunsMillis(
                Environment.getIntValue(Environment.PROP_DBCP_TIME_BETWEEN_EVICTION_RUNS) * 1000);
        setNumTestsPerEvictionRun(Environment.getIntValue(Environment.PROP_DBCP_NUM_TESTS_PER_EVICTION_RUN));
        setValidationQuery(WikiDatabase.getConnectionValidationQuery());
        setPoolPreparedStatements(Environment.getBooleanValue(Environment.PROP_DBCP_POOL_PREPARED_STATEMENTS));
        setMaxOpenPreparedStatements(Environment.getIntValue(Environment.PROP_DBCP_MAX_OPEN_PREPARED_STATEMENTS));
        if (Environment.getValue(Environment.PROP_DB_TYPE).equals(QueryHandler.QUERY_HANDLER_ORACLE)) {
            // handle clobs as strings, Oracle 10g and higher drivers (ojdbc14.jar)
            addConnectionProperty("SetBigStringTryClob", "true");
        }
        if (url.startsWith("jdbc:hsqldb:mem")) {
            addConnectionProperty("shutdown", "true");
        }
        // Test the connection (this will also initialize the connection pool)
        Connection testConnection = null;
        try {
            // try to get a test connection
            testConnection = getConnection();
        } catch (SQLException ex) {
            if (connectionPool != null) {
                try {
                    connectionPool.close();
                } catch (Exception e) {
                } // ignore any exception during cleanup
            }
            throw ex;
        } finally {
            if (testConnection != null) {
                testConnection.close();
            }
        }
        // the ConnectionPool is now initialised, so we can set the dbcp-when-exhausted-action
        connectionPool.setWhenExhaustedAction(
                (byte) Environment.getIntValue(Environment.PROP_DBCP_WHEN_EXHAUSTED_ACTION));
    }
}