Ciclo de Vida da Conexão

Um objeto ManagedConnection está sempre em um de três estados: DoesNotExist, InFreePool ou InUse.

Antes que uma conexão seja criada, ela precisa estar no estado DoesNotExist. Depois que uma conexão é criada, ela pode estar no estado InUse ou InFreePool, dependendo de se ela está alocada a um aplicativo.

Entre esses três estados há transições. Essas transições são controladas por condições de guarda. Uma condição de guarda é uma na qual true indica quando você leva a transição para outro estado válido. Por exemplo, você pode fazer a transição do estado InFreePool para o estado InUse somente se:
  • o aplicativo chamou a origem de dados ou o método getConnection() da connection factory (a condição getConnection)
  • uma conexão livre estiver disponível no conjunto com propriedades correspondentes (a condição freeConnectionAvailable)
  • e uma das duas condições a seguir for verdadeira:
    • o pedido getConnection() está em nome de uma referência de recurso que está marcada como não compartilhável
    • o pedido getConnection() está em nome de uma referência de recurso que está marcada como compartilhável mas nenhuma conexão compartilhável em uso tem as mesmas propriedades.
Esta é a descrição dessa transição:
InFreePool > InUse:
getConnection AND
freeConnectionAvailable AND
NOT(shareableConnectionAvailable)
Eis uma lista de condições de guarda e suas descrições.
Tabela 1. Condições de Guarda. Eis uma lista de condições de guarda e suas descrições.
Condition Description
ageTimeoutExpired A conexão é mais antiga que seu valor de ageTimeout.
close O aplicativo chama o método close no objeto Connection.
fatalErrorNotification Uma conexão acaba de ter um erro fatal.
freeConnectionAvailable Uma conexão com propriedades correspondentes está disponível no conjunto livre.
getConnection O aplicativo chama o método getConnection em uma origem de dados ou objeto da connection factory.
markedStale A conexão está marcada como stale, em geral em resposta a uma notificação de erro fatal.
noOtherReferences Há somente uma manipulação de conexão para a conexão gerenciada e o Serviço de Transação não está mantendo uma referência à conexão gerenciada.
noTx Nenhuma transação está em efeito.
poolSizeGTMin O tamanho do pool de conexão é maior que o tamanho mínimo do conjunto (número mínimo de conexões)
poolSizeLTMax O tamanho do conjunto é menor que o tamanho máximo do conjunto (número máximo de conexões)
shareableConnectionAvailable O pedido getConnection() é para uma conexão compartilhável e uma com propriedades correspondentes está em uso e disponível para compartilhamento.
TxEnds A transação foi encerrada.
unshareableConnectionRequest O pedido getConnection() é para uma conexão não compartilhável.
unusedTimeoutExpired A conexão está no conjunto livre e não está em uso além de seu valor de tempo limite sem utilização.

Obtendo Conexões

O primeiro conjunto de transições cobertas são aquelas nas quais o aplicativo pede uma conexão de uma origem de dados ou de uma connection factory. Em alguns desses cenários, resulta uma nova conexão ao banco de dados. Em outros, a conexão pode ser recuperada do pool de conexão ou compartilhada com outro pedido para uma conexão.
Toda conexão começa seu ciclo de vida no estado DoesNotExist. Quando um servidor de aplicativos é iniciado, o pool de conexão não existe. Portanto, não existem conexões. A primeira conexão não é criada até que um aplicativo peça sua primeira conexão. Conexões adicionais são criadas conforme necessário, de acordo com a condição de guarda.
getConnection AND
NOT(freeConnectionAvailable) AND
poolSizeLTMax AND
(NOT(shareableConnectionAvailable) OR
unshareableConnectionRequest)
Esta transição especifica que um objeto da conexão não é criado a menos que as seguintes condições ocorram:
  • O aplicativo chama o método getConnection() na origem de dados ou connection factory
  • Nenhuma conexão está disponível no conjunto livre (NOT(freeConnectionAvailable))
  • O tamanho do conjunto é menor que o tamanho máximo do conjunto (poolSizeLTMax)
  • Se o pedido for para uma conexão compartilhável e não houver uma conexão compartilhável já em uso com as mesmas propriedades de compartilhamento (NOT(shareableConnectionAvailable)) OU se o pedido for para uma conexão não compartilhável (unshareableConnectionRequest)

