我写一个JCA资源适配器。我也是,我走了,试图充分了解JCA规范的连接管理部分。作为一个思想实验,假装该适配器的唯一客户端将位于不同的机器上的一个Swing的Java应用程序客户端。还假设资源适配器将以其“企业信息系统”(EIS)在网络以及通信。

据我所知的JCA说明书中,.rar文件部署到应用程序服务器。应用服务器创建.rar文件的实现的ManagedConnectionFactory接口。然后它要求它来产生一个连接工厂,这是部署到JNDI供用户使用以获得对资源的连接的不透明对象。 (在JDBC的情况下,连接工厂是一个javax.sql.DataSource中。)

它是连接工厂保留到应用程序服务器提供的的ConnectionManager,这反过来,需要是可串行化的基准的要求。这是有道理的 - 为了存储在JNDI连接工厂,它必须是序列化的,并且为了它保持到的ConnectionManager参考,也的ConnectionManager必须是可序列化。如此精细,这个小对象图被安装在应用程序客户端的JNDI树。

这是我开始变得动荡。是的ConnectionManager - 由应用服务器提供的一块应该处理连接管理,共享池,等 - 全部出现在这一点上,客户端上?它的一个工作是创建的ManagedConnection实例,并且可序列化一个的ManagedConnection不是必需的,并且用户连接处理它VENDS也不要被序列化要求。这表明,我认为整个连接池机器出厂批发到应用程序客户端塞到其JNDI树。

,这一切意味着从客户端侧旁通的应用服务器的服务器侧组件部分JCA相互作用?哪里有JCA API中的网络边界?

有帮助吗?

解决方案

  

这一切意味着,JCA   从客户端的交互   绕过的服务器端组件部分   应用服务器?哪里有   的JCA API在网络边界?

AFAIK,是的。将会有一个本地JNDI和本地JNDI将返回本地连接。相同的,如果真在JNDI其他种类的对象,这样的配置值(env-entry)。当然,如果你看看一个EJB,工厂返回的代理远程豆,但JNDI仍然是当地的,据我所知。

在客户端中嵌入它自己的池。这意味着,正如你指出的,在客户端获取的连接将难逃服务器端的机器。

当我们开始与分布式事务中发挥它变得更糟。客户可以获取UserTransaction启动和停止在客户端的分布式事务(不是所有的应用程序。服务器支持这一点,虽然)。事务上下文将在调用远程EJB进行传播。然后,分布式事务可以跨越客户端连接和服务器端连接。

根据该J2EE理念,应用程序客户端通常不应使用交易和直接获得连接;它应该只与远程EJB通信。

在规格是不是更复杂的情况非常清晰,而且周围有没有那么多的信息。该规范就比如不强制要求应用服务器暴露UserTransaction到客户端。

我写到这里至少适用于GlassFish的,但我不会依靠始终如一的贯彻在所有的应用服务器这样的功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top