/**
* Copyright 2012 Universitat Pompeu Fabra.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*
*/
package org.onexus.collection.store.mysql.internal;
import com.mysql.jdbc.Driver;
import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDataSource;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.onexus.collection.api.ICollectionStore;
import org.onexus.collection.store.sql.SqlCollectionStore;
import org.onexus.resource.api.IResourceManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MysqlCollectionStore extends SqlCollectionStore implements ICollectionStore {
private static final Logger LOGGER = LoggerFactory.getLogger(MysqlCollectionStore.class);
private String server;
private String port;
private String database;
private String username;
private String password;
private String poolMaxActive;
private String poolWhenExhausted;
private String poolMaxWait;
private IResourceManager resourceManager;
public MysqlCollectionStore() {
super();
}
protected DataSource newDataSource() {
try {
Class.forName(Driver.class.getName());
} catch (Exception e) {
LOGGER.error("Exception: " + e.getMessage());
}
// Config parameters
int maxActive = 8;
try {
maxActive = Integer.valueOf(getPoolMaxActive().trim()).intValue();
} catch (Exception e) {
LOGGER.error("Malformed config parameter 'poolMaxActive'");
}
byte whenExhausted = GenericObjectPool.WHEN_EXHAUSTED_BLOCK;
try {
if (getPoolWhenExhausted().trim().equalsIgnoreCase("FAIL")) {
whenExhausted = GenericObjectPool.WHEN_EXHAUSTED_FAIL;
}
if (getPoolWhenExhausted().trim().equalsIgnoreCase("GROW")) {
whenExhausted = GenericObjectPool.WHEN_EXHAUSTED_GROW;
}
} catch (Exception e) {
LOGGER.error("Malformed config parameter 'poolWhenExhausted'");
}
long maxWait = GenericObjectPool.DEFAULT_MAX_WAIT;
try {
maxWait = Long.valueOf(getPoolMaxWait().trim()).longValue();
} catch (Exception e) {
LOGGER.error("Malformed config parameter 'poolMaxWait'");
}
// Initialize the DataSource with a connection pool
ConnectionFactory connectionFactory = new MysqlConnectionFactory();
GenericObjectPool connectionPool = new GenericObjectPool(null,
maxActive,
whenExhausted,
maxWait);
connectionPool.setTestWhileIdle(true);
connectionPool.setTimeBetweenEvictionRunsMillis(3600);
connectionPool.setMinEvictableIdleTimeMillis(3600);
@SuppressWarnings("unused")
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(
connectionFactory, connectionPool, null, null, false, true);
poolableConnectionFactory.setValidationQuery("SELECT 1");
return new PoolingDataSource(connectionPool);
}
@Override
public Statement createReadStatement(Connection dataConn) throws SQLException {
Statement st = super.createReadStatement(dataConn);
st.setFetchDirection(ResultSet.FETCH_FORWARD);
st.setFetchSize(Integer.MIN_VALUE);
return st;
}
public String getDatabase() {
return database;
}
public void setDatabase(String database) {
this.database = database;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
public String getServer() {
return server;
}
public void setServer(String server) {
this.server = server;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPoolMaxActive() {
return poolMaxActive;
}
public void setPoolMaxActive(String poolMaxActive) {
this.poolMaxActive = poolMaxActive;
}
public String getPoolWhenExhausted() {
return poolWhenExhausted;
}
public void setPoolWhenExhausted(String poolWhenExhausted) {
this.poolWhenExhausted = poolWhenExhausted;
}
public String getPoolMaxWait() {
return poolMaxWait;
}
public void setPoolMaxWait(String poolMaxWait) {
this.poolMaxWait = poolMaxWait;
}
public IResourceManager getResourceManager() {
return resourceManager;
}
public void setResourceManager(IResourceManager resourceManager) {
this.resourceManager = resourceManager;
}
public class MysqlConnectionFactory implements ConnectionFactory {
@Override
public Connection createConnection() throws SQLException {
return DriverManager.getConnection(
"jdbc:mysql://" + server + ":" + port + "/" + database,
username,
password);
}
}
}