Glassfish Datasource

6 respostas
murilo.ramos

Pessoal,
Segui este link para configuração de DataSource e Pool com o glassfish
http://www.albeesonline.com/blog/2008/08/06/creating-and-configuring-a-mysql-datasource-in-glassfish-application-server/

Funciona certinho, sem problemas, porém tenho algumas dúvidas

A cada

DataSource ds = (DataSource) ctx.lookup("jdbc/mysqltest"); Connection con = ds.getConnection();

ele não abre uma conexão nova certo, somente requisita uma do pool para ser usada, então obrigatoriamente tenho que fecha-la

con.disconnect();

depois de realizar minhas operações, sendo que ele também nao fecha a conexão, somente libera para para o pool, é isso mesmo?

Se caso eu abro uma conexão dessa e por algum motivo não a fecho, ela fica aberta e não consigo mais resgatá-la em outra requisição, existe alguma opçao na configuração do pool que eu possa setar para que ele feche essa conexao depois de um tempo de inatividade?
obs: não me refiro com “Idle Timeout” que encerra uma conexão somente no pool, e não em um requisição.

Se em tempo de execução o uso de conexões atingir o limite máximo, posso tratar a exception lançada quando ele tenta abrir uma nova conexão e abortar o funcionamento da pagina, ou então fazer ele tentar novamente obter a conexão. Este é o melhor modo de fazer?

Obrigado

6 Respostas

A

Murilo, pelo que eu saiba do glassfish, ele consegue gerenciar isso sozinho, se você não fechar uma conexão e solicitar uma nova, ele “mata” a anterior e cria uma nova, ele tem um gerenciamento muito bom.

tmvolpato

Qdo vc cria um data source no seu caso glassfish
vc não precisa se preocupar em fechar conexão.

eu prefiro trabalhar dessa maneira, como o amigo disse… ele gerencia mto bem isso

murilo.ramos

Tem certeza? Existe alguma configuração a mais que tenho que fazer alem do descrito no link postado?
Se abro varias conexões e não fecho, ele vai até o maximo de conexões no pool (32 que configurei) e a partir dai começa a dar exception, e não pega uma nova
A exception acho que é “too many connections”.
Fico visualizando no gerenciador de conexões do mysql, e as 32 conexões permanecem lá, sem que eu posso reutilizá-las.

alguma sugestão, ou código?

obrigado

murilo.ramos

No tópico:

aconselham a sempre fechar essas conexões, agora fiquei em dúvida.

Lembrando que não estou utilizando framework do tipo Hibernate, abro as conexões aos estilo jdbc mesmo.

Acho que se eu não fechar a conexão, ela entra no outro item que questionei, sobre o timeout de uso.
Porém mesmo que eu consiga setar um propriedade que feche uma conexão inativa depois de 10 segundos por exemplo, caso ela seja usada só em 1 segundo, os outros 9 segundos não irão ser usados não é? gerando um possível atraso de resposta em requisições que usam conexão com o banco…

E

a) Conexão obtida do pool deve ser devolvida o mais rapidamente possível (não existe “disconnect” e sim “close”).
O correto é usar sempre um “finally” para fechar mesmo se houver algum problema, por exemplo:

Connection conn = null;
try {
    conn = ....;
} finally {
    try { if (conn != null) conn.close(); } catch (SQLException ex) { }
}

Se estiver usando Java 7, use o “try with resources”. Ele é mais fácil de usar e mais seguro. Você teria algo como:

try (
    Connection conn = ....;
) {
     ... // usar a conexão
}

O “try with resources” já fecha a conexão para você automaticamente, e verificar se houve algum problema na hora de obter a conexão.

murilo.ramos

Value etanglement, matou a pau, muito obrigado !!!

E a respeito do segundo item? existe alguma configuração de timeout para que a conexão requisitada em uma operação seja devolvida ao pool caso fique inativa na operação? Sei que parece meio desnecessário se for feito um tratamento de erros como o etanglement mostrou, porem pode sempre existir uma chance de falha nao prevista, então esse timeout ajudaria no problema

Outra dúvida é a respeito da seção “Transaction”
Não gostaria que minhas transações fossem controladas pelo pool, e sim direto no código, então se eu deixar as opções desmarcadas, e setar as propriedades de transações no código vai funcionar normalmente?

Exemplo:

Context ctx = new InitialContext(); DataSource dataSource = (DataSource) ctx.lookup("jdbc/mysqltest"); conn = dataSource.getConnection(); conn.setAutoCommit(false); conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

Com esse código, o autocommit e o transaction isolation vão valer somente para essa minhas conexão?

obrigado

Criado 3 de setembro de 2012
Ultima resposta 3 de set. de 2012
Respostas 6
Participantes 4