Conexões Não Compartilháveis e Compartilháveis
O servidor de aplicativos suporta conexões que podem e que não podem ser compartilhadas. Uma conexão não compartilhável não é compartilhada com outros componentes no aplicativo. O componente que utiliza essa conexão tem controle total sobre a conexão.
Acessar um recurso marcado como não compartilhável significa que há um relacionamento de um para um entre a manipulação de conexão, que um componente está utilizando e a conexão física com a qual a manipulação está associada. Esse acesso implica em que cada chamada ao método getConnection retorna um identificador de conexão exclusivamente para o usuário solicitante. Geralmente, é necessário escolher não compartilhável se for fazer coisas na conexão que podem resultar em comportamento inesperado ocorrendo em outro aplicativo que está compartilhando a conexão (por exemplo, alteração inesperada do nível de isolamento).
Marcar um recurso como compartilhável permite uma escalabilidade maior. Em vez de recuperar uma nova conexão física do conjunto de conexões para cada chamada getConnection(), a conexão física (isto é, conexão gerenciada) é compartilhada por meio de diversos identificadores de conexão, contanto que cada solicitação getConnection tenha as mesmas propriedades de conexão. No entanto, compartilhar uma conexão significa que cada usuário não deve fazer nada na conexão que possa alterar seu comportamento e prejudicar um parceiro de compartilhamento (por exemplo, alterar o nível de isolamento). O usuário também não pode codificar um aplicativo que tem lugar no compartilhamento, pois o tempo de execução deve decidir se deve ou não compartilhar uma conexão particular.
Requisitos de Propriedade da Conexão
- Nome JNDI (Java™ Naming and Directory Interface). Não sendo realmente uma propriedade da conexão, este requisito significa simplesmente que é possível apenas compartilhar conexões da mesma origem de dados no mesmo servidor.
- Autenticação de recursos
- Em bancos de dados relacionais:
- Nível de isolamento (corresponde às políticas de intenção de acesso aplicadas aos beans CMP)
- Somente Leitura
- Catálogo
- TypeMap
Para obter informações adicionais sobre como compartilhar uma conexão com um bean CMP, consulte o tópico Compartilhando uma Conexão com um Bean CMP.
- Nome JNDI. Embora não seja realmente uma propriedade da conexão, este requisito significa simplesmente que é possível compartilhar conexões apenas da mesma connection factory no mesmo servidor.
- Autenticação de recursos
As conexões JMS para o Provedor JMS do IBM MQ não podem ser compartilháveis porque são não transacionais e a especificação Java™ EE Connector Architecture (JCA) permite somente que recursos transacionais sejam compartilháveis. Se o res-sharing-scope for configurado como compartilhável em uma referência de recurso JMS, a configuração será ignorada e as conexões não compartilháveis serão usadas. No entanto, as sessões JMS do MQ são transacionais e podem ser compartilháveis. As sessões JMS são compartilháveis por padrão e o APAR PK59605 fornece a capacidade de especificar sessões não compartilháveis.
As conexões JMS do Provedor de Sistema de Mensagens Padrão são diferentes. Com o Provedor de Sistema de Mensagens Padrão, as conexões podem ser compartilháveis. As sessões, por outro lado, não são gerenciadas por um conjunto de conexões e, portanto, não podem ser compartilháveis ou não compartilháveis.
Compartilhando uma Conexão com um Bean CMP
- Compartilhando uma conexão entre beans ou métodos CMP
Quando todos os métodos do bean CMP utilizam a mesma intenção de acesso, eles compartilham a mesma conexão física. Um critério diferente de intenção de acesso aciona a alocação de uma conexão física diferente. Por exemplo, um bean CMP possui dois métodos; o método 1 é associado à intenção wsPessimisticUpdate, enquanto o método 2 possui a intenção de acesso wsOptimisticUpdate. Os métodos 1 e 2 não podem compartilhar a mesma conexão física em uma transação. Em outras palavras, uma origem de dados XA é requerida para ser executada em uma transação global.
É possível que haja alguns congelamentos em um banco de dados, se ambos os métodos tentarem acessar a mesma tabela. Portanto, o compartilhamento de uma conexão será determinado pelas intenções de acesso definidas nos métodos CMP.
- Compartilhando uma conexão entre os beans CMP e BMP
Lembre-se de primeiro verificar se os métodos getConnection do bean BMP e do bean CMP configuram as mesmas propriedades da conexão. Para corresponder ao tipo de autenticação do recurso de bean CMP, defina o tipo de autenticação do recurso de bean BMP como gerenciado por contêiner, que é designado no descritor de implementação como res-auth = Container.
Além disso, utilize uma das opções a seguir para assegurar o compartilhamento de conexões entre os tipos de bean:- Definir a mesma intenção de acesso nos métodos dos beans CMP e BMP. Como os dois utilizam a mesma intenção de acesso, eles compartilham a mesma conexão física. A vantagem em usar esta opção é que o backend é transparente para um bean BMP. Entretanto, esta opção também torna o BMP não portável, visto que utiliza a API estendida do WebSphere para identificar o nível de isolamento. Para obter mais informações, consulte o exemplo de código no tópico, Exemplo: Acessando dados usando APIs estendidas pela IBM® para compartilhar conexões entre beans de persistência gerenciada por contêiner e gerenciada por bean.
- Determine o nível de isolamento utilizado pela intenção de acesso em um método de bean CMP e, em seguida, utilize o nível de isolamento correspondente especificado na referência do recurso para consultar uma origem de dados e uma conexão. Esta opção é mais de um processo manual, e o nível de isolamento pode ser diferente de banco de dados para banco de dados. Para obter informações adicionais, consulte o nível de isolamento e a tabela de mapeamento de intenção de acesso no tópico, Níveis de Isolamento de Intenção de Acesso e Bloqueios de Atualização, e o tópico, Nível de Isolamento e Referência de Recurso.
- Compartilhando uma conexão entre o CMP e um aplicativo JDBC que é usado por um servlet ou bean de sessão Determine o nível de isolamento utilizado pela intenção de acesso em um método de bean CMP e, em seguida, utilize o nível de isolamento correspondente especificado na referência do recurso para consultar uma origem de dados e uma conexão. Para obter informações adicionais, consulte o tópico Níveis de Isolamento de Intenção de Acesso e o tópico Nível de Isolamento e Referência de Recurso.
Fatores que Determinam o Compartilhamento
A listagem apresentada aqui não é exaustiva. O produto pode ou não compartilhar conexões sob diferentes circunstâncias.- Apenas as conexões adquiridas com a mesma referência de recurso (resource-ref), que especifica res-sharing-scope como compartilhável, são candidatas ao compartilhamento. As propriedades de referência de recurso de res-sharing-scope e res-auth e o nível de
isolamento da extensão IBM ajudam a
determinar se é possível compartilhar uma conexão. O nível de isolamento da extensão IBM é
armazenado no arquivo de extensão do descritor de implementação IBM; por exemplo, ibm-ejb-jar-ext.xmi.
Configurações suportadas: Para arquivos de extensão e de ligação IBM, a extensão do nome do arquivo .xmi ou .xml é diferente dependendo de você estar utilizando um aplicativo pré-Java EE 5 ou um módulo ou um aplicativo ou módulo Java EE 5 ou posterior. Um arquivo de extensão ou de ligação IBM é denominado ibm-*-ext.xmi ou ibm-*-bnd.xmi em que * é o tipo de arquivo de extensão ou de ligação como app, aplicativo, ejb-jar ou web. As seguintes condições se aplicam:
No entanto, um módulo Java EE 5 ou posterior pode existir dentro de um aplicativo que inclui arquivos pré-Java EE 5 e usa a extensão do nome do arquivo .xmi.
Os arquivos ibm-webservices-ext.xmi, ibm-webservices-bnd.xmi, ibm-webservicesclient-bnd.xmi, ibm-webservicesclient-ext.xmi, e ibm-portlet-ext.xmi continuam a usar as extensões de arquivo .xmi.
sptcfg - Somente é possível compartilhar conexões que sejam pedidas com as mesmas propriedades.
- O compartilhamento de conexão ocorre somente entre instâncias de conexão diferentes se elas estiverem em uma transação (iniciada por contêiner ou pelo usuário).
- O compartilhamento de conexão ocorre apenas em um limite de compartilhamento. Os limites de compartilhamento Current incluem Transactions e LocalTransactionContainment (LTC).
- Regras de compartilhamento de conexão em um escopo LTC:
- Para conexões compartilhadas, somente Reutilização de Conexão é permitida dentro
de uma única instância de componente. A reutilização da conexão ocorre quando as seguintes ações
são tomadas com uma conexão: get, use, commit/rollback, close; get, use,
commit/rollback, close. Observe que se você utilizar o resolution-control LTC de ContainerAtBoundary,
não será necessário start/commit porque essa ação é manipulada pelo contêiner.
A conexão retornada no segundo get é a mesma retornada no primeiro get (se as mesmas propriedades forem utilizadas). Como a utilização da conexão é serial, apenas uma manipulação de conexão para a conexão física de base é utilizada por vez, de modo que o compartilhamento de conexão real não ocorre. O termo "reutilização" é mais exato.
Mais importante, o limite LocalTransactionContainment ligando as ações get não está completo; nenhum método cleanUp() é chamado no objeto ManagedConnection. Portanto, a segunda ação get herda todas as propriedades de conexão definidas durante a primeira chamada getConnection().
- Para conexões compartilhadas, somente Reutilização de Conexão é permitida dentro
de uma única instância de componente. A reutilização da conexão ocorre quando as seguintes ações
são tomadas com uma conexão: get, use, commit/rollback, close; get, use,
commit/rollback, close. Observe que se você utilizar o resolution-control LTC de ContainerAtBoundary,
não será necessário start/commit porque essa ação é manipulada pelo contêiner.
- As conexões compartilháveis entre transações (sejam elas transações gerenciadas por contêiner
(CMT), transações gerenciadas por bean (BMT) ou transações LTC) seguem estas
regras de armazenamento em cache:
- Em geral, a definição de propriedades em conexões compartilháveis não é permitida porque um usuário ou um identificador de conexão pode não antecipar uma alteração feita por outro identificador de conexão. Essa limitação faz parte do padrão Java Platform, Enterprise Edition (Java EE).
- Usuários gerais de adaptadores de recursos podem definir as propriedades de conexão
na chamada getConnection() do connection factory transmitindo-as em um ConnectionSpec.
Entretanto, não é garantido que as propriedades definidas na conexão durante uma transação sejam as mesmas quando utilizadas na próxima transação. Como não é válido compartilhar conexões fora de um escopo de compartilhamento, os identificadores das conexões são movidos para fora da conexão física à qual eles estão associados atualmente quando uma transação é finalizada. Essa conexão física é retornada ao pool de conexão livres. As conexões são limpas antes de irem para o conjunto livre. Na próxima vez que o identificador for utilizado, ele será associado automaticamente a uma conexão adequada. A adequação é baseada nas informações de login de segurança, nas propriedades de conexão e (para a API JDBC) no nível de isolamento especificado na referência de recurso estendido, transmitida no pedido original que retornou o identificador atual. Quaisquer propriedades definidas na conexão depois que ela foi recuperada são perdidas.
- Para usuários JDBC, o servidor de aplicativos fornece uma extensão para ativar a
transmissão das propriedades de conexão utilizando ConnectionSpec.
Tome cuidado ao definir propriedades e ao compartilhar conexões em um escopo de transação local. Certifique-se de que outros componentes com os quais a conexão é compartilhada estejam esperando o comportamento resultante de suas definições.
- Não é possível definir o nível de isolamento em uma conexão que pode ser compartilhada para a API do JDBC utilizando um adaptador de recursos relacional em uma transação global. O produto fornece uma extensão à referência de recurso para permitir especificar o nível de isolamento. Se seu aplicativo exigir o uso de vários níveis de isolamento, crie várias referências de recurso e mapeie-as para a mesma origem de dados ou connection factory.
Compartilhamento Máximo de Conexões
Para maximizar as oportunidades de compartilhamento de conexão de um aplicativo, assegure-se de que cada componente tenha o atributo Resolvedor de LTC (Local Transaction Containment) configurado como ContainerAtBoundary. Essa configuração especifica que o contêiner do componente e não o código do aplicativo resolve todas as RMLTs (Resource Manager Local Transactions) do escopo da LTC. O contêiner inicia uma RMLT quando uma conexão é utilizada primeiramente dentro do escopo de LTC e a conclui automaticamente no final do escopo de LTC.
Consulte o tópico, Configurando Atributos de Implementação Transacional, para obter instruções sobre a configuração do controle de resolução da transação e outros atributos.
Violações de Compartilhamento de Conexões
- O número de manipulações de conexões associadas à conexão gerenciada é maior que um.
- A conexão gerenciada é associada a uma transação, local ou XA.
O componente e o tempo de execução J2C poderão precisar detectar essa exceção de violação de compartilhamento, dependendo de quando e como a conexão gerenciada se torna não compartilhável. Se a conexão gerenciada tornar-se não compartilhável devido a uma operação por uma manipulação de conexão (por exemplo, o nível de isolamento é alterado), o componente precisa processar a exceção. Se a conexão gerenciada se tornar não compartilhável sem ser reconhecida pelo servidor de aplicativos (devido a uma interação de componente com o identificador de conexão), o adaptador de recursos poderá rejeitar a criação de um identificador de conexão emitindo a exceção de violação de compartilhamento.