ibm-cloud - 使用 DB2onCloud(又名 dashDB for Transactions)HA 计划时启用自动客户端重新路由以获得可用性

标签 ibm-cloud dashdb

目前IBM Bluemix中的DB2onCloud有HA计划,为了让应用程序在计划维护期间或发生故障转移时无缝连接到数据库,我们如何在应用程序端做到这一点?

最佳答案

为了获得更好的安全性,始终建议在连接到 Db2 on Cloud 数据库时使用 SSL。例如,要通过 JDBC 连接,您的连接字符串将如下所示:

"jdbc:db2://<Db2OnCloudServer>:50001/BLUDB:sslConnection=true;user=bluadmin;password=<Password>;enableSeamlessFailover=true;"

您可以从“服务凭证”下的 Db2 on Cloud 服务实例获取此字符串和凭证。如果您还没有在那里看到凭据,请单击“新凭据”,它们就会出现。 使用 SSL 的另一个好处是,如果发生故障转移并且您正在使用上述连接字符串,它将在服务器和客户端交换备用服务器信息时无缝地重新连接。

当您不使用 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 完成。通过指定clientRerouteAlternateServerNameclientRerouteAlternatePortNumber它将覆盖从服务器返回的值,这意味着它将连接到 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();
                }
            }
        }
    }

关于ibm-cloud - 使用 DB2onCloud(又名 dashDB for Transactions)HA 计划时启用自动客户端重新路由以获得可用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46695648/

相关文章:

java - 在 Bluemix 中启动应用程序时无法创建 PoolableConnectionFactory 错误

artificial-intelligence - 在 IBM Watson 中训练自然语言分类器

android - Bluemix 中 Android 上的 MobileFirst 出现 token 错误

java - 在 Python Flask Cloud Foundry/IBM Cloud 应用程序中添加 Java/JRE/JVM

SQL只选择一个符合条件的项目

db2 - db2 import 或 load 可以用来填充 DashDB 吗?

java - 如何从bluemix获取IP和端口号?

javascript - 已部署的 bluemix 应用程序上超链接的上下文根

sql - 使用 DashDB (DB2) 在复合 SQL 中执行 DDL