Todas as conexões começam no estado DoesNotExist e somente são criadas quando o aplicativo pedir uma conexão. O conjunto cresce de 0 até o número máximo de conexões conforme os aplicativos pedem novas conexões. O conjunto não é criado com o número mínimo de conexões quando o servidor é iniciado.

Se o pedido for para uma conexão compartilhável e uma conexão com as mesmas propriedades de compartilhamento já estiver em uso pelo aplicativo, a conexão é compartilhada por dois ou mais pedidos para uma conexão. Neste caso, não é criada uma nova conexão. Para usuários da API de JDBC essas propriedades de compartilhamento são, na maior parte dos casos, id do usuário/senha e contexto da transação; para usuários da CCI (Common Client Interface) do Adaptador de Recurso elas, em geral, são ConnectionSpec, Subject e contexto da transação.

A transição do estado InFreePool para o estado InUse é a transição mais comum quando o aplicativo pede uma conexão do conjunto.
InFreePool > InUse:
getConnection AND
freeConnectionAvailable AND
(unshareableConnectionRequest OR
NOT(shareableConnectionAvailable))
Esta transição declara que uma conexão é colocada em uso a partir do conjunto livre se:
  • o aplicativo tiver emitido uma chamada getConnection()
  • uma conexão estiver disponível para uso no pool de conexão (freeConnectionAvailable),
  • e uma das seguintes condições for verdadeira:
    • o pedido é para uma conexão não compartilhável (unsharableConnectionRequest)
    • nenhuma conexão com as mesmas propriedades de compartilhamento já está em uso na transação. (NOT(sharableConnectionAvailable)).

Qualquer pedido de conexão que uma conexão do conjunto livre possa preencher não resulta em uma nova conexão ao banco de dados. Portanto, se nunca houve mais que uma conexão utilizada ao mesmo tempo do conjunto por qualquer número de aplicativos, o conjunto nunca crescerá além de um tamanho de um. Esse número pode ser menor que o número mínimo de conexões especificado para o conjunto. Uma maneira pela qual um conjunto cresce até o número mínimo de conexões é se o aplicativo tiver vários pedidos simultâneos para conexões que devam resultar em uma conexão recém-criada.

A idéia de compartilhamento de conexões é vista na transição do estado InUse.
InUse>InUse:
getConnection AND
ShareableConnectionAvailable

Esta transição indica que, se um aplicativo solicitar uma conexão compartilhável (getConnection) com as mesmas propriedades de compartilhamento de uma conexão que já está em uso (ShareableConnectionAvailable), a conexão existente será compartilhada.

O mesmo usuário (nome do usuário e senha, ou assunto, dependendo da opção de autenticação) podem compartilhar conexões mas somente dentro da mesma transação e somente quando todas as propriedades de compartilhamento coincidirem. Para conexões JDBC, essas propriedades incluem o nível de isolamento, que é configurável na referência de recursos (extensão IBM® WebSphere) para padrão de origem de dados. Para uma conexão de depósito de informações do provedor do adaptador de recursos, essas propriedades incluem aquelas especificadas no objeto ConnectionSpec. Como uma transação normalmente é associada a um único encadeamento, você nunca deve compartilhar conexões entre encadeamentos.
Nota: É possível ver a mesma conexão em vários encadeamentos ao mesmo tempo, mas esta situação é um estado de erro causado, em geral, por um erro de programação do aplicativo.

Retornando Conexões

