Pool de conexões em Aplicação Swing

13 respostas
M

Olá senhores,

desenvolvo em Swing a algum tempo e agora surgiu a seguinte necessidade:

Um cliente possuí um oracle licenciado para 15 conexões, porém ele tem 30 usuários que vão precisar acessar o sistema quer será feito em Swing (Desktop).

A minha pergunta é, existe algum pool de conexões para Swing ??? Ou o melhor seria eu desenvolver um “servidor de aplicação” e gerenciar nele as conexões com o banco, criando uma lista do que deve ser executado no banco ???

Att.

13 Respostas

V

Sim. Existe o C3P0 e o DBCP. São mais facilmente integrados caso você use o Spring para gerenciar as conexões.

G

O melhor seria tu não distribuir a Connections entre os desktops. Ainda mais com esse limite de conexões. Quanto antes tu devolver pro pool, melhor.

A

Olá ViniGodoy boa noite, eu desenvolvi um sistema em java swing, porém estou com problemas nas conexões, estou usando o C3P0 porém ele não está liberando as conexões, estou usando o comando sempre no final dos metodos:

session.close();

o programa chega no limite das 100 conexões e trava, li alguma coisa que o C3P0 não é muito legal, que é melhor usar o DBCP porém gostaria de uma opinião de alguém com mais experiência.

Obrigado.

F

Um servidor de aplicação pode te trazer outros benefícios

A

Como assim um servidor de Aplicação? Minha aplicação é desktop e o banco é postgre e está rodando no Windows Server.

F

O swing se conecta no servidor e o servidor no banco procura por tree tier java no goolgle

A

É eu disconheço como fazer isso, mais vou dar uma procurada por soluções.

Obrigado.

G

adilsonbad:
Olá ViniGodoy boa noite, eu desenvolvi um sistema em java swing, porém estou com problemas nas conexões, estou usando o C3P0 porém ele não está liberando as conexões, estou usando o comando sempre no final dos metodos:

session.close();

o programa chega no limite das 100 conexões e trava, li alguma coisa que o C3P0 não é muito legal, que é melhor usar o DBCP porém gostaria de uma opinião de alguém com mais experiência.

Obrigado.

Cara, qual banco tu estas usando? Tu aplicação é usada só de uma máquina?

A

O banco que eu utilizo é o Postgre e minha aplicação é acessada por várias máquinas, + ou - 50 computadores

G

Cara, essas 50 máquinas, cada uma tem um client (jar) da tua aplicação e cada um desses “jares” possuem um pool?

A

Sim cada um tem um cliente .jar, todos os arquivos da instalação são por máquina então cada um tem .jar, .properties e etc… Agora em questão ao pool, como mostrei no código acima eu estou usando nas configurações do .properties o C3P0, junto com o .jar do C3P0, eu to achando que ele que faz esse trabalho do pool para mim, ou estou enganado?

G

Ai é que ta amigo, como um client precisa de apenas uma conexão com o banco por tarefa (a não ser que tenham threads envolvidas no acesso ao banco), não tem necessidade de haver uma configuração de pool para cada client. Tu podes abrir e fechar conexão para cada solicitação ao banco.

Lembrando que esse teu ambiente não é muito adequado, pois tu perde a gerência do número de conexões. Além de ter que estar fazendo IO toda hora e não poder se beneficiar do uso de cache que sirva para todos clients.

Eu não sei o tamanho do teu sistema, mas eu aconselheria a usar um WebService para servir esses teus clients. Um WebService te abriria varias possibilidades. Facilitaria manutenção, gerênciamento de conexões com o banco, poderia utilizar cache de objetos, diminuiria o tamanho do jars dos clients, não exporia user/pass de acesso ao banco no teu jar, etc…

A

É eu não sei se estou fazendo certo mais uso Hibernate no meu sistema, e fiz a classe HibernateUtil, então pelo que eu li o hibernateutil faz a conexão com o banco e me libera uma sessão essa sessão eu fecho ela toda hora depois de fazer a consulta com o BD postgre.

hibernate.properties

hibernate.connection.driver_class = org.postgresql.Driver
hibernate.connection.url = jdbc:postgresql://localhost:5432/postgres
hibernate.connection.username = postgres
hibernate.connection.password = a1b2c3d4
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider
hibernate.c3p0.min_size=1
hibernate.c3p0.max_size=200
hibernate.c3p0.timeout=14400
hibernate.c3p0.max_statements=0
hibernate.c3p0.minPoolSize=1
hibernate.c3p0.maxIdleTime=60
hibernate.c3p0.idleConnectionTestPeriod=60
hibernate.c3p0.maxIdleTimeExcessConnections=10
hibernate.show_sql = true
hibernate.format_sql = true

Classe HibernateUtil

package br.com.projeto_gerencial.hibernate_util;
/**
 *
 * @author AdilsonBad
 */
import java.io.FileInputStream;
import java.util.Properties;
import javax.swing.JOptionPane;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.properties.EncryptableProperties;

public class HibernateUtil {

    private static SessionFactory FabricaSessoes;
    static
    {
        try
        {
             StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
             encryptor.setPassword("SGC_DataBase");
             //
             Properties props = new EncryptableProperties(encryptor);
             //
             props.load(new FileInputStream("hibernate.properties"));
             //
             props.setProperty("hibernate.connection.password", props.getProperty("hibernate.connection.password"));
             //
             FabricaSessoes = new Configuration().setProperties(props).configure().buildSessionFactory();
        }
        catch (Exception erro)
        {
            JOptionPane.showMessageDialog(null, "Erro na fabrica de sessões.: " + erro);
            FabricaSessoes = null;
        }
    }

    /*
     * Cria Método que retorna uma Sessão
     */
    public static Session getSession()
    {
        return FabricaSessoes.openSession();
    }
}

Como uso ela no meu sistema, exemplo abaixo:

public Boolean cadastrarFaixaHorario(FaixaHorario faixaHorario)
   {
        Boolean retorno = false;
        try
        {
            Session sessao = HibernateUtil.getSession();
            Transaction tx_faixaHorario = sessao.beginTransaction();
            sessao.save(faixaHorario);
            tx_faixaHorario.commit();
            sessao.close();
            retorno = true;
        }
        catch (Exception erro)
        {
            JOptionPane.showMessageDialog(null, "Erro na inserção: " + erro);
        }
        return retorno;
   }

Será que nesse processo tem algo errado. Meu sistema com os .jar externos estão dando 30mb, somente o .jar do sistema tem 1mb, li alguma coisa sobre webService mais não cheguei a me aprofundar no assunto, o que me aconselha?

Criado 22 de junho de 2010
Ultima resposta 2 de abr. de 2011
Respostas 13
Participantes 5