隐式设置客户机信息
如果跟踪数据库中的客户机信息,那么可以选择两种方法中的一种来将 WebSphere® Application Server 客户机数据传递到数据库连接。
- 您不想在应用程序中使用专有的 API,或
- 在您无法使用专有的 API 来设置关于数据库连接的客户机信息的情况下,应用程序使用容器管理的持久性 (CMP)。
WebSphere Application Server 跟踪工具提供隐式地设置客户机信息的能力。您可以指定下面两个特定跟踪组中的某一个来启用或禁用客户机信息传递:WAS.clientinfo 跟踪 或 WAS.clientinfopluslogging 跟踪。
可能的运行时方案
- 连接共享
在连接共享的情况下,WebSphere Application Server 仅在第一个获取的连接句柄上设置客户机信息。如果启用了连接共享并且调用了两个或更多 getConnection 方法(导致同一个连接上有两个句柄),那么只有第一个 getConnection 调用使得客户机信息传递至后端数据库。此方案不适用于显式传递客户机信息的过程;在此类情况下,无论是否启用了连接共享,每个 setClientInformation 方法都会 被重放到数据库中。
- Implicit/explicit co-existence当同时使用显式和隐式过程来重放客户机信息时,会将显式地设置的数据和隐式地设置的数据组合起来,通常优先使用显式设置。例如,如果应用程序将客户机记帐信息设置为“myAccountingInfo”,那么传递到后端数据库的最终的 accountingInfo 字符串如以下样本代码所示:
其中 000325 是线程标识,而 WSRdbManagedConnectionImpl@1234 是 WebSphere 连接实例。000325_WSRdbManagedConnectionImpl@1234_myAccountingInfo:
- 重新设置客户机信息
当配置 Application Server 以传递客户机信息时且仅当 WAS.clientinfo 和 WAS.clientinfopluslogging 跟踪机制被禁用(即 WAS.clientinfo=all=disabled:WAS.clientinfopluslogging=all=disabled)时,如果连接被返回到池中,那么一定会重新设置客户机信息。
但是,在显式情况下,仅当应用程序在 WSConnection 连接上发出 setClientInformation(null) 时,才会执行重新设置操作。
WAS.clientinfo 跟踪
缺省情况下,禁用隐式机制。可以动态地启用此机制而无需停止和启动应用程序服务器,或者可以通过设置 WebSphere Application Server 跟踪组 WAS.clientinfo=all=enabled 来静态地启用此机制。
在数据库连接上隐式地收集和设置的信息包括用户名、用户位置和应用程序名。
在数据库连接上隐式地收集和设置的信息包括线程标识、用户名、用户位置和应用程序名称。
thread ID
8 个字符的十六进制值,它标识对 WebSphere Application Server 内应用程序请求的处理进行控制的 Java 线程。此标识显示在跟踪头中。
- user name
- 发出应用程序请求的用户名。系统将收集此选项并将它传递到后端数据库(受支持时)。此处的信息是通过调用 WSSecurityHelper.getFirstCaller 方法来收集的。
- user location
- 用户位置的名称,格式为 cell:node:server。系统将收集此选项并将它传递到后端数据库(适当的时候)。此处的信息是通过调用 WSSecurityHelper.getFirstServer 方法来收集的。
- application name
- 运行的应用程序的名称。此值是从 Java EE Name 对象调用 getApplication 方法的输出。不管全局安全性如何设置,都会收集此值。
WAS.clientinfopluslogging 跟踪
调试数据库问题(如死锁)时,有一组信息可能有助于调试。通常通过启用 WebSphere Relational Resource Adapter (RRA) 跟踪和 Enterprise JavaBeans (EJB) 容器跟踪来获取这些信息。但是,在某些情况下,当再次发生指定问题时,计时就会不正常。跟踪信息过多会改变应用程序的行为(如更改计时),并且该问题可能不再发生。
- 运行的 SQL 字符串(如,select userId from tabl1 where id=? for update)。
- 事务的启动、提交和回滚。
- EJB 调用(如 Create、Remove 和 findByPrimaryKey)。