Todas as transições discutidas anteriormente envolvem a obtenção de uma conexão para uso pelo aplicativo. Com esse objetivo, as transições resultam no fechamento de uma conexão e seu retorno ao pool livre ou sua destruição. Os aplicativos devem fechar explicitamente as conexões (nota: a conexão que o usuário obtém de volta é, na verdade, uma manipulação de conexão) chamando close() no objeto da conexão. Na maioria dos casos, esta ação resulta na seguinte transição:
InUse>InFreePool:
(close AND
noOtherReferences AND
NoTx AND
UnshareableConnection)
OR
(ShareableConnection AND
TxEnds)
As condições que causam a transição do estado InUse são:
  • Se o aplicativo ou o contêiner chamar close() (produzindo a condição close) e não houver referências (a condição noOtherReferences) seja pelo aplicativo (na condição de compartilhamento de aplicativo) ou pelo gerenciador de transações (na condição NoTx - significando que o gerenciador de transações mantém uma referência quando a conexão está envolvida em uma transação), o objeto da conexão retorna ao pool livre.
  • Se a conexão estava envolvida em uma transação mas o gerenciador de transações finalizar a transação (a condição txEnds), e a conexão era uma conexão compartilhável (a condição ShareableConnection), a conexão finaliza e retorna ao conjunto.

Quando o aplicativo chama close() em uma conexão, ele está retornando a conexão ao pool de conexões livres; ele não está fechando a conexão ao data store. Quando o aplicativo chama close() em uma conexão compartilhada atualmente, a conexão não é retornada ao conjunto livre. Somente depois que o aplicativo eliminar a última referência à conexão e a transação estiver encerrada é que a conexão será retornada ao conjunto. Os aplicativos que utilizam conexões não compartilháveis devem tomar o cuidado de fechar as conexões em tampo hábil. Se isso não for feito, o pool de conexão pode ser esgotado, tornando impossível a qualquer aplicativo em execução no servidor obter uma conexão.

Quando o aplicativo chama close() em uma conexão envolvida em uma transação, a conexão não é retornada ao conjunto livre. Como o gerenciador de transação também precisa manter uma referência ao objeto da conexão, a conexão não pode retornar ao conjunto livre até que a transação termine. Depois que uma conexão é envolvida em uma transação, não é possível utilizá-la em nenhuma outra transação por nenhum outro aplicativo até após a conclusão da transação.

Existe um caso em que a chamada de close() por um aplicativo pode resultar no fechamento da conexão ao data store, ignorando o retorno da conexão ao conjunto. Essa situação ocorre se uma das conexões no conjunto for considerada stale. Uma conexão é considerada stale se não for mais possível utilizá-la para entrar em contato com o data store. Por exemplo, uma conexão será marcada como stale se o servidor do data store for encerrado. Quando uma conexão é marcada como stale, o conjunto inteiro é limpo por padrão porque é muito provável que todas as conexões estejam stale pelo mesmo motivo (mas é possível definir a configuração para limpar somente a conexão com falha). Essa limpeza inclui marcar todas as conexões atualmente InUse como stale para que sejam destruídas no fechamento. A transição a seguir declara o comportamento em uma chamada para close() quando a conexão está marcada como stale:
InUse>DoesNotExist:
close AND
markedStale AND
NoTx AND
noOtherReferences

Esta transição declara que se o aplicativo chamar close() na conexão e esta estiver marcada como stale durante a etapa de limpeza do conjunto (markedStale), o objeto da conexão fecha para o data store e não é retornado ao conjunto.

Finalmente, você pode fechar conexões ao data store e removê-las do conjunto.

Esta transição declara que existem três casos nos quais uma conexão é removida do conjunto livre e destruída.
  1. Se uma notificação de erro fatal for recebida do adaptador de recurso (ou origem de dados). Uma notificação de erro fatal (FatalErrorNotification) é recebida do adaptador de recurso quando algo acontece à conexão que a torna não utilizável. Todas as conexões atualmente no conjunto livre são destruídas.
  2. Se a conexão estiver no conjunto livre por mais tempo que o período de tempo limite sem utilização (UnusedTimeoutExpired) e o tamanho do conjunto for maior que o número mínimo de conexões (poolSizeGTMin), a conexão é removida do conjunto livre e destruída. Este mecanismo permite que o conjunto volte a seu tamanho mínimo quando a demanda por conexões diminuir.
  3. Se um tempo limite de idade estiver configurado e uma determinada conexão for mais antiga que o tempo limite. Este mecanismo fornece uma maneira de reciclar conexões com base na idade.

Ícone que indica o tipo de tópico Tópico de Conceito



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cdat_conlifcyc
Nome do arquivo: cdat_conlifcyc.html