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

Posted

技术标签:

【中文标题】使用 DB2onCloud(aka dashDB for Transactions)HA 计划时启用自动客户端重新路由以获得可用性【英文标题】:Enabling Automatic Client Reroute for Availability when using DB2onCloud(aka dashDB for Transactions) HA plan 【发布时间】:2017-10-11 18:57:40 【问题描述】:

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

【问题讨论】:

【参考方案1】:

为了提高安全性,始终建议在连接到 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 端口。

以上内容将处理与数据库的实际连接,但您的应用程序还需要具有适当的重试逻辑。这是显示用法的粗略代码示例: 导入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();
            
        
    

【讨论】:

以上是关于使用 DB2onCloud(aka dashDB for Transactions)HA 计划时启用自动客户端重新路由以获得可用性的主要内容,如果未能解决你的问题,请参考以下文章

使用 Bluemix 备份 DashDB 的可能性都有哪些?

使用 R studio 连接到 dashDB 的 RODBC

如何使用 dashDB 表中名为 _id 的列?

bluemix 中带有 DashDB 的 ejbTimer 功能

如何在 python 中在 spark notebook 上使用 pandas(dashDB 上的数据)

IBM Cloud dashDB 时区