현재 IBM Bluemix의 DB2onCloud는 HA 계획을 가지고 있습니다. 계획된 유지 보수 또는 장애 조치가있는 경우 응용 프로그램이 데이터베이스에 원활하게 연결할 수 있습니다. 애플리케이션 측면에서 그렇게 할 수 있을까요?DB2onCloud (트랜잭션 용 dashDB라고도 함)를 사용할 때 가용성에 대한 자동 클라이언트 리 라우트 사용 HA 계획
답변
더 나은 보안을 위해 Cloud 데이터베이스에서 Db2에 연결할 때 항상 SSL을 사용하는 것이 좋습니다. 예 JDBC를 통해 연결하려면 연결 문자열은 다음과 같을 것이다
"jdbc:db2://<Db2OnCloudServer>:50001/BLUDB:sslConnection=true;user=bluadmin;password=<Password>;enableSeamlessFailover=true;"
당신은 "서비스 자격 증명"에서 클라우드 서비스 인스턴스에 대한 사용자의 DB2에서이 문자열 및 자격 증명을 얻을 수 있습니다. 이미 해당 자격 증명이 표시되지 않으면 "새 자격 증명"을 클릭하면 해당 자격 증명이 나타납니다. SSL 사용의 또 다른 이점은 장애 조치 (failover)가 있고 위의 연결 문자열을 사용하는 경우 서버와 클라이언트가 대체 서버 정보를 교환 할 때 원활하게 다시 연결된다는 것입니다.
SSL 연결을 사용하지 않을 때는 서버에서 보낸 대체 서버 정보가 SSL 연결에만 사용되기 때문에 응용 프로그램이 다시 연결될 수 있도록 매개 변수를 추가로 지정해야합니다. 당신은 다음과 같이 연결 문자열을 사용할 수 있도록하려면 :
"jdbc:db2://<DB2OnCloudServer>:50000/BLUDB:user=bluadmin;password=<Password>;enableClientAffinitiesList=1;maxRetriesForClientReroute=10;retryIntervalForClientReroute=5;clientRerouteAlternateServerName=<Db2OnCloudServer>,<Db2OnCloudServer>;clientRerouteAlternatePortNumber=50000,50000;enableSeamlessFailover=true;"
참고 문자열에서 대체 서버와 같은 서버를 지정합니다. 이것은 페일 오버가 발생할 때 서버의 IP가 이동하므로 연결이 항상 동일한 IP를 통해 이루어지기 때문입니다. clientRerouteAlternateServerName
및 clientRerouteAlternatePortNumber
을 지정하면 서버에서 반환 된 값이 무시되어 SSL 포트에 대신 연결됩니다.
위의 내용은 데이터베이스에 대한 실제 연결을 처리하지만 애플리케이션에도 적절한 재시도 논리가 있어야합니다. 다음은 사용법을 보여주는 코드의 대략적인 샘플입니다. import java.sql. *;
public class JDBCSampleEx {
public static void main(String args[]) {
String connectionURL = "jdbc:db2://169.48.134.122:50000/BLUDB:user=bluadmin;password=MmM5OWQ3ZWUyZmNm;enableClientAffinitiesList=1;maxRetriesForClientReroute=10;retryIntervalForClientReroute=5;clientRerouteAlternateServerName=169.48.134.122,169.48.134.122;clientRerouteAlternatePortNumber=50000,50000;enableSeamlessFailover=true;";
Connection con = null;
try {
// Load the JCC Driver class (db2jcc4.jar).
Class.forName("com.ibm.db2.jcc.DB2Driver");
//Create the connection using the static getConnection method
con = DriverManager.getConnection(connectionURL);
Statement stmt = con.createStatement();
ResultSet rs = null;
con.setAutoCommit(false);
try {
rs = stmt.executeQuery("select FIRSTNME, SALARY from EMPLOYEE");
// Print results
while (rs.next()) {
System.out.println("Name= " + rs.getString("FIRSTNME") + " SALARY= " + rs.getString("SALARY"));
}
// do a random update
String sql = "update EMPLOYEE set FIRSTNME = '" + RandomAlphaNum.gen(10) + "'";
stmt.executeUpdate(sql);
con.commit();
} catch (java.sql.SQLException e) {
//Catch return code to do any retry
if (e.getErrorCode() == -30108 || e.getErrorCode() == -4498 || e.getErrorCode() == -4499) {
// Add any logic to reply the current in flight transaction
// if necessary
System.out.println("Replay any transactions if necessary");
} else {
throw e;
}
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (con != null) {
con.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}