我们正在使用 WLS 服务器,我们在其上配置数据源 (DS) 和托管服务器。
出于故障转移的原因,我们的主应用程序被部署在两个独立的托管服务器上(我们称它们为app_1和app_2)——但是这两个服务器都使用相同的数据源。
数据源是 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?
+-----------+
现在我们的问题:
- 我们希望能够在数据库端识别某个数据库会话源自哪个托管服务器(即app_1或app_2)。
问题是:
由于两个托管服务器都访问相同的数据源,因此在数据库上打开的数据库会话(到目前为止)无法区分。这是一个可以解决的问题吗?还是 WLS 托管服务器使用域配置数据源的方式只是设置为使托管服务器对数据库后端完全不可见?
我们已经尝试使用“init SQL”机制将会话元信息添加到 Oracle DB 会话。但是由于数据源是以与服务器无关的方式设置的,因此 init SQL 不能包含有关最终将使用它的托管服务器的任何信息。
如果您的托管服务器位于同一台主机上,我相信没有本地方法可以找到它。如果它们在不同的主机上,您可以使用 Oracle 端 v$session 上的 machine 列来识别它的来源。
另一种选择是使用一些监控/分析工具。我不确定哪些会告诉你数据库上的会话 id,但他们肯定可以告诉你在数据库上做了什么。我使用的可以执行此操作的工具有: - 安装了 JVM 诊断的 Oracle 企业管理器;- CA IntroScope(我相信现在称为 CA APM);- Compuware 动态跟踪;- 应用动力学。
我敢肯定还有很多。