查找到iSeries的特定JDBCSQL连接的实际作业号?

查找到iSeries的特定JDBCSQL连接的实际作业号?,sql,jdbc,ibm-midrange,Sql,Jdbc,Ibm Midrange,我正在使用JTOpen JDBC驱动程序连接iSeries(又名AS/400、IBM System-I、IBMi、WTH?!…)。我对某个特定语句有问题,似乎需要返回实际的SQL作业QSRVR(或QZDASOINIT?)以查找更多详细信息。唯一的问题是系统上有数百个这样的系统。是否有一种简单的方法来确定实际处理SQL连接或特定语句的作业?来自类AS400JDBCConnectionHandle的JT400 javadoc: getServerJobIdentifier 公共字符串getServe

我正在使用JTOpen JDBC驱动程序连接iSeries(又名AS/400、IBM System-I、IBMi、WTH?!…)。我对某个特定语句有问题,似乎需要返回实际的SQL作业QSRVR(或QZDASOINIT?)以查找更多详细信息。唯一的问题是系统上有数百个这样的系统。是否有一种简单的方法来确定实际处理SQL连接或特定语句的作业?

来自类AS400JDBCConnectionHandle的JT400 javadoc:

getServerJobIdentifier

公共字符串getServerJobIdentifier() 抛出SQLException

Returns the job identifier of the host server job corresponding to this
连接。每个JDBC连接都是 与上的主机服务器作业关联 系统。格式为:

    * 10 character job name
    * 10 character user name
    * 6 character job number 

Note: Since this method is not defined in the JDBC Connection
接口,通常需要强制转换 从返回的连接对象 连接到的PooledConnection.getConnection() AS400JDBCConnectionHandle,以便 调用此方法:

      String serverJobIdentifier = ((AS400JDBCConnectionHandle)connection).getServerJobIdentifier();


Returns:
    The server job identifier, or null if not known. 
Throws:
    SQLException - If the connection is not open.

如果无法修改远程应用程序,则在服务器端有两种可能。最常用的方法是搜索通过连接登录的用户配置文件(*USRPRF)上有锁的作业。当用户配置文件在作业中处于活动状态时,系统不允许删除该用户配置文件,因此锁定非常方便:

WRKOBJLCK logonuser *USRPRF
连接本身也很有用。
NETSTAT
命令可以列出连接:

NETSTAT *CNN

可以对照列出的服务检查远程IP地址,以确定特定连接。可以从那里访问匹配的系统作业。

如果不使用连接池,则以下方法更安全(不知道为什么不使用连接池:),但是…)


不清楚你在回答什么/谁。我不确定到底是什么不清楚:)。@svachon提供的版本仅适用于池连接。这对双方都有效,当你可以用一条指向另一个答案的评论来强调你是在对答案发表评论,而不是回答最初的问题。还总结了你的代码添加的内容,而不是要求观众阅读全部内容来猜测附加值。我觉得它足够简短,不需要与初始注释一起使用。我会尽量记住其他人可能会在前进中挣扎。不管它更好,应该使用,因为您希望在静态实用程序方法中使用这种类型的逻辑,以便重用。在本例中,池连接和非池连接都将是连接句柄。jtOpen驱动程序的独特之处在于它对JDBC规范的实现使用了独特的Java类(在任何地方),但在这里肯定是这样。如果您的连接是非池连接,则@swachon的解决方案将出现类型转换错误
public static String getQualifiedJobNumber(Connection connection) throws SQLException, CustomException {
    if (connection != null && !connection.isClosed()) {
        String jobName = null;
        try {
            AS400JDBCConnectionHandle handle = ((AS400JDBCConnectionHandle) connection);
            if (handle != null) {
                jobName = handle.getServerJobIdentifier();
            }
        } 
        catch (ClassCastException e) {
            try {
                AS400JDBCConnection as400Connection = ((AS400JDBCConnection) connection);
                if (as400Connection != null) {
                    jobName = as400Connection.getServerJobIdentifier();
                }
            }
            catch (ClassCastException e2) {
                throw new CustomException("Attempting to retrieve an AS400 qualified job number from a non-AS400 connection");
            }
        }
        if (jobName != null && jobName.length() == 26) {
            return jobName.substring(20) + "/" + jobName.substring(10, 20).trim() + "/" + jobName.substring(0, 10).trim();
        }
    }
    return null;
}