in src/protocol/jdbc/src/main/java/org/apache/jmeter/protocol/jdbc/config/DataSourceElement.java [214:321]
private BasicDataSource initPool(String maxPool) {
BasicDataSource dataSource = new BasicDataSource();
if (log.isDebugEnabled()) {
log.debug("MaxPool: {} Timeout: {} TrimInt: {} Auto-Commit: {} Preinit: {} poolPreparedStatements: {}",
maxPool, getTimeout(), getTrimInterval(), isAutocommit(), isPreinit(), poolPreparedStatements);
}
int poolSize = Integer.parseInt(maxPool);
dataSource.setMinIdle(0);
dataSource.setInitialSize(poolSize);
dataSource.setAutoCommitOnReturn(false);
if(StringUtils.isNotEmpty(initQuery)) {
String[] sqls = initQuery.split("\n");
dataSource.setConnectionInitSqls(Arrays.asList(sqls));
} else {
dataSource.setConnectionInitSqls(Collections.emptyList());
}
if(StringUtils.isNotEmpty(connectionProperties)) {
dataSource.setConnectionProperties(connectionProperties);
}
if (StringUtils.isNotEmpty(poolPreparedStatements)) {
int maxPreparedStatements = Integer.parseInt(poolPreparedStatements);
if (maxPreparedStatements < 0) {
dataSource.setPoolPreparedStatements(false);
} else {
dataSource.setPoolPreparedStatements(true);
dataSource.setMaxOpenPreparedStatements(10);
}
}
dataSource.setRollbackOnReturn(false);
dataSource.setMaxIdle(poolSize);
dataSource.setMaxTotal(poolSize);
dataSource.setMaxWaitMillis(Long.parseLong(getTimeout()));
dataSource.setDefaultAutoCommit(isAutocommit());
if (log.isDebugEnabled()) {
StringBuilder sb = new StringBuilder(40);
sb.append("KeepAlive: ");
sb.append(isKeepAlive());
sb.append(" Age: ");
sb.append(getConnectionAge());
sb.append(" CheckQuery: ");
sb.append(getCheckQuery());
log.debug(sb.toString());
}
dataSource.setTestOnBorrow(false);
dataSource.setTestOnReturn(false);
dataSource.setTestOnCreate(false);
dataSource.setTestWhileIdle(false);
if(isKeepAlive()) {
dataSource.setTestWhileIdle(true);
String validationQuery = getCheckQuery();
if (StringUtils.isBlank(validationQuery)) {
dataSource.setValidationQuery(null);
} else {
dataSource.setValidationQuery(validationQuery);
}
dataSource.setSoftMinEvictableIdleTimeMillis(Long.parseLong(getConnectionAge()));
dataSource.setTimeBetweenEvictionRunsMillis(Integer.parseInt(getTrimInterval()));
}
int transactionIsolation = DataSourceElementBeanInfo.getTransactionIsolationMode(getTransactionIsolation());
if (transactionIsolation >= 0) {
dataSource.setDefaultTransactionIsolation(transactionIsolation);
}
String _username = getUsername();
if (log.isDebugEnabled()) {
StringBuilder sb = new StringBuilder(40);
sb.append("Driver: ");
sb.append(getDriver());
sb.append(" DbUrl: ");
sb.append(getDbUrl());
sb.append(" User: ");
sb.append(_username);
log.debug(sb.toString());
}
dataSource.setDriverClassName(getDriver());
dataSource.setUrl(getDbUrl());
if (_username.length() > 0){
dataSource.setUsername(_username);
dataSource.setPassword(getPassword());
}
if(isPreinit()) {
// side effect - connection pool init - that is what we want
// see also https://commons.apache.org/proper/commons-dbcp/apidocs/org/apache/commons/dbcp2/BasicDataSource.html#setInitialSize-int-
// it says: "The pool is initialized the first time one of the following methods is invoked:
// getConnection, setLogwriter, setLoginTimeout, getLoginTimeout, getLogWriter."
// so we get a connection and close it - which releases it back to the pool (but stays open)
try {
dataSource.getConnection().close();
if (log.isDebugEnabled()) {
log.debug("Preinitializing the connection pool: {}@{}", getDataSourceName(), System.identityHashCode(dataSource));
}
} catch (SQLException ex) {
if (log.isErrorEnabled()) {
log.error("Error preinitializing the connection pool: {}@{}", getDataSourceName(), System.identityHashCode(dataSource), ex);
}
}
}
log.debug("PoolConfiguration:{}", this.dataSource);
return dataSource;
}