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:
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>