Finalizar Conexões - Trabalhando com Hibernate+JPA+C3p0+MYSQL

Bom dia pessoal, sou novo por aqui.
Estou com uma grande dificuldade em como configurar minha aplicação para finalizar a conexão com banco de dados quando fechar o navegador ou após um determinado período de tempo.
Estou Trabalhando com Hibernate+JPA+C3p0+MYSQL
Li referente o C3p0 e o timeout, e outras configurações dele, porem não consegui acertar este problema.
No momento estou trabalhando localmente, isto pode ser um que quando colocado em ambiente de trabalho fique corrigido?
Segue meu arquivo de persistencia note que contém muita configuração do C3p0 acho até que com redundancia. Analisem ele e ajudem se possível.
a como corrigir este problema, pois visualizando aqui no MYSQL a conexão só encerrá quando fecho o net beans…E no caso tb estou a utilizar o GlassFish

Grato

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="ECommercePU" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <!--
    <jta-data-source>jndiDerby</jta-data-source>
    -->
        <non-jta-data-source/>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.url" value="jdbc:mysql://192.168.21.250:3306/ecommerce_1_0"/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.password" value="123456"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="false"/>
            <property name="hibernate.cache.use_second_level_cache" value="true"/>
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/>

            <property name="hibernate.c3p0.automaticTestTable" value="con_test"/>
            <property name="hibernate.c3p0.idleConnectionTestPeriod" value="60"/>
            <property name="hibernate.c3p0.initialPoolSize" value="10"/>
            <property name="hibernate.c3p0.maxIdleTime" value="60"/>
            <property name="hibernate.c3p0.maxPoolSize" value="100"/>
            <property name="hibernate.c3p0.minPoolSize" value="10"/>
            <property name="hibernate.c3p0.maxStatements" value="200"/>
            <property name="hibernate.c3p0.acquireIncrement" value="50"/><!--tempo entre uma tentativa e outra de conseguir adquirir uma conexao -->
            <property name="hibernate.c3p0.checkoutTimeout" value="60"/><!-- tempo devida da conexao estando inativa -->
            <property name="hibernate.c3p0.initialPoolSize" value="0"/>
            <property name="hibernate.c3p0.maxStatementsPerConnection" value="10"/>
            <property name="hibernate.c3p0.acquireRetryDelay" value="1000"/>
            <property name="hibernate.c3p0.acquireRetryAttempts" value="60"/><!-- qtde de vezes que o c3p0 tentara abrir a conexao -->
            <property name="hibernate.c3p0.breakAfterAcquireFailure" value="true"/>
            <property name="hibernate.c3p0.maxIdleTimeExcessConnections" value="60"/>
            <property name="hibernate.c3p0.numHelperThreads" value="3"/>
            <property name="hibernate.c3p0.debugUnreturnedConnectionStackTraces" value="true"/>
            <property name="hibernate.c3p0.unreturnedConnectionTimeout" value="60"/>
        </properties>
    </persistence-unit>
</persistence>

Jovem,

Normalmente configuramos isso no banco de dados, todos SGBD tem um parametro “timeout”, tendo um conexão inativa por tanto “xx” segundos/minutos ele a encerra.
Trabalhando com Poll de conexão também é possível, basta pesquisar qual parametro é usado nessa finalidade .

Olá robinsonbsilva, desde já agradeço por sua resposta.

Porém em todas as pesquisas encontrei que o parametro timeout e checkoutTimeout do c3p0 erá para resolver e realizar este procedimento.Porém mesmo após esta configuração com valor 60 como no código anterior, ainda não esta finalizando.Realmente acredito que seja possível realiazar isto como você mencionou no proprio banco. Mais eu gostaria de realizar na propria aplicação.

Pois no futuro poderei ter varias aplicações encerrando as conexões em um tempo estabelecido pela propria aplicação.

Encontrou algo de estranho no código acima?

Obrigado

[quote=flaviorgiron]Olá robinsonbsilva, desde já agradeço por sua resposta.

Porém em todas as pesquisas encontrei que o parametro timeout e checkoutTimeout do c3p0 erá para resolver e realizar este procedimento.Porém mesmo após esta configuração com valor 60 como no código anterior, ainda não esta finalizando.Realmente acredito que seja possível realiazar isto como você mencionou no proprio banco. Mais eu gostaria de realizar na propria aplicação.

Pois no futuro poderei ter varias aplicações encerrando as conexões em um tempo estabelecido pela propria aplicação.

Encontrou algo de estranho no código acima?

Obrigado[/quote]

Estranho cara, aqui eu configuro dessa maneira e funfa.
ex:

