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

118 lines
3.6 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.utils.ISUtils;
import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class DataBaseManagerImpl implements DataBaseManager{
// private static final ConcurrentHashMap<DBType,DataBaseManagerImpl> instanceMap=new ConcurrentHashMap<>();
//
// @Synchronized
// public static final DataBaseManagerImpl get(ISQueryDescriptor desc) {
// if(!instanceMap.containsKey(desc.getType())){
// return instanceMap.put(desc.getType(), new DataBaseManagerImpl(desc));
// }
//
// return instanceMap.get(desc.getType());
// }
// ************************************** 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() {
if(dbDescriptor==null) {
dbDescriptor=ISUtils.queryForDatabase(queryDescriptor);
}
return dbDescriptor;
}
@Override
public Connection getConnection() throws SQLException {
DataSource ds=getDataSource();
return ds.getConnection();
}
@Synchronized
private DataSource getDataSource() {
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;
}
}