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.
- 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.
InFreePool > InUse: getConnection AND freeConnectionAvailable AND NOT(shareableConnectionAvailable)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.getConnection AND NOT(freeConnectionAvailable) AND poolSizeLTMax AND (NOT(shareableConnectionAvailable) OR unshareableConnectionRequest)
- 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.
InFreePool > InUse: getConnection AND freeConnectionAvailable AND (unshareableConnectionRequest OR NOT(shareableConnectionAvailable))
- 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.
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.
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)
- 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.
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.
- 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.
- 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.
- 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.