public static final String module = MinervaConnectionFactory.class.getName();
protected static Map<String, XAPoolDataSource> dsCache = FastMap.newInstance();
public Connection getConnection(GenericHelperInfo helperInfo, Element jdbcElement) throws SQLException, GenericEntityException {
XAPoolDataSource pds = dsCache.get(helperInfo.getHelperFullName());
if (pds != null) {
return TransactionFactory.getCursorConnection(helperInfo, pds.getConnection());
}
synchronized (MinervaConnectionFactory.class) {
pds = dsCache.get(helperInfo.getHelperFullName());
if (pds != null) {
return pds.getConnection();
} else {
pds = new XAPoolDataSource();
pds.setPoolName(helperInfo.getHelperFullName());
}
XADataSourceImpl ds = new XADataSourceImpl();
if (ds == null) {
throw new GenericEntityException("XADataSource was not created, big problem!");
}
String jdbcUri = UtilValidate.isNotEmpty(helperInfo.getOverrideJdbcUri()) ? helperInfo.getOverrideJdbcUri() : jdbcElement.getAttribute("jdbc-uri");
String jdbcUsername = UtilValidate.isNotEmpty(helperInfo.getOverrideUsername()) ? helperInfo.getOverrideUsername() : jdbcElement.getAttribute("jdbc-username");
String jdbcPassword = UtilValidate.isNotEmpty(helperInfo.getOverridePassword()) ? helperInfo.getOverridePassword() : jdbcElement.getAttribute("jdbc-password");
ds.setDriver(jdbcElement.getAttribute("jdbc-driver"));
ds.setURL(jdbcUri);
String transIso = jdbcElement.getAttribute("isolation-level");
if (UtilValidate.isNotEmpty(transIso)) {
if ("Serializable".equals(transIso)) {
pds.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
} else if ("RepeatableRead".equals(transIso)) {
pds.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
} else if ("ReadUncommitted".equals(transIso)) {
pds.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
} else if ("ReadCommitted".equals(transIso)) {
pds.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
} else if ("None".equals(transIso)) {
pds.setTransactionIsolation(Connection.TRANSACTION_NONE);
}
}
// set the datasource in the pool
pds.setDataSource(ds);
pds.setJDBCUser(jdbcUsername);
pds.setJDBCPassword(jdbcPassword);
// set the transaction manager in the pool
pds.setTransactionManager(TransactionFactory.getTransactionManager());
// configure the pool settings
try {
pds.setMaxSize(Integer.parseInt(jdbcElement.getAttribute("pool-maxsize")));
} catch (NumberFormatException nfe) {
Debug.logError("Problems with pool settings [pool-maxsize=" + jdbcElement.getAttribute("pool-maxsize") + "]; the values MUST be numbers, using default of 20.", module);
pds.setMaxSize(20);
} catch (Exception e) {
Debug.logError(e, "Problems with pool settings", module);
pds.setMaxSize(20);
}
try {
pds.setMinSize(Integer.parseInt(jdbcElement.getAttribute("pool-minsize")));
} catch (NumberFormatException nfe) {
Debug.logError("Problems with pool settings [pool-minsize=" + jdbcElement.getAttribute("pool-minsize") + "]; the values MUST be numbers, using default of 5.", module);
pds.setMinSize(2);
} catch (Exception e) {
Debug.logError(e, "Problems with pool settings", module);
pds.setMinSize(2);
}
if (jdbcElement.hasAttribute("idle-maxsize")) {
Debug.logWarning("idle-maxsize is not supported by MinervaConnectionFactory, ignoring value", module);
}
// cache the pool
dsCache.put(helperInfo.getHelperFullName(), pds);
return TransactionFactory.getCursorConnection(helperInfo, pds.getConnection());
}
}