Pergunta

Eu estou escrevendo um adaptador de recursos JCA. Eu também sou, como eu ir, tentando entender completamente a parte da especificação JCA gerenciamento de conexão. Como um experimento de pensamento, fingir que o único cliente deste adaptador será um cliente Swing Java Application localizado em uma máquina diferente. Também assumem que o adaptador de recursos irá se comunicar com o seu "sistema de informações corporativas" (EIS) através da rede também.

Como eu entendo a especificação JCA, o arquivo .rar é implantado no servidor de aplicativos. O servidor de aplicativos cria implementação da interface ManagedConnectionFactory do arquivo .rar. Em seguida, ele pede que ela produza uma fábrica de conexão, que é o objeto opaco que é implantado para JNDI para o usuário a utilização para a obtenção de uma ligação para o recurso. (No caso de JDBC, a fábrica de conexão é um javax.sql.DataSource.)

É uma exigência que a fábrica de conexões manter uma referência para o ConnectionManager aplicativo-servidor fornecido, o que, por sua vez, é necessário para ser Serializable. Isso faz sentido - para que a fábrica de conexões para ser armazenado no JNDI, ele deve ser serializado, e para que ele para manter uma referência para o ConnectionManager, o ConnectionManager também deve ser serializado. Tão bem, este gráfico do objeto pouco fica instalado na árvore JNDI do cliente do aplicativo.

Este é o lugar onde eu começo a ficar enjoado. o ConnectionManager é - a peça fornecida pelo servidor de aplicativos que é suposto gestão identificador de conexão, partilha, pooling, etc .-- totalmente presente no cliente neste momento? Uma das suas tarefas é criar instâncias ManagedConnection, e uma ManagedConnection não é obrigado a ser Serializable, e as alças de conexão do usuário que vends também não são obrigados a ser Serializable. Isso sugere-me que toda a máquina pool de conexão é enviado atacado para o cliente do aplicativo e recheadas em sua árvore JNDI.

que isso tudo significa que as interações JCA do lado do cliente de bypass do componentry do lado do servidor do servidor de aplicativos? Onde estão os limites de rede na API JCA?

Foi útil?

Solução

que isso tudo significa que JCA interacções do lado do cliente desvio do componentry do lado do servidor o servidor de aplicativos? Onde estão os limites de rede na API JCA?

AFAIK, sim. Haverá um JNDI local eo JNDI local irá retornar ligações locais. Mesmo se for verdade para outro tipo de objeto no JNDI, um tal valor de configuração (env-entry). Claro, se você olhar para cima um EJB, a fábrica retorna um proxy para o bean remoto, mas o JNDI ainda é local para o meu conhecimento.

O cliente incorpora a sua própria piscina. Isso significa, como você apontou, que as conexões obtidos no cliente irá escapar da máquina do lado do servidor.

Ele fica ainda pior quando começamos a brincar com transações distribuídas. Um cliente pode obter uma UserTransaction para iniciar e parar transações distribuídas no lado do cliente (não todos aplicativo. Servidor suporta isso, embora). O contexto da transação será propagar durante chamadas para EJB remoto. Uma transação distribuída pode então conexões do lado do cliente extensão e conexões do lado do servidor.

De acordo com a filosofia J2EE, um aplicativo cliente não deve normalmente usar transações e obter conexão diretamente; ele deve comunicar somente com EJB remoto.

As especificações não são muito claro cenário sobre mais complicado e não há que muitas informações ao redor. As especificações que, por exemplo, não obriga o servidor de aplicativos para expor o UserTransaction para o cliente.

O que eu escrevi aqui se aplica a Glassfish, pelo menos, mas eu não iria contar com uma implementação consistente de tais características em todos os servidores de aplicativos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top