Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con el pool de conexiones en una aplicacion de escritorio

Estas en el tema de Problema con el pool de conexiones en una aplicacion de escritorio en el foro de Java en Foros del Web. Actualmente estoy creando una aplicación java de escritorio usando una base de datos que tengo alojada en un servidor que he contratado. Leyendo las recomendaciones, ...
  #1 (permalink)  
Antiguo 28/02/2013, 14:23
Avatar de fegm_4  
Fecha de Ingreso: febrero-2013
Mensajes: 114
Antigüedad: 11 años, 8 meses
Puntos: 8
Pregunta Problema con el pool de conexiones en una aplicacion de escritorio

Actualmente estoy creando una aplicación java de escritorio usando una base de datos que tengo alojada en un servidor que he contratado. Leyendo las recomendaciones, decidí usar un pool de conexiones para el acceso a la información debido a que la aplicación la usaran varios equipos a la vez.

Ahora bien, la configuracion del pool la he colocado en un archivo .properties y es de la siguiente manera

Código:
driverClassName=com.mysql.jdbc.Driver
username=user
password=mypass
url=jdbc:mysql://www.domain.tk:3306/mydb
validationQuery=select 1
initialsize=4
maxSize=20
createWaitTime=100
Y tengo un metodo en el frame principal que se llama initDataSource que establece el valor de DataSource de acuerdo al archivo properties. Lo muestro a continuación:
Código:
private void initDataSource(){
        Properties propiedades = new Properties();
        try {
            propiedades.load(new FileInputStream("src/Auxiliary/poolsettings.properties"));
            dataSource = BasicDataSourceFactory.createDataSource(propiedades);
            connPool.setDataSource(dataSource);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,
                        "No se ha podido establecer la configuración del pool \n"+ex,
                        "Aplicacion.- ", JOptionPane.ERROR_MESSAGE);
        }
    }


Al momento de crear la primera conexión, lo hace muuuy lento, alrededor de 1 min, el cual en tiempo de programación es muchísimo a mi parecer. Hice las pruebas y el problema se da en la clase de consulta, específicamente en la linea en la cual se obtiene la conexión (conn = dataSource.getConnection();)

Código:
public int getIDuser(String username, String password) {
        Connection conn = null;
        int idUser = 0;
        try {
            conn = dataSource.getConnection();
            String SQLquery = "SELECT idUser FROM tblusers WHERE strUsername LIKE BINARY '" + username + "' AND strPassword=MD5('" + password + "')";
            ResultSet rs;
            PreparedStatement pstmt = conn.prepareStatement(SQLquery);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                idUser = rs.getInt("idUser");
            }
            rs.close();
            pstmt.close();
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Ha ocurrido un error en la obtención de idUser: \n" + ex,
                    "Aplicacion.-", JOptionPane.ERROR_MESSAGE);
        } finally {
            setFreeConection(conn);
        }
        return idUser;
    }
El metodo setFreeConection cierra la conexion de la siguiente manera:

Código:
private void setFreeConection(Connection conn) {
        try {
            if (null != conn) {
                // En realidad no cierra, solo libera la conexion.
                conn.close();
            }
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Ha ocurrido un error en el cierre de la conexión: \n" + ex,
                    "Aplicacion.-", JOptionPane.ERROR_MESSAGE);
        }
    }
¿Qué podría estar haciendo mal? ¿Tendría que hacer algo extra al iniciar el programa? Agradezco mucho quien pueda ayudarme
  #2 (permalink)  
Antiguo 28/05/2013, 17:31
 
Fecha de Ingreso: mayo-2013
Mensajes: 4
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Problema con el pool de conexiones en una aplicacion de escritorio

Hola fegm_4 yo tengo esto al parecer es el mismo problema estoy listando 4 campos y son solo 4 registros no lo e probado en un jTable solo con un System.out.println(); pero me parece que demora un poco aquí dejo el código no estaría mal que lo pruebes.

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

/**
*
* @author kewining
*/
public class Conexion4_BD {

/**
* @param args
*/
public static void main(String[] args) {
new Conexion4_BD();
}

/** Pool de conexiones */
private DataSource dataSource;

/**
* Inicializa el pool de conexiones BasicDataSource y realiza una insercion
* y una consulta
*/
public Conexion4_BD() {
inicializaDataSource();
//inserta();
realizaConsulta();
}

/**
* Inicializacion de BasicDataSource
*/
private void inicializaDataSource() {
BasicDataSource basicDataSource = new BasicDataSource();

basicDataSource.setDriverClassName("com.mysql.jdbc .Driver");
basicDataSource.setUsername("username");
basicDataSource.setPassword("pass");
basicDataSource.setUrl("jdbc:mysql://servidor:3306/bd");

// Opcional. Sentencia SQL que le puede servir a BasicDataSource
// para comprobar que la conexion es correcta.
basicDataSource.setValidationQuery("select 1");

dataSource = basicDataSource;
}

/**
* Realiza una insercion, pidiendo una conexion al dataSource y cerrandola
* inmediatamente despues, para liberarla.
*/
private void inserta() {
Connection conexion = null;
try {
// BasicDataSource nos reserva una conexion y nos la devuelve.
conexion = dataSource.getConnection();

// La insercion.
Statement ps = conexion.createStatement();
ps
.executeUpdate("insert into person values (null,22,'Pedro','Martinez')");

} catch (SQLException e) {
e.printStackTrace();
} finally {
liberaConexion(conexion);
}
}

/**
* Cierra la conexion. Al provenir de BasicDataSource, en realidad no se
* esta cerrando. La llamada a close() le indica al BasicDataSource que
* hemos terminado con dicha conexion y que puede asignarsela a otro que la
* pida.
*
* @param conexion
*/
private void liberaConexion(Connection conexion) {
try {
if (null != conexion) {
// En realidad no cierra, solo libera la conexion.
conexion.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}

/**
* Realiza una consulta a la base de datos y muestra los resultados en
* pantalla.
*/
private void realizaConsulta() {
Connection conexion = null;
try {
conexion = dataSource.getConnection();
Statement sentencia = conexion.createStatement();
ResultSet rs = sentencia.executeQuery("select * from tabla");

// La tabla tiene cuatro campos.
while (rs.next()) {
System.out.println(rs.getObject("campo1"));
System.out.println(rs.getObject("campo2"));
System.out.println(rs.getObject("campo3"));
System.out.println(rs.getObject("campo4"));
System.out.println("--------------");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// En el finally, para asegurar que se ejecuta, se cierra la
// conexion.
liberaConexion(conexion);
}
}
}

Etiquetas: aplicacion, escritorio, mysql, pool
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:15.