如何让我的客户端应用程序名称显示在 java 的 zos 上?
Posted
技术标签:
【中文标题】如何让我的客户端应用程序名称显示在 java 的 zos 上?【英文标题】:How can I get my client application name to show up on zos from java? 【发布时间】:2013-03-22 16:24:25 【问题描述】:This page 说我可以将“clientProgramName”作为连接参数之一,它将作为相关 ID 显示在 db2 上。
我引用:
在一个 java.util.Properties 值中的 info 参数中 DriverManager.getConnection 调用。
我们正在使用 z/OS。 DB2 的 z/OS 版本在这类东西方面似乎受到了更多限制。
在连接调用的参数哈希中设置客户端程序名称似乎没有效果,当我像这样将它放在连接字符串 url 的末尾时(它也说我可以这样做):
jdbc:db2://localhost:5036/DBNAME:clientProgramName=myprog
我收到此错误:
[jcc][10165][10051][4.11.77] Invalid database URL syntax:
jdbc:db2://localhost:5036/DBNAME:clientProgramName=myprog.
ERRORCODE=-4461, SQLSTATE=42815
有没有办法将自定义用户字符串发送到 z/OS db2 服务器,以便在服务器上识别连接?
【问题讨论】:
【参考方案1】:根据您用于连接 DB2 的方法,您可以使用:
Class.forName
Class.forName("com.ibm.db2.jcc.DB2Driver");
Properties props = new Properties();
props.put("user", "scott");
props.put("password", "tiger");
props.put("clientProgramName", "My Program 1");
Connection conn = DriverManager.getConnection(
"jdbc:db2://localhost:50000/sample", props);
数据源
Connection conn = null;
DB2SimpleDataSource ds = new com.ibm.db2.jcc.DB2SimpleDataSource();
ds.setDriverType(4);
ds.setServerName("localhost");
ds.setPortNumber(50000);
ds.setDatabaseName("sample");
ds.setUser("scott");
ds.setPassword("tiger");
ds.setClientProgramName("My Application 2");
conn = ds.getConnection();
我为此写了一篇博客:http://angocadb2.blogspot.fr/2012/12/nombre-de-la-conexion-java-en-db2-java.html(使用您最喜欢的翻译器,因为它是西班牙语)
【讨论】:
我喜欢你的回答,我同意技术,但是当我对 zos 运行这个(第一个)时,它什么也没做。 嗯,没错,我是为 LUW 写的,我不使用 z/os。 :( 这些该死的平台差异! IBM 需要让每个人都团结起来,弄清楚如何让 DB2 在任何地方都能以同样的方式工作。 :p 据我所知,db2 for zos 和 db2 for linux 是由彼此完全不相关的小组编写的,它们完全相似的事实是一个意外。【参考方案2】:根据这个page on Info Center,DB2Connection
接口上应该有一个功能可以让你改变你的应用标识符,setDB2ClientApplicationInformation
(我不能直接链接,因为没有锚点,随便搜索那个名字)。
您可以使用CURRENT CLIENT_APPLNAME
特殊寄存器拉取当前应用程序ID:
SELECT CURRENT CLIENT_APPLNAME FROM SYSIBM.SYSDUMMY1
还有一些其他方法可以设置上面列出的信息中心链接中列出的寄存器,包括WLM_SET_CLIENT_INFO
函数。
【讨论】:
非常酷,但是如何转换连接 = DriverManager.getConnection(dburl, props);结果到 db2connection 对象? 老实说,我不确定,我在.net 商店。但是,根据this page,如果您使用的是用于 DB2 的 JDBC 4.0 版本驱动程序,则可以改用java.sql.Connection.setClientInfo(str)
。我不确定这是否对你有帮助。
好的,我去看看,谢谢。我没有意识到你不在java世界中。感谢您的帮助。【参考方案3】:
我不是 DB2 专家,但我是查看由 DB2 for z/OS 生成的跟踪记录,其中包含“相关 ID”(跟踪记录的字段 QWHCCV in the product section correlation header)与我使用 setClientProgramName(我的 Java 应用程序中的 DB2 数据源的方法)设置的值相匹配。
我的 Java 应用程序类似于 AngocA 给出的“DataSource”示例,类似于 IBM 技术说明 'The name of a DB2 JDBC application appears as "db2jcc_application". How to change it?' 中引用的代码。这个 Java 应用程序在我的 Windows PC 上运行,连接到 DB2 for z/OS。它还 - 这很重要,取决于您启动了哪些 DB2 跟踪(在下面讨论) - 实际上在连接后会做一些事情。例如:
pstmt=conn.prepareStatement("SELECT ... ");
rset=pstmt.executeQuery();
对于 AngocA 给出的第一个示例,当您说“它什么也没做”时:您希望看到什么?您到底在哪里寻找,您在寻找什么,您使用什么方法(或工具)来寻找它?
例如,如果您正在查找包含与您的相关 ID 匹配的 QWHCCV 字段值的 SMF 类型 100、101 或 102 记录(由 DB2 跟踪生成),那么(如果这很明显,请教您如何吃鸡蛋),在 DB2 for z/OS 上,您需要启动生成这些记录的 DB2 跟踪(使用 DB2 命令START TRACE)。否则,将什么都看不到(“它什么都不做”)。请注意,并非所有由应用程序(例如上面描述的 Java 应用程序)生成的 DB2 跟踪记录都包含您的相关 ID;在处理的某个点之前,此类记录的相关 ID 将具有不同的值(但这已经离题了,无论如何,就我所描述的而言)。
警告:尝试在“沙盒”(开发或测试)DB2 系统而不是生产 DB2 系统上启动 DB2 跟踪。 DB2 跟踪可能会产生大量数据。
您还会在一些 DB2 V10 消息(例如 DSNL027I)的消息文本中看到“THREAD-INFO="之后的相关 ID。
【讨论】:
我有一些 dba 朋友在我工作的地方,我让他们查看大型机,看看他们是否看到我更改的连接和关联 ID。他们可以识别我的连接,因为它来自我的开发机器。当它进入 prod 时,这无济于事。 当我说它什么都不做时,我的意思是他们看起来并没有看到相关名称已更改为我在应用程序中设置的名称。 您的 DBA 朋友究竟在哪里以及如何查看 z/OS 上的相关 ID?例如,DB2 命令 DISPLAY THREAD 输出消息 DSNV437I?或者,如果他们正在查看 DB2 跟踪记录中的 QWHCCV 字段:具体来说是哪个 IFCID?他们目前看到的来自您的开发机器的连接的关联 ID 是什么?【参考方案4】:对我来说,我必须在每个连接参数后添加一个分号。
EX 适用于您的情况: jdbc:db2://localhost:5036/DBNAME:clientProgramName=myprog;
EX 有多个参数: jdbc:db2://localhost:5036/DBNAME:clientProgramName=myprog;enableSysplexWLB=true;blah=true;
【讨论】:
以上是关于如何让我的客户端应用程序名称显示在 java 的 zos 上?的主要内容,如果未能解决你的问题,请参考以下文章
对于任何文档类型,如何让我的应用程序显示在 iOS 上的“打开方式...”菜单中?