Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Simple approach on doing multiple connection tries
First we now try to use thick-connection, if that's not possible we use
thin.
Also introduction of immutable ConnectionConfig object - we'll need that
in future.
  • Loading branch information
pesse committed Jul 19, 2018
commit d3e03f57a5598d386a99409a03f76c44bcf172b1
38 changes: 38 additions & 0 deletions src/main/java/org/utplsql/cli/ConnectionConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.utplsql.cli;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ConnectionConfig {

private final String user;
private final String password;
private final String connect;

public ConnectionConfig( String connectString ) {
Matcher m = Pattern.compile("^([^/]+)/([^@]+)@(.*)$").matcher(connectString);
if ( m.find() ) {
user = m.group(1);
password = m.group(2);
connect = m.group(3);
}
else
throw new IllegalArgumentException("Not a valid connectString: '" + connectString + "'");
}

public String getConnect() {
return connect;
}

public String getUser() {
return user;
}

public String getPassword() {
return password;
}

public String getConnectString() {
return user + "/" + password + "@" + connect;
}
}
21 changes: 8 additions & 13 deletions src/main/java/org/utplsql/cli/ConnectionInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

import com.beust.jcommander.IStringConverter;
import com.zaxxer.hikari.HikariDataSource;
import org.utplsql.cli.datasource.DataSourceProvider;

import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
Expand All @@ -12,20 +12,12 @@
public class ConnectionInfo {

private String databaseVersion;

static {
String oracleHome = System.getenv("ORACLE_HOME");
if (oracleHome != null) {
System.setProperty("oracle.net.tns_admin",
String.join(File.separator, oracleHome, "NETWORK", "ADMIN"));
}
}

private HikariDataSource pds = new HikariDataSource();
private HikariDataSource pds;
private ConnectionConfig config;

public ConnectionInfo(String connectionInfo) {

pds.setJdbcUrl("jdbc:oracle:thin:" + connectionInfo);
config = new ConnectionConfig(connectionInfo);
pds = new HikariDataSource();
pds.setAutoCommit(false);
}

Expand All @@ -34,6 +26,9 @@ public void setMaxConnections( int maxConnections ) {
}

public Connection getConnection() throws SQLException {
if ( pds.getJdbcUrl() == null ) {
new DataSourceProvider(config).testAndSetJdbcUrl(pds);
}
return pds.getConnection();
}

Expand Down
5 changes: 5 additions & 0 deletions src/main/java/org/utplsql/cli/ConnectionInfoBuilder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.utplsql.cli;

public class ConnectionInfoBuilder {

}
88 changes: 88 additions & 0 deletions src/main/java/org/utplsql/cli/datasource/DataSourceProvider.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package org.utplsql.cli.datasource;

import com.zaxxer.hikari.HikariDataSource;
import org.utplsql.cli.ConnectionConfig;
import org.utplsql.cli.exception.DatabaseConnectionFailed;

import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class DataSourceProvider {

interface ConnectStringPossibility {
String getConnectString(ConnectionConfig config);
String getMaskedConnectString(ConnectionConfig config);
}

static {
String oracleHome = System.getenv("ORACLE_HOME");
if (oracleHome != null && System.getProperty("oracle.net.tns_admin") == null) {
System.setProperty("oracle.net.tns_admin",
String.join(File.separator, oracleHome, "NETWORK", "ADMIN"));
}
}

private final ConnectionConfig config;
private List<ConnectStringPossibility> possibilities = new ArrayList<>();

public DataSourceProvider(ConnectionConfig config) {
this.config = config;

possibilities.add(new ThickConnectStringPossibility());
possibilities.add(new ThinConnectStringPossibility());
}

public HikariDataSource getDataSource() throws SQLException {

HikariDataSource ds = new HikariDataSource();

testAndSetJdbcUrl(ds);

return ds;
}

public void testAndSetJdbcUrl( HikariDataSource ds ) throws SQLException
{
List<String> errors = new ArrayList<>();
Throwable lastException = null;
for (ConnectStringPossibility possibility : possibilities) {
ds.setJdbcUrl(possibility.getConnectString(config));
try (Connection con = ds.getConnection()) {
return;
} catch (UnsatisfiedLinkError | Exception e) {
errors.add(possibility.getMaskedConnectString(config) + ": " + e.getMessage());
lastException = e;
}
}

errors.forEach(System.out::println);
throw new DatabaseConnectionFailed(lastException);
}

private static class ThickConnectStringPossibility implements ConnectStringPossibility {
@Override
public String getConnectString(ConnectionConfig config) {
return "jdbc:oracle:oci8:" + config.getConnectString();
}

@Override
public String getMaskedConnectString(ConnectionConfig config) {
return "jdbc:oracle:oci8:****/****@" + config.getConnect();
}
}

private static class ThinConnectStringPossibility implements ConnectStringPossibility {
@Override
public String getConnectString(ConnectionConfig config) {
return "jdbc:oracle:thin:" + config.getConnectString();
}

@Override
public String getMaskedConnectString(ConnectionConfig config) {
return "jdbc:oracle:thin:****/****@" + config.getConnect();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

public class DatabaseConnectionFailed extends SQLException {

public DatabaseConnectionFailed(SQLException cause ) {
public DatabaseConnectionFailed(Throwable cause ) {
super( "Could not establish connection to database. Reason: " + cause.getMessage(), cause);
}
}
23 changes: 23 additions & 0 deletions src/test/java/org/utplsql/cli/DataSourceProviderIT.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.utplsql.cli;

import org.junit.jupiter.api.Test;
import org.utplsql.cli.datasource.DataSourceProvider;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.SQLException;

import static org.junit.jupiter.api.Assertions.assertNotNull;

public class DataSourceProviderIT {

@Test
public void connectToDatabase() throws IOException, SQLException {

ConnectionConfig config = new ConnectionConfig(RunCommandTestHelper.getConnectionString());

DataSource dataSource = new DataSourceProvider(config).getDataSource();

assertNotNull(dataSource);
}
}