!-- C3P0 connection pool. -->
<property name="c3p0.min_size">1</property>
<property name="c3p0.max_size">2</property>
<property name="c3p0.timeout">2400</property>
<property name="c3p0.acquire_increment">1</property>
<property name="c3p0.max_statements">30</property>

Boa tarde ebarros.
Obrigado pela resposta

Realmente estranho… pois fico com o MYSQL Administrator aberto e fico fazendo o acompanhamento das conexões em abertos, noto que elas não fecham após finalizar o navegador e nem com o tempo.
Gostaria de aproveitar e confirmar com vcs…

O tempo definido para c3p0.timeout é em segundos?Existe outro paramentro para isto?

Existe uma outra forma de realizar este procedimento sem ser pelo proprio banco de dados?Pelo proprio C3P0 ou outro?

Grato

Você quer que quando você encerre a navegação não fique mais nenhuma conexão com o banco?

Se for realmente isso você tem que deixar o initialPoolSize e minPoolSize iguais a zero. O pool mantem nesse seu caso as conexões abertas (até um máximo de 10, acima disso ele deveria fechar), eu pelo menos acho que não é muito bom deixar o pool vazio, aplicação fica mais rapida quando já existem conexões abertas que não estão sendo usadas.


Apesar de você ter setado um número grande de tentativas para acesar o pool (60) eu não deixaria essa opção verdadeira. Se por algum acaso alguem tentar 60 vezes acessar o pool e não conseguir o c3p0 vai considerar o pool quebrado e ninguem mais vai conseguir se conectar, se você deixar falso a aplicação só vai jogar uma exceção ... eu acho que é o ideal não?

Apesar de você ter setado um número grande de tentativas para acesar o pool (60) eu não deixaria essa opção verdadeira. Se por algum acaso alguem tentar 60 vezes acessar o pool e não conseguir o c3p0 vai considerar o pool quebrado e ninguem mais vai conseguir se conectar, se você deixar falso a aplicação só vai jogar uma exceção … eu acho que é o ideal não?

[quote=rollei]<property name="hibernate.c3p0.breakAfterAcquireFailure" value="true"/>

Apesar de você ter setado um número grande de tentativas para acesar o pool (60) eu não deixaria essa opção verdadeira. Se por algum acaso alguem tentar 60 vezes acessar o pool e não conseguir o c3p0 vai considerar o pool quebrado e ninguem mais vai conseguir se conectar, se você deixar falso a aplicação só vai jogar uma exceção … eu acho que é o ideal não?[/quote]

Realmente ta ai a analise e explicação que me ajudaram e muito…

Acho que com essas dicas poderei configurar adequadamente meu projeto.
Fico muito grato por todos que me ajudaram

O GUJ é e sempre vai ser o melhor forum quando a assunto é JAVA.
Valeu a todos.

Você está com algumas propriedades duplicadas também, o initialPoolSize tem uma com valor 0 e outra com 10 … não sei como o c3p0 se comporta nesses casos, se ele considera o último ou o primeiro que você declarou. É bom deixar só uma propriedade.

você pode usar um arquivo properties com o nome c3p0.properties para configurar o seu pool também, se ele for colocado na raiz do seu fonte o c3p0 achará ele automaticamente. Você só precisa adicionar uma propriedade no seu persistence.xml para o hibernate reconhecer que você está usando o c3p0.

persistence.xml

            <!-- O Hibernate usa a propriedade hibernate.c3p0.max_size para
                 determinar se o C3P0 está sendo usado. As configurações colocadas
                 no arquivo c3p0.properties irão sobrescrever as setadas neste
                 arquivo -->
            <property name="hibernate.c3p0.max_size" value="10"/>

c3p0.properties

### *****************************
### **** Propriedades do C3P0 ***
### *****************************

# Número de conexõs que o pool tentará adiquirur durante a inicialização. Deve
# ser um número entre  minPoolSize e maxPoolSize.
c3p0.initialPoolSize=0

# Número mínimo de conexões que o pool irá manter.
c3p0.minPoolSize=0

# Número máximo de conexões que o pool irá manter.
c3p0.maxPoolSize=15

# Segundos que uma Conexão será mantida no pool sem ser usada, antes de ser
# descartada. Zero significa que a conexão nunca expira.
c3p0.maxIdleTime=60

