/*
* Copyright [2014] [Christian Loehnert, krampenschiesser@gmail.com]
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.ks.persistence.connection;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;
import org.hibernate.jpa.AvailableSettings;
import org.hibernate.service.spi.Configurable;
import org.hibernate.service.spi.Startable;
import org.hibernate.service.spi.Stoppable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.profiler.Profiler;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
public class ConnectionProvider implements org.hibernate.engine.jdbc.connections.spi.ConnectionProvider, Configurable, Startable, Stoppable {
private static final Logger log = LoggerFactory.getLogger(ConnectionProvider.class);
private PoolProperties properties;
private DataSource datasource;
@Override
public Connection getConnection() throws SQLException {
return datasource.getConnection();
}
@Override
public void closeConnection(Connection conn) throws SQLException {
conn.close();
}
@Override
public boolean supportsAggressiveRelease() {
return false;
}
@Override
public boolean isUnwrappableAs(Class unwrapType) {
return false;
}
@Override
public <T> T unwrap(Class<T> unwrapType) {
return null;
}
@Override
@SuppressWarnings("unchecked")
public void configure(Map configurationValues) {
properties = createProperties(configurationValues);
}
protected PoolProperties createProperties(Map<String, String> configurationValues) {
String jdbcUrl = (String) configurationValues.get(AvailableSettings.JDBC_URL);
String driver = (String) configurationValues.get(AvailableSettings.JDBC_DRIVER);
String user = (String) configurationValues.get(AvailableSettings.JDBC_USER);
String pw = (String) configurationValues.get(AvailableSettings.JDBC_PASSWORD);
log.info("Configuring pool with\n\tjdcburl={}\n\tdriver={}", jdbcUrl, driver);
PoolProperties p = new PoolProperties();
p.setUrl(jdbcUrl);
p.setDriverClassName(driver);
p.setUsername(user);
p.setPassword(pw);
p.setJmxEnabled(false);
p.setTestWhileIdle(false);
p.setTestOnBorrow(true);
p.setValidationQuery("SELECT 1");
p.setTestOnReturn(false);
p.setValidationInterval(30000);
p.setTimeBetweenEvictionRunsMillis(30000);
p.setMaxActive(100);
p.setInitialSize(10);
p.setMaxWait(10000);
p.setRemoveAbandonedTimeout(60);
p.setMinEvictableIdleTimeMillis(30000);
p.setMinIdle(10);
p.setLogAbandoned(true);
p.setRemoveAbandoned(true);
p.setDefaultAutoCommit(false);
p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;" + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
return p;
}
@Override
public void start() {
Profiler profiler = new Profiler("profiler");
datasource = new DataSource();
datasource.setPoolProperties(properties);
profiler.stop();
log.info("Started {} in {}ms", getClass().getSimpleName(), profiler.elapsedTime() / 1000 / 1000);
}
@Override
public void stop() {
Profiler profiler = new Profiler("profiler");
datasource = new DataSource();
datasource.setPoolProperties(properties);
profiler.stop();
log.info("Stopped {} in {}ms", getClass().getSimpleName(), profiler.elapsedTime() / 1000 / 1000);
}
}