package gov.nysenate.openleg.config;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.annotation.PreDestroy;
import javax.sql.DataSource;
import java.beans.PropertyVetoException;
@EnableTransactionManagement
@Configuration
public class DatabaseConfig
{
private static final Logger logger = LoggerFactory.getLogger(DatabaseConfig.class);
/** PostgreSQL Database Configuration */
@Value("${postgresdb.driver}") private String dbDriver;
@Value("${postgresdb.type}") private String dbType;
@Value("${postgresdb.host}") private String dbHost;
@Value("${postgresdb.name}") private String dbName;
@Value("${postgresdb.user}") private String dbUser;
@Value("${postgresdb.pass}") private String dbPass;
@Bean
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(postgresDataSource());
}
@Bean
public NamedParameterJdbcTemplate namedJdbcTemplate() {
return new NamedParameterJdbcTemplate(postgresDataSource());
}
/**
* Configures the sql data source using a connection pool.
* @return DataSource
*/
@Bean
public DataSource postgresDataSource() {
final String jdbcUrlTemplate = "jdbc:%s//%s/%s";
ComboPooledDataSource pool = new ComboPooledDataSource();
try {
pool.setDriverClass(dbDriver);
}
catch (PropertyVetoException ex) {
logger.error("Error when setting the database driver " + dbDriver + "{}", ex.getMessage());
}
pool.setJdbcUrl(String.format(jdbcUrlTemplate, dbType, dbHost, dbName));
logger.info("Connecting to Postgres: " + pool.getJdbcUrl());
pool.setUser(dbUser);
pool.setPassword(dbPass);
pool.setMinPoolSize(3);
pool.setMaxPoolSize(10);
// Test each connection every 30 sec after first check-in
pool.setTestConnectionOnCheckout(false);
pool.setTestConnectionOnCheckin(true);
pool.setIdleConnectionTestPeriod(30);
return pool;
}
/**
* Configures a Spring transaction manager for the postgres data source.
* @return PlatformTransactionManager
*/
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(postgresDataSource());
}
}