# O tamanho do cache do C3P0 para PreparedStatements. Se o valor de ambos, maxStatements
# e maxStatementsPerConnection, é zero, o cache será desabilitado. Se
# maxStatements é zero mas maxStatementsPerConnection é um valor diferente de
# zero, o cache será habilitado, mas sem um limite global, apenas com um limite
# por conexão. maxStatements controla o número total de Statements dos quais é
# feito cache, para todas as conexões. Se setado, deve ser um valor relativamente
# alto, já que cada Conexão do pool terá um determinado número de statements
# colocado em cache. Como um exemplo, considere quantos PreparedStatements
# distintos são frequentemente usados na sua aplicação e multiplique esse
# número por maxPoolSize para chegar num valor apropriado. Apesar do parâmetro
# maxStatements ser o padrão para o JDBC controlar o cache de statements, usuários
# podem achar mais intuitivo o uso do parâmetro maxStatementsPerConnection.
c3p0.maxStatements=0

# O número de PreparedStatements que o c3p0 irá colocar em cache, para cada conexão
# do pool. Se ambos maxStatements e maxStatementsPerConnection são zero, o cache
# de consultas ficará inativo. Se maxStatementsPerConnection é zero, mas maxStatements
# é um valor não nulo, o cache de consultas será habilitado, e um limite global
# imposto, mas por outro lado, não existirá nenhum limite individual por conexão.
# Se setado, maxStatementsPerConnection deveria ser um valor, aproximado, do número
# de PreparedStatements, distintos, que são frequentemente usados na sua aplicação
# mais dois ou três, para que as consultas menos comuns não tirem as mais comuns
# do cache. Apesar de maxStatements ser o parâmetro padrão em JDBC para controlar
# o cache de consultas, o usuário pode achar mais intuitivo usar o parâmetro
# maxStatementsPerConnection.
c3p0.maxStatementsPerConnection=10

# Determina quantas conexões por vez o c3p0 tenta adquirir quando o pool não tem
# conexões inativas para serem usadas.
c3p0.acquireIncrement=1

# Se idleConnectionTestPeriod é um número maior que zero, c3p0 irá testar todas
# as conexões inativas, que estão no pool e não fizeram o check-out, de X em X
# segundos, onde X é o valor de idleConnectionTestPeriod.
c3p0.idleConnectionTestPeriod=60

# O número de milisegundos que um cliente chamando getConnection() irá esperar
# por uma Conexão, via check-in ou uma nova conexão adquirida quando o pool estiver
# esgotado. Zero siginifica esperar indefinidademento. Setar qualquer valor positivo
# causará um time-out com uma SQLException depois de passada a quantidade especificada
# de milisegundos.
c3p0.checkoutTimeout=5000

# Tempo em milisegundos que o c3p0 irá esperar entre tentivas de aquisição.
c3p0.acquireRetryDelay=1000

# Define quantas vezes o c3p0 tentará adquirir uma nova Conexão da base de dados
# antes de desistir. Se esse valor é menor ou igual a zero, c3p0 tentará adquirir
# uma nova conexão indefinidamente.
c3p0.acquireRetryAttempts=5

# Se true, um pooled DataSource declarará a si mesmo quebrado e ficará permanentemente
# fechado caso não se consiga uma Conexão do banco depois de tentar acquireRetryAttempts
# vezes. Se falso, o fracasso para obter uma Conexão jogará uma exceção, porém
# o DataSource permanecerá valido, e tentará adquirir novamente, seguindo uma nova
# chamada para getConnection().
c3p0.breakAfterAcquireFailure=false

# Número de segundos que conexões acima do limite minPoolSize deverão permanecer
# inativas no pool antes de serem fechadas. Destinado para aplicações que desejam
# reduzir agressivamente o número de conexões abertas, diminuindo o pool novamente
# para minPoolSize, se, seguindo um pico, o nível de load diminui e Conexões não
# são mais requeridas. Se maxIdleTime está definido, maxIdleTimeExcessConnections
# deverá ser um valor menor para que o parâmetro tenho efeito. Zero significa que
# não existirá nenhuma imposição, Conexões em excesso não serão mais fechadas.
c3p0.maxIdleTimeExcessConnections=30

# c3p0 é muito assíncrono. Operações JDBC lentas geralmente são executadas por
# helper threads que não detém travas de fechamento. Separar essas operações atravéz
# de múltiplas threads pode melhorar significativamente a performace, permitindo
# que várias operações sejam executadas ao mesmo tempo.
c3p0.numHelperThreads=3

