如何通过JDBC连接了解DB2风格

cngwdvgl  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(229)

我的DB2有JDBC连接,如何识别这是Z/OS390还是AS 400还是UDB连接。
是否有任何模式可以给予有关DB2类型的概念?

z9smfwbn

z9smfwbn1#

您可以使用DatabaseMetaData.getDatabaseProductName()DatabaseMetaData.getDatabaseProductVersion()。例如,在Linux的Db2 10.5修复包7中,它们分别返回DB2/LINUXX8664SQL10057
样本代码:

import java.sql.*;

class Test {
    public static void main(String args[]) {
        if (args.length == 0 ) {
            System.out.println("need url");
            System.exit(1);
        }

        String url = args[0];

        try {
            Class.forName("com.ibm.db2.jcc.DB2Driver");
            Connection c = DriverManager.getConnection(url);
            if (c != null) {
                DatabaseMetaData meta = c.getMetaData();
                if (meta != null) {
                    System.out.println( String.format(
                        "Connected to %s %s (%d.%d)",
                        meta.getDatabaseProductName(),
                        meta.getDatabaseProductVersion(),
                        meta.getDatabaseMajorVersion(),
                        meta.getDatabaseMinorVersion()
                        )
                    );
                }
                else {
                    System.out.println("Metadata is null");
                }
            }
            c.close();
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
            System.exit(1);
        }
    }
}
disbfnqx

disbfnqx2#

IBM here介绍了如何使用JDBC了解您连接到的Db2服务器的类型。您可以从 *Db2 from z/OS指南 * 中看到它,但在其他地方没有找到它。
假设您已经使用Connection.getMetaData()撷取了DatabaseMetaData对象,则可以执行下列动作:

String databaseProductName = databaseMetaData.getDatabaseProductName();
String databaseProductVersion = databaseMetaData.getDatabaseProductVersion();
String databaseProductNameLower = databaseProductName.toLowerCase(Locale.US);

// Detect IBM Db2 flavors
// According to IBM's documentation the database engine must be detected
// primarily from the ProductVersion value whereas IBM makes no real 
// promise on the value of the ProductName. This is why we use the ProductName
// with some caution below.
if (databaseProductNameLower.equals("db2") 
 || databaseProductNameLower.matches("db2[.-/ ].*")) {
    if (databaseProductVersion != null && databaseProductVersion.length() > 3) {
        String ppp = databaseProductVersion.substring(0, 3);
        switch (ppp) {
            case "DSN":
                return DB2_ZOS;  // Db2 for z/OS
            case "SQL":
                return DB2_LUW;  // Db2 on Linux, UNIX, and Windows systems
            case "QSQ":
                return DB2_I;    // Db2 for IBM i 
            case "ARI":
                return DB2_VM;   // Db2 Server for VM and VSE
            default:
        }
    }
}

(In我的例子我使用上面的作为更大的东西的一部分,所以不从上面返回一个值是可以接受的。

相关问题