118 lines
3.6 KiB
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;
|
|
}
|
|
|
|
}
|