Glassfish Datasource

6 respostas
M

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.

T

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

M

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

M

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.

M

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