# Se true, e se unreturnedConnectionTimeout está definido com um valor positivo,
# então o pool capturará a stack trace (via uma exceção) de todos os checkouts
# de Conexões, e o stack trace será impresso quando o checkout de Conexões der
# timeout. Este paramêtro é destinado para debug de aplicações com leak de
# Conexões, isto é, aplicações que ocasionalmente falham na liberação/fechamento
# de Conexões, ocasionando o crescimento do pool, e eventualmente na sua exaustão
# (quando o pool atinge maxPoolSize com todas as suas conexões em uso e perdidas).
# Este paramêtro deveria ser setado apenas para debugar a aplicação, já que capturar
# o stack trace deixa mais o lento o precesso de check-out de Conexões.
c3p0.debugUnreturnedConnectionStackTraces=false

# Segundos. Se setado, quando uma aplicação realiza o check-out e falha na realização
# do check-in [i.e. close()] de um Conexão, dentro de período de tempo especificado,
# o pool irá, sem cerimonias, destruir a conexão [i.e. destroy()]. Isto permite
# que aplicações com ocasionais leaks de conexão sobrevivam, ao invéz de exaurir
# o pool. E Isto é uma pena. Zero significa sem timeout, aplicações deveriam fechar
# suas próprias Conexões. Obviamente, se um valor positivo é definido, este valor
# deve ser maior que o maior valor que uma conexão deveria permanecer em uso. Caso
# contrário, o pool irá ocasionalmente matar conexões ativas, o que é ruim. Isto
# basicamente é uma péssima idéia, porém é uma funcionalidade pedida com frequência.
# Consertem suas aplicações para que não vazem Conexões!!! Use esta funcionalidade
# temporariamente em combinação com  debugUnreturnedConnectionStackTraces para
# descobrir onde as conexões esão vazando!
c3p0.unreturnedConnectionTimeout=0

Ops…verdade não tinha reparado que existia essa duplicação…Quem ta desenvolvendo está tão focado que não consegue ver muitas coisa.

Valeu pelas dicas e também a especificação das propriedas do C3P0, realmente vai ser se grande utilidade agradeço.

O projeto já esta configurado de acordo com suas dicas esta abrindo conexões necessárias e utilizando as que estam em aberto.
Porém ja faz um bom tempo e ainda não foi finalizado conexões antigas…é normal ficar até atingir o numero máximo para somente após começar a finalizar?
Num seria o certo finalizar também após o tempo declarado?

Grato.

Ops…verdade não tinha reparado que existia essa duplicação…Quem ta desenvolvendo está tão focado que não consegue ver muitas coisa.

Valeu pelas dicas e também a especificação das propriedas do C3P0, realmente vai ser se grande utilidade agradeço.

O projeto já esta configurado de acordo com suas dicas esta abrindo conexões necessárias e utilizando as que estam em aberto.
Porém ja faz um bom tempo e ainda não foi finalizado conexões antigas…é normal ficar até atingir o numero máximo para somente após começar a finalizar?
Num seria o certo finalizar também após o tempo declarado?

Grato.[/quote]

se você quiser manter, sempre que possível, o número de conexões igual ao seu número minimo de conexões usa essa propiedade:

# # Número de segundos que conexões acima do limite minPoolSize deverão permanecer  
# # inativas no pool antes de serem fechadas. Destinado para aplicações que desejam  
# # reduzir agressivamente o número de conexões abertas, diminuindo o pool novamente  
# # para minPoolSize, se, seguindo um pico, o nível de load diminui e Conexões não  
# # são mais requeridas. Se maxIdleTime está definido, maxIdleTimeExcessConnections  
# # deverá ser um valor menor para que o parâmetro tenho efeito. Zero significa que  
# # não existirá nenhuma imposição, Conexões em excesso não serão mais fechadas.  
c3p0.maxIdleTimeExcessConnections=30  

só um detalhe, se você ainda estiver usando o persistence.xml para configurar seu c3p0 é bom ver pq tem algumas proriedades que tem nome diferentes no propertie e no xml, lá no site do projeto ele lista todos os nomes bem direitinho. vou ver se acho o link para te mostrar.

EDIT

http://www.mchange.com/projects/c3p0/index.html

Se mesmo depois de setar essa propriedade ae, seu pool estive estrapolando muito seu minPoolSize é bom dar uma olhada, que provavelmente sua aplicação deve estar com algum leak de conexão ou então seu pool não está configurado direito (algum nome errado, arquivo no lugar errado, esse tipo de coisa)

Grande Ajuda!!! 10 meses depois …
:lol:

:smiley:

Ratificando 30 meses depois…

Grande ajuda msm, muito obrigado!!!

[]'s
t++

[quote=gbvbahia01]Grande Ajuda!!! 10 meses depois …
:lol:[/quote]

Mais de 50 meses depois…

Grande ajuda mesmo, vlw…

62 meses depois.

Ainda ajudando rs, me tirou várias dúvidas aqui!