perform-service_broken/src/main/java/org/gcube/application/perform/service/engine/DataBaseManagerImpl.java

107 lines
3.5 KiB
Java

package org.gcube.application.perform.service.engine;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.concurrent.ConcurrentHashMap;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.ConnectionFactory;
import org.apache.commons.dbcp2.DriverManagerConnectionFactory;
import org.apache.commons.dbcp2.PoolableConnection;
import org.apache.commons.dbcp2.PoolableConnectionFactory;
import org.apache.commons.dbcp2.PoolingDataSource;
import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.gcube.application.perform.service.LocalConfiguration;
import org.gcube.application.perform.service.engine.model.DatabaseConnectionDescriptor;
import org.gcube.application.perform.service.engine.model.ISQueryDescriptor;
import org.gcube.application.perform.service.engine.model.InternalException;
import org.gcube.application.perform.service.engine.utils.ISUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DataBaseManagerImpl implements DataBaseManager{
private static final Logger log= LoggerFactory.getLogger(DataBaseManagerImpl.class);
// ************************************** INSTANCE
// Endpoint -> datasource
private static ConcurrentHashMap<String,DataSource> datasources=new ConcurrentHashMap<>();
/**
* Manages db connection pools by scope
*
*
*/
private ISQueryDescriptor queryDescriptor;
private DatabaseConnectionDescriptor dbDescriptor=null;
public DataBaseManagerImpl(ISQueryDescriptor query) {
queryDescriptor=query;
}
private synchronized DatabaseConnectionDescriptor getDB() throws InternalException {
if(dbDescriptor==null) {
dbDescriptor=ISUtils.queryForDatabase(queryDescriptor);
}
return dbDescriptor;
}
@Override
public Connection getConnection() throws SQLException, InternalException {
DataSource ds=getDataSource();
return ds.getConnection();
}
private synchronized DataSource getDataSource() throws InternalException {
DatabaseConnectionDescriptor dbDescriptor=getDB();
if(!datasources.containsKey(dbDescriptor.getUrl())) {
datasources.put(dbDescriptor.getUrl(), setupDataSource(dbDescriptor));
}
return datasources.get(dbDescriptor.getUrl());
}
private static DataSource setupDataSource(DatabaseConnectionDescriptor db) {
log.trace("Setting up data source for {} ",db);
GenericObjectPoolConfig poolConfig=new GenericObjectPoolConfig();
poolConfig.setMaxIdle(Integer.parseInt(LocalConfiguration.getProperty(LocalConfiguration.POOL_MAX_IDLE)));
poolConfig.setMaxTotal(Integer.parseInt(LocalConfiguration.getProperty(LocalConfiguration.POOL_MAX_TOTAL)));
poolConfig.setMinIdle(Integer.parseInt(LocalConfiguration.getProperty(LocalConfiguration.POOL_MIN_IDLE)));
ConnectionFactory connectionFactory =
new DriverManagerConnectionFactory(db.getUrl(),db.getUsername(),db.getPassword());
PoolableConnectionFactory poolableConnectionFactory =
new PoolableConnectionFactory(connectionFactory, null);
ObjectPool<PoolableConnection> connectionPool =
new GenericObjectPool<>(poolableConnectionFactory);
poolableConnectionFactory.setPool(connectionPool);
PoolingDataSource<PoolableConnection> dataSource =
new PoolingDataSource<>(connectionPool);
return dataSource;
}
}