com.scalar.db.storage.jdbc.JdbcUtils Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of scalardb Show documentation
Show all versions of scalardb Show documentation
A universal transaction manager that achieves database-agnostic transactions and distributed transactions that span multiple databases
package com.scalar.db.storage.jdbc;
import java.sql.Connection;
import java.sql.JDBCType;
import org.apache.commons.dbcp2.BasicDataSource;
public final class JdbcUtils {
private JdbcUtils() {}
public static BasicDataSource initDataSource(JdbcConfig config, RdbEngineStrategy rdbEngine) {
return initDataSource(config, rdbEngine, false);
}
public static BasicDataSource initDataSource(
JdbcConfig config, RdbEngineStrategy rdbEngine, boolean transactional) {
BasicDataSource dataSource = new BasicDataSource();
/*
* We need to set the driver class of an underlying database to the dataSource in order
* to avoid the "No suitable driver" error in case when ServiceLoader in java.sql.DriverManager
* doesn't work (e.g., when we dynamically load a driver class from a fatJar).
*/
dataSource.setDriver(rdbEngine.getDriver());
dataSource.setUrl(config.getJdbcUrl());
config.getUsername().ifPresent(dataSource::setUsername);
config.getPassword().ifPresent(dataSource::setPassword);
if (transactional) {
dataSource.setDefaultAutoCommit(false);
dataSource.setAutoCommitOnReturn(false);
// if transactional, the default isolation level is SERIALIZABLE
dataSource.setDefaultTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
}
config
.getIsolation()
.ifPresent(
isolation -> {
switch (isolation) {
case READ_UNCOMMITTED:
dataSource.setDefaultTransactionIsolation(
Connection.TRANSACTION_READ_UNCOMMITTED);
break;
case READ_COMMITTED:
dataSource.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
break;
case REPEATABLE_READ:
dataSource.setDefaultTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
break;
case SERIALIZABLE:
dataSource.setDefaultTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
break;
default:
throw new AssertionError();
}
});
dataSource.setMinIdle(config.getConnectionPoolMinIdle());
dataSource.setMaxIdle(config.getConnectionPoolMaxIdle());
dataSource.setMaxTotal(config.getConnectionPoolMaxTotal());
dataSource.setPoolPreparedStatements(config.isPreparedStatementsPoolEnabled());
dataSource.setMaxOpenPreparedStatements(config.getPreparedStatementsPoolMaxOpen());
return dataSource;
}
public static BasicDataSource initDataSourceForTableMetadata(
JdbcConfig config, RdbEngineStrategy rdbEngine) {
BasicDataSource dataSource = new BasicDataSource();
/*
* We need to set the driver class of an underlying database to the dataSource in order
* to avoid the "No suitable driver" error when ServiceLoader in java.sql.DriverManager doesn't
* work (e.g., when we dynamically load a driver class from a fatJar).
*/
dataSource.setDriver(rdbEngine.getDriver());
dataSource.setUrl(config.getJdbcUrl());
config.getUsername().ifPresent(dataSource::setUsername);
config.getPassword().ifPresent(dataSource::setPassword);
dataSource.setMinIdle(config.getTableMetadataConnectionPoolMinIdle());
dataSource.setMaxIdle(config.getTableMetadataConnectionPoolMaxIdle());
dataSource.setMaxTotal(config.getTableMetadataConnectionPoolMaxTotal());
return dataSource;
}
public static BasicDataSource initDataSourceForAdmin(
JdbcConfig config, RdbEngineStrategy rdbEngine) {
BasicDataSource dataSource = new BasicDataSource();
/*
* We need to set the driver class of an underlying database to the dataSource in order
* to avoid the "No suitable driver" error when ServiceLoader in java.sql.DriverManager doesn't
* work (e.g., when we dynamically load a driver class from a fatJar).
*/
dataSource.setDriver(rdbEngine.getDriver());
dataSource.setUrl(config.getJdbcUrl());
config.getUsername().ifPresent(dataSource::setUsername);
config.getPassword().ifPresent(dataSource::setPassword);
dataSource.setMinIdle(config.getAdminConnectionPoolMinIdle());
dataSource.setMaxIdle(config.getAdminConnectionPoolMaxIdle());
dataSource.setMaxTotal(config.getAdminConnectionPoolMaxTotal());
return dataSource;
}
public static boolean isSqlite(JdbcConfig config) {
return config.getJdbcUrl().startsWith("jdbc:sqlite:");
}
/**
* Get {@code JDBCType} of the specified {@code sqlType}.
*
* @param sqlType a type defined in {@code java.sql.Types}
* @return a JDBCType
*/
public static JDBCType getJdbcType(int sqlType) {
JDBCType type;
switch (sqlType) {
case 100: // for Oracle BINARY_FLOAT
type = JDBCType.REAL;
break;
case 101: // for Oracle BINARY_DOUBLE
type = JDBCType.DOUBLE;
break;
default:
try {
type = JDBCType.valueOf(sqlType);
} catch (IllegalArgumentException e) {
type = JDBCType.OTHER;
}
}
return type;
}
}