我们正在使用 WLS 服务器,在其上配置数据源(DS)和托管服务器。
出于故障转移的原因,我们的主要应用程序部署在两个独立的托管服务器上(我们称它们为应用程序_1和应用程序) - 但这两台服务器都使用相同的数据源。
该数据源是 Oracle DB 的 JDBC 数据源。
+-----------------------------+
| WLS Domain |
|-----------------------------|
|+------------+ +------------+|
|| | | ||
|| app_1 | | app_2 ||
|| | | ||
|+-----|------+ +-----|------+|
|+-----v--------------v------+|
|| Data Source ||
|+-------------|-------------+|
+--------------|--------------+
|
+-----V-----+
| | session1, session2, session3, ...
| ORACLE DB |
| | ~is session1 from app_1 or app_2?
+-----------+
现在我们的问题是:
- 我们希望能够在数据库端识别某个数据库会话源自哪个托管服务器(即应用程序_1或者应用程序)。
问题是:
由于两个托管服务器都访问同一个数据源,因此(到目前为止)在 DB 上打开的 DB 会话是无法区分的。这个问题可以解决吗?或者 WLS 托管服务器使用域配置数据源的方式是否只是以一种让托管服务器对 DB 后端完全不可见的方式设置的?
我们已经尝试使用“init SQL”机制将会话元信息添加到 Oracle DB 会话中。但由于数据源是以与服务器无关的方式设置的,因此 init SQL 不能包含有关最终将使用它的托管服务器的任何信息。
答案1
如果您的托管服务器位于同一台主机上,我相信没有本地方法可以找出这一点。 如果它们位于不同的主机上,您可以使用 Oracle 端 v$session 上的 machine 列来识别它的来源。
另一个选择是使用一些监控/分析工具。我不确定哪些工具会告诉您数据库上的会话 ID,但它们肯定可以告诉您在数据库上执行了什么操作。我使用过的可以执行此操作的工具有:- 安装了 JVM Diagnostics 的 Oracle Enterprise Manager;- CA IntroScope(我相信现在称为 CA APM);- Compuware Dynatrace;- AppDynamics。
我确信还有很多。