/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.eas.client.resourcepool;
import com.eas.client.settings.DbConnectionSettings;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.NamingException;
import javax.sql.DataSource;
/**
*
* @author mg
*/
public class GeneralResourceProvider {
protected static class InstanceHolder {
private static final GeneralResourceProvider instance = new GeneralResourceProvider();
}
// dom constants
public static transient final String DB_DRIVER_TAG_NAME = "driver";
public static transient final String DB_DRIVER_DIALECT_ATTR_NAME = "dialect";
public static transient final String[] driversClasses = new String[]{
"oracle.jdbc.OracleDriver",
"net.sourceforge.jtds.jdbc.Driver",
"org.postgresql.Driver",
"com.mysql.jdbc.Driver",
"com.ibm.db2.jcc.DB2Driver",
"org.h2.Driver"
};
/**
*
* @throws SQLException
*/
public static void registerDrivers() throws SQLException {
for (String driverClassName : driversClasses) {
try {
Class<?> clazz = Class.forName(driverClassName);
if (clazz != null) {
try {
Driver dr = (Driver) clazz.newInstance();
try {
DriverManager.registerDriver(dr);
} catch (SQLException ex) {
Logger.getLogger(GeneralResourceProvider.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (InstantiationException | IllegalAccessException ex) {
Logger.getLogger(GeneralResourceProvider.class.getName()).log(Level.SEVERE, null, ex);
}
}
} catch (ClassNotFoundException ex) {
Logger.getLogger(GeneralResourceProvider.class.getName()).log(Level.WARNING, "JDBC driver class not found: {0}", driverClassName);
}
}
}
private final Map<String, PlatypusNativeDataSource> connectionPools = new ConcurrentHashMap<>();
public static GeneralResourceProvider getInstance() {
return InstanceHolder.instance;
}
protected GeneralResourceProvider() {
super();
}
public void registerDatasource(String aName, DbConnectionSettings aSettings) {
connectionPools.put(aName, constructDataSource(aSettings));
}
public void registerDatasource(String aName, PlatypusNativeDataSource aPool) {
connectionPools.put(aName, aPool);
}
public void unregisterDatasource(String aName) throws SQLException {
PlatypusNativeDataSource removed = connectionPools.remove(aName);
if (removed != null) {
removed.shutdown();
}
}
private PlatypusNativeDataSource constructDataSource(DbConnectionSettings aSettings) {
return new PlatypusNativeDataSource(aSettings.getMaxConnections(), aSettings.getMaxStatements(), aSettings.getUrl(), aSettings.getUser(), aSettings.getPassword(), aSettings.getSchema(), aSettings.getProperties());
}
public DataSource getPooledDataSource(String aDatasourceName) throws Exception {
DataSource ds = connectionPools.get(aDatasourceName);
if (ds == null) {
throw new NamingException("Datasource " + aDatasourceName + " is not registered");
} else {
return ds;
}
}
}