Além do Trabalho

Database Connection Caching no OC4J

Publicado por: jossemaravila em: Terça-feira, 12/Fevereiro/2008

Uma das operações que mais consomem tempo em aplicações JavaEE é a de estabelecer conexão com o banco de dados. Os servidores de aplicação possuem recursos de caching e pooling de conexões para minimizar o overhead causado por este tipo de tarefa.

No OC4J este mecanismo esta relacionado com o tipo de datasource utilizado pela aplicação. Os tipos de datasource suportados pelo application server são:

Managed Data Source

É gerenciado pelo application server e pode ser utilizado através da interface java.sql.DataSource, que atua como um wrapper para um driver JDBC ou para o datasource. Por sua vez, os componentes JavaEE acessam estes datasources via JNDI que faz o mapeamento com o wrapper em questão.
Para este tipo de datasource, o OC4J provê uma infra-estrutura com gerenciamento de controle transacional, cache e pool de conexões, configuração dinâmica via JMX além de tratamento de erros.

Native Data Source

Este tipo também é utilizado através da interface java.sql.DataSource, no entanto são implementados pelo respectivo driver JDB. Desta maneira este tipo de datasource não são gerenciados pelo OC4J.

Como configurar o database connection caching

Configurar o connection caching no OC4J é relativamente simples, pois isto é feito de forma declarativa diretamente no arquivo data-sources.xml. Este arquivo pode ser encontrado na pasta config da instância do OC4J.

Os passos necessários para sua configuração são:

  1. editar o arquivo data-sources.xml
  2. adicionar o elemento <connection-pool> e definir seus atributos
  3. adicionar o elemento <managed-data-source> ou o elemento <native-data-source> e definir seus atributos
  4. salvar o arquivo
  5. reiniciar a instância do OC4J utilizando-se o opmnctl ou através do enterprise manager

Atributos do elemento connection-pool

Atributo Descrição Default
name (Requerido) Nome do pool de conexões. Deve ser único n/a
min-connections o número mínimo de conexões abertas que o pool deverá manter 0
max-connections número máximo de conexões que o pool deverá manter. Se um valor menor ou igual a zero for setado indicará que não existe um número máximo de conexões e sempre que necessário uma nova conexão será criada. 0
initial-limit indica a quantidade de conexões que deverão ser criadas inicialmente no cache na inicialização ou reinicialização da instância. Esta propriedade geralmente é utilizada para reduzir custo de criação de conexões e desta forma otimizar o cache de conexões. 0
used-connection-wait-timeout Tempo em segundos que o application espera para que o cliente libere a conexão. Este atributo aplica-se somente quando todas as conexões definidas no max-connections estiverem em uso. Neste caso quando um cliente solicita uma conexão e todas estão sendo utilizadas o application aguarda este tempo para que uma das conexões seja liberada . 60
inactivity-timeout indica quanto tempo em segundos as conexões inativas permanecerão no pool. Após este intervalo tempo o application remove a conexão do pool 60
login-timeout tempo máximo em segundos que será aguardado para que a conexão com o banco de dados seja realizada. O valor zero indica deve ser utilizado o timeout padrão do sistema, se houver. Caso contrário, indica que não há limite de tempo 0
connection-retry-interval intervalo em segundos que o application aguarda antes de retornar erro na tentativa de obtenção/abertura de conexão. Este atributo é utilizado em conjunto com o atributo max-connnect-attempts 1
max-connect-attempts número de tentativas para retornar uma conexão. É utilizado em conjunto com o atributo connection-retry-interval 3
validate-connection indica se a conexão, quando obtida do pool, deverá ser validada contra a base de dados. O valor “true” indica o statement declarado no atributo validate-connection-statement será executado para verificar se a conexão é válida ou não.O valor “false” indica que o statement não será executada. É utilizado em conjunto com o atributo validate-connection-statement false
validate-connection-statement statement SQL que será executado para validar a conexão contra a base de dados, quando a mesma for obtida no pool. É utilizado em conjunto com o atributo validate-connection n/a
num-cached-statements
número máximo de statements que serão armazenados em cada conexão. Qualquer valor superior a 0 faz automaticamente o cache do statement para o datasource.
0
time-to-live-timeout
tempo máximo, em segundos, que uma conexão ativa pode ser utilizada. Quando esse tempo limite expirar, a conexão será fechada incondicionalmente, e os handles dos statements em execução serão cancelados e a conexão será devolvida para o pool. O valor -1 indica que este recurso não está ligado.
-1
abandoned-connection-timeout Utilizado somente para banco de dados Oracle. É semelhante ao inactivity-timeout, mas atua sobre uma conexão lógica. -1
disable-server-connection-pooling Determina se o pool de conexões será desativado ou não. Está disponível porque alguns drivers JDBC fornecem pool de conexões e quando o driver é Oracle e utiliza pool implícito este atributo será ignorado. false
property-check-interval Utilizado somente para banco de dados Oracle, este intervalo de tempo, em segundos, é utilizado para determinar o limite de tempo de espera das threads do cache daemon 900
lower-threshold-limit Utilizado somente para banco de dados Oracle.

O menor limite do pool de conexões, seu padrão é de 20% da quantidade indicada no atributo max-connections
20%

Atributos do elemento connection-factory

Attributo Descrição Default
factory-class (Requerido) define o path completo da classe de implementação do connection-factory e deve ser uma implementação das interfaces java.sql.Driver, javax.sql.DataSource, javax.sql.ConnectionPoolDataSource, ou javax.sql.XADataSource. n/a
url (Requerido) Url de conexão com o banco de dados n/a
user o login do usuário utilizado para realizar a conexão com o banco de dados n/a
password a senha utilizada para realizar a conexão com o banco de dados n/a
login-timeout O tempo máximo em segundos que deverá ser esperado enquanto é realizada a conexão com o banco de dados. O valor zero indica que não há timeout para esta operação e este é o valor default. 0

Veja um exemplo completo do connection-pool e connection-factory:

<connection-pool name="myConnectionPool"

min-connections="10"

max-connections="30"

inactivity-timeout="30">

<connection-factory

factory-class="oracle.jdbc.xa.client.OracleXADataSource"

user="scott"

password="tiger"

url="jdbc:oracle:thin:@localhost:1521:oracle"/>

<property name="nativeXA" value="true"/>

</connection-factory>

</connection-pool>

Atributos do elemento managed-data-source

Atributo Descrição
jndi-name nome JNDI utilizado para o servidor fazer o lookup do pool de conexões. Deve ser único
description descrição do datasource
connection-pool-name nome do pool de conexões criado no elemento connection-pool
name nome do datasource. Deve ser único

Veja um exemplo:

<managed-data-source jndi-name="jdbc/ManagedXADS"

description="Managed DataSource"

connection-pool-name="myConnectionPool"

name="ManagedXADS"/>

Atributos do elemento native-data-source

Atributo Descrição
jndi-name nome JNDI utilizado para o servidor fazer o lookup do pool de conexões. Deve ser único
description descrição do datasource
name nome do datasource. Deve ser único
data-source-class define o path completo da classe que obtém a conexão

Veja um exemplo:

<native-data-source
 name="nativeDataSource"
 jndi-name="jdbc/nativeDS"
 description="Native DataSource"
 data-source-class="oracle.jdbc.pool.OracleDataSource"
 user="scott"
 password="tiger"
 url="jdbc:oracle:thin:@localhost:1521:oracle">
  <property name="connectionCacheName" value="ICC1"/>
  <property name="connectionCachingEnabled" value="true"/>
  <property name="fastConnectionFailoverEnabled" value="false"/>

</native-data-source>

Deixe uma resposta