Velocidad de acceso a base de datos MySQL, como mejorarla en Cliente/Servidor

Hola a todos,

Estoy desarrollando una Aplicación Cliente/Servidor, Java 100%.

El acceso que hago a la base de datos lo hago desde una clase llamada BDConexion():

/**
 *
 * @author Armel
 */

package BaseDatos;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ConexionBD {

    private static Connection conexion = null;
    //
    private static String servidor = "Servidor.com";
    private static String database = "BD";
    private static String usuario = "Usuario";
    private static String password = "Clave";

    private static String url = "";
   
    public ConexionBD() {

    }

    public static Connection Conectar() {
        try {
            System.out.println("Inicio conexión....!");
            try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                url = "jdbc:mysql://" + servidor + "/" + database;
                try {
                    int seconds = 15;
                    DriverManager.setLoginTimeout(seconds);
                    conexion = DriverManager.getConnection(url, usuario, password);
                    System.out.println("Se ha establecido la conexión con el servidor : " + servidor);
                    System.out.println("Conectado a la Base de Datos : " + database);
                    System.out.println("La conexión está Activa..!");
                    return conexion;
                } catch (SQLException ex) {
                    Logger.getLogger(ConexionBD.class.getName()).log(Level.SEVERE, null, ex);
                    return null;
                }
            } catch (InstantiationException ex) {
                Logger.getLogger(ConexionBD.class.getName()).log(Level.SEVERE, null, ex);
                return null;
            } catch (IllegalAccessException ex) {
                Logger.getLogger(ConexionBD.class.getName()).log(Level.SEVERE, null, ex);
                return null;
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ConexionBD.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
}

La idea con este código, es crear una conexión y única entrada a la báse de datos sin tener que conectarme cada vez que debo leer datos
o grabar sobre la base de datos.

Este es el Programa principal dónde defino como public la variable Conexion "cn" que utilizaré en el software

public class SolverST extends javax.swing.JFrame {

    private static final long serialVersionUID = 1L;

    public static Connection cn;
    public static ConexionBD mySQL;
    public static Color cColorNegro = new Color(0, 0, 0);
    public static Color cColorGris = new Color(153, 153, 153);
    public static Color cColorRojo = new Color(255, 0, 0);
    public static Color cColorMorado = new Color(153, 0, 204);
    public static SimpleDateFormat FormatoFecha = new SimpleDateFormat("yyyy-MM-dd");
    public static SimpleDateFormat FormatoHora = new SimpleDateFormat("hh:mm:ss");

    // Variables de carga en este Form
    private int nSleep = 0;
    private boolean realizado = false;
    hilo ejecutar = new hilo();

    public SolverST() {
        initComponents();
        setIconImage(new ImageIcon(getClass().getResource("/Img/Solver Inicio.png")).getImage());
        mySQL = new ConexionBD();
        cn = mySQL.Conectar();

        SolverST.this.getRootPane().setOpaque(false);
        SolverST.this.getContentPane().setBackground(new Color(0, 0, 0, 0));
        SolverST.this.setBackground(new Color(0, 0, 0, 0));
        this.setResizable(false);
        this.setLocationRelativeTo(this);
    }

    @Override
    public void setResizable(boolean bln) {
        super.setResizable(bln); //To change body of generated methods, choose Tools | Templates.
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jProgressBar_LoadAppInicio = new javax.swing.JProgressBar();
        jLabel_stEstado = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setAlwaysOnTop(true);
        setBackground(new java.awt.Color(255, 255, 255));
        setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR));
        setUndecorated(true);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowActivated(java.awt.event.WindowEvent evt) {
                formWindowActivated(evt);
            }
        });

        jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/SolverLogo.png"))); // NOI18N

        jLabel_stEstado.setBackground(new java.awt.Color(204, 102, 0));
        jLabel_stEstado.setFont(new java.awt.Font("Lucida Sans Unicode", 0, 11)); // NOI18N
        jLabel_stEstado.setForeground(new java.awt.Color(255, 255, 0));

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jProgressBar_LoadAppInicio, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .add(jLabel_stEstado, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .add(jLabel1)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .add(jLabel1)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jLabel_stEstado, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 18, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jProgressBar_LoadAppInicio, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 23, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }// </editor-fold>                        

    private void formWindowActivated(java.awt.event.WindowEvent evt) {                                    
        if (realizado == false) {
            realizado = true;
            jProgressBar_LoadAppInicio.setMaximum(50);
            jProgressBar_LoadAppInicio.setMinimum(0);
            jProgressBar_LoadAppInicio.setStringPainted(true);
            ejecutar.start();
        }
    }                                    

    /**
     * @param args the command line arguments
     */

    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see <a href="http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html" title="http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html">http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html</a>
         */

        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Windows".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(SolverST.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(SolverST.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(SolverST.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(SolverST.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new SolverST().setVisible(true);
            }
        });
    }

    private class hilo extends Thread {

        @Override
        public void run() {
            try {
                while (true) {
                    nSleep++;
                    jProgressBar_LoadAppInicio.setValue(nSleep);
                    repaint();
                    switch (nSleep) {
                        case 0:
                            jLabel_stEstado.setText("Verificando conexión...");
                            break;
                        case 10:
                            jLabel_stEstado.setText("Estableciendo conexión con servidor...");
                            break;
                        case 20:
                            jLabel_stEstado.setText("Validando acceso al Servidor...");
                            break;
                        case 40:
                            jLabel_stEstado.setText("Conectando con la Base de Datos...");
                            break;
                        case 50:
                            jLabel_stEstado.setText("Abriendo Menu inicial de Solver...");
                            AppInicio AppInicio = new AppInicio();
                            AppInicio.setExtendedState(MAXIMIZED_BOTH);
                            AppInicio.setVisible(true);
                            AppInicio.setLocationRelativeTo(SolverST.this);
                            SolverST.this.dispose();
                            break;
                    }
                    Thread.sleep(50);
                }
            } catch (InterruptedException ex) {
                Logger.getLogger(SolverST.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    // Variables declaration - do not modify                    
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel_stEstado;
    private javax.swing.JProgressBar jProgressBar_LoadAppInicio;
    // End of variables declaration                  
}

Más adelante publicaré la arquitectura utlizada para que esto funcione... y mejore la velocidad de acceso a la base de datos...

Gracias,..

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Re: velocidad ...

¿Tienes algún plan para cuando la conexión a la base de datos se pierda, ya no sea válida, etc.?

Por cierto, te recomiendo que utilices las Java Code Conventions [PDF]. Hay una versión en español: Convenciones de Código para el lenguaje de programación JAVA [PDF].

Sobre las convenciones y en

Sobre las convenciones y en específico sobre tu código:

paquetes: en minúsculas
clases: inician en mayúscula y camel case.
métodos y variables: inician en minúscula y camel case

c3p0 es un buen pool de conexiones fácil de usar, quizá te convendría revisarlo en vez de tener todo en variables de clase.

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

En el manejo de excepciones se pueden manejar varios tipos de excepción a la vez:

http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-mul...

Imagen de apolonioluis

Yank jdbc

yo uso yank y los parametros de la db se establecen por properties (puedes tener varias bases de datos), creas un DAO y luego en 5-6 lineas haces las consultas, updates, etc.

es muy ligera y rapida es un layer sobre dbutils y hikari (conn pool) no es ORM.