Skip to content

Instantly share code, notes, and snippets.

@jumarko
Created December 15, 2015 08:24
Show Gist options
  • Save jumarko/a84d065b5c00a5cff811 to your computer and use it in GitHub Desktop.
Save jumarko/a84d065b5c00a5cff811 to your computer and use it in GitHub Desktop.
package travel.snapshot.dp.ota.configuration;
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.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Properties;
import javax.annotation.Resource;
import javax.sql.DataSource;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "travel.snapshot.dp.ota.db.dal")
public class JPAConfiguration {
private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";
private static final String PROPERTY_NAME_DB_POOL_MAX_TOTAL = "db.pool.max_total";
private static final String PROPERTY_NAME_DB_POOL_MAX_IDLE = "db.pool.max_idle";
private static final String PROPERTY_NAME_DB_POOL_MIN_IDLE = "db.pool.min_idle";
private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";
@Resource(name = "dbProperties")
private Properties dbProperties;
@Bean
public Properties dbProperties() throws IOException {
return PropertiesLoaderUtils.loadProperties(new ClassPathResource("/db.properties"));
}
@Bean
public DataSource otaDataSource() throws ClassNotFoundException {
Class.forName(dbProperties.getProperty(PROPERTY_NAME_DATABASE_DRIVER));
Properties dbConProperties = new Properties();
dbConProperties.put("user", dbProperties.getProperty(PROPERTY_NAME_DATABASE_USERNAME));
dbConProperties.put("password", dbProperties.getProperty(PROPERTY_NAME_DATABASE_PASSWORD));
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
dbProperties.getProperty(PROPERTY_NAME_DATABASE_URL), dbConProperties);
PoolableConnectionFactory poolableConnectionFactory =
new PoolableConnectionFactory(connectionFactory, null);
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxTotal(Integer.parseInt(dbProperties.getProperty(PROPERTY_NAME_DB_POOL_MAX_TOTAL)));
poolConfig.setMaxIdle(Integer.parseInt(dbProperties.getProperty(PROPERTY_NAME_DB_POOL_MAX_IDLE)));
poolConfig.setMinIdle(Integer.parseInt(dbProperties.getProperty(PROPERTY_NAME_DB_POOL_MIN_IDLE)));
poolConfig.setTestOnBorrow(true);
ObjectPool<PoolableConnection> connectionPool =
new GenericObjectPool<>(poolableConnectionFactory, poolConfig);
poolableConnectionFactory.setPool(connectionPool);
return new PoolingDataSource<>(connectionPool);
}
@Bean
public JpaTransactionManager transactionManager() {
return new JpaTransactionManager();
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource otaDataSource) throws ClassNotFoundException, SQLException {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(otaDataSource);
entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
entityManagerFactoryBean
.setPackagesToScan(dbProperties.getProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
entityManagerFactoryBean.setJpaProperties(dbProperties);
return entityManagerFactoryBean;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment