我正在编写一个 JCA 资源适配器。我也在尝试完全理解 JCA 规范的连接管理部分。作为一个思想实验,假设这个适配器的唯一客户端是位于另一台机器上的 Swing Java 应用程序客户端。还假设资源适配器也将通过网络与其“企业信息系统”(EIS) 进行通信。
据我了解 JCA 规范,.rar 文件部署到应用程序服务器。应用程序服务器创建 .rar 文件的 ManagedConnectionFactory 接口实现。然后它要求它生成一个连接工厂,这是部署到 JNDI 的不透明对象,供用户用来获取到资源的连接。(对于 JDBC,连接工厂是 javax.sql.DataSource。)
要求连接工厂保留对应用程序服务器提供的 ConnectionManager 的引用,而后者又需要是可序列化的。这是有道理的——为了将连接工厂存储在 JNDI 中,它必须是可序列化的,并且为了保持对 ConnectionManager 的引用,ConnectionManager 也必须是可序列化的。很好,这个小对象图安装在应用程序客户端的 JNDI 树中。
这是我开始感到不安的地方。ConnectionManager——由应用程序服务器提供的应该处理连接管理、共享、池等的部分——此时是否完全存在于客户端上?它的工作之一是创建 ManagedConnection 实例,ManagedConnection 不需要是可序列化的,它提供的用户连接句柄也不需要是可序列化的。对我来说,这表明整个连接池机制被批发到应用程序客户端并填充到它的 JNDI 树中。
这是否意味着来自客户端的 JCA 交互绕过了应用程序服务器的服务器端组件?JCA API 中的网络边界在哪里?