Java 是否有一种方法可以在DB2连接上外部设置APPL_名称而不是“APPLU”;db2jcc_应用程序“;(例如,具有系统属性)

Java 是否有一种方法可以在DB2连接上外部设置APPL_名称而不是“APPLU”;db2jcc_应用程序“;(例如,具有系统属性),java,jdbc,db2,Java,Jdbc,Db2,我正在使用一个通过JDBC连接到DB2的Java应用程序。它创建连接,使应用程序名(sysibmadm.applications->APPL_name)保持JDBC默认的“db2jcc_应用程序”。是否有办法从外部将APPL_名称设置为所需的值?(例如,在Oracle中,我可以传递-Doracle.jdbc.v$session.program=MyApplName以获得类似的效果) 我希望这样做,以便能够清楚地识别进入DB2的所有连接。目前,所有java应用程序都显示为“db2jcc_应用程序”

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

我希望这样做,以便能够清楚地识别进入DB2的所有连接。目前,所有java应用程序都显示为“db2jcc_应用程序”

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

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();
    }
}
正如您所看到的,第二个连接正确地标记了应用程序名称,但第一个连接只是将“db2jcc_application”作为其名称。但是,当然,只有当我能够修改应用程序代码时,我才能做到这一点——我不能

我发现可以做到这一点的第二种方法是以特定方式在应用程序设置/属性中设置JDBCURL。如果我设置
JDBCURL=jdbc:db2://://:
,而不是简单地在应用程序设置中使用
JDBCURL=jdbc:db2://://:clientProgramName=MyApplName,则应用程序名称将正确盖章。不幸的是,对于我们拥有的某些应用程序,我们需要启动多个JVM进程,但我无法为每个进程分别设置上述设置。我可以为每个进程分别设置JVM参数(例如
-D
参数)


因此,我想看看是否有一种方法可以从外部传递应用程序名,以便JDBC驱动程序将其提取并在连接上盖章。

下面是可用属性的列表,可以通过JVM参数或属性文件进行设置:
.

根据这个链接,您无法以这种方式设置
clientProgramName
属性。

这不是一个环境变量或命令参数,您的程序需要拾取并传递给JDBC吗?@data\u henrik,我只编写了示例程序来说明这一点。生态系统中的应用程序不是由我们编写的。它们是第三方应用程序。我没有他们的密码,因此无法触摸密码。非常感谢。我对链接中的一些事情感到困惑。。。这些要设置的“配置属性”在哪里。我想,如果您处于WAS的上下文中,那么在配置数据源时,您可能有一个位置来设置这些,但是如果您运行的是独立的JVM,您会在哪里设置这些?我会试着四处看看,看看我是否可以得到更多的信息,但如果你知道的手边,请与该信息的答复。这会有很大的帮助。另外,我不明白为什么这个链接没有显示
clientProgramName
。请参阅,其中讨论了如何在数据源属性上设置
clientProgramName
。(抱歉,我不得不将我的评论分成两部分)如链接中所述,您可以在资源文件
DB2JccConfiguration.properties
中设置这些配置属性,该文件必须位于
类路径中,或者在
-Ddb2.jcc.propertiesFile
JVM参数中指定具有任意名称的文件。不幸的是,并非所有可能的jdbc属性都可以以这种方式“外部”设置。谢谢。该链接解释了设置属性的多种方法,包括设置为系统属性。实际上,我可以成功地设置
-Ddb2.jcc.currentSchema=
。唉,正如您所提到的,
clientProgramName
无法设置。将此答案标记为解决方案-即使它没有解决我的问题,但它肯定会结束。
select appl_name from sysibmadm.applications
where client_nname = '<my client ip>' with ur;

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