package io.trygvis.test; import com.jolbox.bonecp.BoneCPDataSource; import org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy; import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; import javax.sql.DataSource; import java.io.PrintWriter; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import static java.lang.System.getProperty; public class DbUtil { public static DataSource createDataSource() throws SQLException { String username = getProperty("user.name"); String jdbcUrl = getProperty("database.url", "jdbc:postgresql://localhost/" + username); String user = getProperty("database.username", username); String pass = getProperty("database.password", username); return createDataSource(jdbcUrl, user, pass); } public static BoneCPDataSource createDataSource(String jdbcUrl, String username, String password) throws SQLException { BoneCPDataSource ds = new BoneCPDataSource(); ds.setLogStatementsEnabled(true); ds.setJdbcUrl(jdbcUrl); ds.setUsername(username); ds.setPassword(password); ds.setConnectionTestStatement("/* ping*/SELECT 1"); ds.setDefaultAutoCommit(false); ds.setIdleConnectionTestPeriodInSeconds(60); ds.setIdleMaxAgeInSeconds(240); ds.setMaxConnectionsPerPartition(4); ds.setMinConnectionsPerPartition(1); ds.setPartitionCount(4); ds.setAcquireIncrement(1); ds.setStatementsCacheSize(1000); ds.setReleaseHelperThreads(1); ds.setStatisticsEnabled(true); ds.setLogStatementsEnabled(true); ds.setLogWriter(new PrintWriter(System.err)); return ds; } public static DataSource springifyDataSource(DataSource ds) { return new TransactionAwareDataSourceProxy(new LazyConnectionDataSourceProxy(ds)); } public static int getPid(Connection c) throws SQLException { int pid; try (Statement statement = c.createStatement()) { ResultSet rs = statement.executeQuery("SELECT pg_backend_pid()"); rs.next(); pid = rs.getInt(1); } return pid; } }