有没有一种方法可以在外部设置DB2连接上的APPL_NAME而不是“ db2jcc_application”(例如,使用系统属性)

时间:2019-02-16 11:44:39

标签: java jdbc db2

我正在使用通过JDBC连接到DB2的Java应用程序。它创建连接,以使应用程序名称(sysibmadm.applications-> APPL_NAME)保持JDBC的默认“ db2jcc_application”。有没有办法外部将APPL_NAME设置为所需值? (例如,在Oracle中,我可以通过-Doracle.jdbc.v$session.program=MyApplName来达到类似的效果)。

我想这样做,以便可以清楚地识别进入DB2的所有连接。当前,所有Java应用程序都显示为“ db2jcc_application”。

我写了一小段代码来说明这一点...

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class DB2ApplName {
    public static void main(String[] args) throws ClassNotFoundException, SQLException, InterruptedException {
        Class.forName("com.ibm.db2.jcc.DB2Driver");

        Properties connProps = new Properties();
        connProps.put("user", "<my db2 user>");
        connProps.put("password", "<my db2 password>");

        // Create a connection **WITHOUT** Application Name
        Connection connWithoutApplName = DriverManager.getConnection("jdbc:db2://<ip>:<port>/<dbname>",
                                                                     connProps);

        // Add Application Name to the properties
        connProps.put("clientProgramName", "MyApplName");
        // Create a connection **WITH** Application Name
        Connection connWithApplName = DriverManager.getConnection("jdbc:db2://<ip>:<port>/<dbname>",
                                                                  connProps);
        System.out.println("Sleeping for 60 seconds - check the connections.");
        Thread.sleep(60000L); // During this time I will run query on DB2 to see connection details.

        connWithoutApplName.close();
        connWithApplName.close();
    }
}

此代码创建两个连接,一个设置为没有 ApplName,另一个设置为带有 ApplName。

当代码位于Thread.sleep中时,我查询数据库...

select appl_name from sysibmadm.applications
where client_nname = '<my client ip>' with ur;

APPL_NAME         
------------------
db2jcc_application
MyApplName        

如您所见,第二个连接正确地标记了应用程序名称,但是第一个连接仅以“ db2jcc_application”作为名称。但是,当然,只有在我可以修改应用程序代码的情况下,我才能这样做。

我发现的第二种方法是通过以特殊方式在应用程序设置/属性中设置JDBC URL。如果我设置了JDBCURL=jdbc:db2://<ip>:<port>/<dbname>,则不是在应用程序设置中简单地使用JDBCURL=jdbc:db2://<ip>:<port>/<dbname>:clientProgramName=MyApplName;,而是正确地标记了应用程序名称。不幸的是,对于我们拥有的某些应用程序,我们需要启动多个JVM进程,但是我不能为每个进程分别设置上述设置。我可以为每个进程分别设置JVM参数(例如-D参数)。

因此,我正在寻找是否有一种方法外部传递应用程序名称,以便JDBC驱动程序将其拾取并在连接上标记。

1 个答案:

答案 0 :(得分:0)

以下是可用属性的列表,可以通过JVM参数或属性文件进行设置:
IBM Data Server Driver for JDBC and SQLJ configuration properties
根据此链接,您不能以这种方式设置clientProgramName属性。