/*
* Copyright by Mike Mirzayanov
*/
package me.pbox.site.captions.database;
import com.zaxxer.hikari.HikariDataSource;
import me.pbox.site.exception.ApplicationException;
import org.jacuzzi.core.DatabaseException;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Properties;
/**
* This class must be used for only CaptionDaoImpl.
*
* @author Dmitry Levshunov
*/
public class CaptionDataSource {
private static final Properties properties = new Properties();
private CaptionDataSource() {
throw new UnsupportedOperationException("Can't create CaptionDataSource.");
}
public static DataSource getInstance() {
try {
DataSourceHolder.INSTANCE.getConnection().close();
} catch (SQLException e) {
throw new DatabaseException(e);
}
return DataSourceHolder.INSTANCE;
}
private static class DataSourceHolder {
private static final DataSource INSTANCE;
static {
final HikariDataSource hikariDataSource = new HikariDataSource();
int maxPoolSize = Integer.parseInt(properties.getProperty("database.max-pool-size"));
hikariDataSource.setMaximumPoolSize(maxPoolSize);
hikariDataSource.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
hikariDataSource.setConnectionInitSql(String.format("SET time_zone='%s'", properties.getProperty("database.timezone")));
hikariDataSource.setConnectionTestQuery("SELECT 1");
hikariDataSource.setAutoCommit(true);
hikariDataSource.setTransactionIsolation("TRANSACTION_SERIALIZABLE");
hikariDataSource.setIdleTimeout(150000);
hikariDataSource.setMaxLifetime(450000);
hikariDataSource.setLeakDetectionThreshold(120000);
hikariDataSource.addDataSourceProperty("url", properties.getProperty("database.url"));
hikariDataSource.addDataSourceProperty("user", properties.getProperty("database.user"));
hikariDataSource.addDataSourceProperty("password", properties.getProperty("database.password"));
hikariDataSource.addDataSourceProperty("cachePrepStmts", true);
hikariDataSource.addDataSourceProperty("prepStmtCacheSize", 500);
hikariDataSource.addDataSourceProperty("prepStmtCacheSqlLimit", 2048);
hikariDataSource.addDataSourceProperty("useServerPrepStmts", true);
INSTANCE = hikariDataSource;
}
private DataSourceHolder() {
throw new UnsupportedOperationException();
}
}
static {
try {
properties.load(CaptionDataSource.class.getResourceAsStream("/caption.database.properties"));
Class.forName(properties.getProperty("database.driver"));
} catch (IOException e) {
throw new ApplicationException("Can't load /caption.database.properties.", e);
} catch (ClassNotFoundException e) {
throw new ApplicationException(
"Can't load database driver " + properties.getProperty("database.driver") + '.', e
);
}
}
}