Java - Ejecutar Fichero SQL por JDBC

 
Vista:

Ejecutar Fichero SQL por JDBC

Publicado por webness (57 intervenciones) el 11/02/2009 17:45:18
Hola.

Tengo el fichero createTables.sql y necesito que su contenido sea corrido usando JDBC como lo puedo hacer, hasta ahora lo que hago es desde java abrir un bat que lo ejecuta, pero necesito que sea es por medio de jdbc, sin necesidad de abrir fichero bat o sh.

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ejecutar Fichero SQL por JDBC

Publicado por Gerardo y Mely (62 intervenciones) el 12/02/2009 05:38:00
Yo lo que primero haria es una clase que se encarge de abrir mis concexiones con la base de datos, es importante no realizarla como objeto porque de esta forma puedes simular conexiones del tipo JPA, la clase que escribi es:


import java.sql.*;

public class conectaDB {

    private final String dbDrvr = "com.mysql.jdbc.Driver";
    private final String dbName = "DBName";
    private final String dbHost = "jdbc:mysql://localhost:3306/" + dbName;
    private final String dbPort = "3306";
    private String mensajeError = "";

    public Connection dameConexion(String username, String password){
        Connection con = null;

        try{
            Class.forName(dbDrvr).newInstance();
        }catch(ClassNotFoundException cnfe){
            return null;
        }catch(InstantiationException ie){
            return null;
        }catch(IllegalAccessException iae){
            return null;
        }

        try{
            con = DriverManager.getConnection(this.dbHost, username, password);
        }catch(SQLException sqle){
            return null;
        }

        return con;
    }
    
    
    
    

    public boolean hasError(){
        if(this.mensajeError.length() > 0)
            return true;
        return false;
    }

    public String getError(){
        return this.mensajeError;
    }

}


Despues de todo esto lo siguiente es escribirnos una clase que se encargue de las acciones con la base de datos, para ello utilizaremos la clase que previamente escribimos para la conexion a la Base de Datos, digamos que un metodo de la clase se llama executeQuery

public static boolean executeQuery(String query){

        Statement sentencias = null;
        conectaDB connector = new conectaDB();

        Connection con = connector.dameConexion("root", "seminario");

        if(connector.hasError()){
            return false;
        }

        try{
            sentencias = con.createStatement();
            sentencias.executeUpdate(query);
            sentencias.close();
            con.close();
        }catch(Exception e){
            return false;
        }

        return true;

    }



Una vez que tienes el soporte para conectarte a la base de datos y que puedes indicarle que realize un comit a tu DB entonce entramos a lo que nos interesa, vamos a obtener el valor de un archivo SQL


Aqui lo que haremos es leer el documento de texto y retornar el contenido


    public static String obtenContenido(java.io.File documento){
        String sCadena = "";
        String retorno = "";

        if(!documento.exists()){
            return null;
        }

        try{

            BufferedReader bf = new BufferedReader(new FileReader(documento));
            while ((sCadena = bf.readLine()) != null) {
                retorno += sCadena;
            }

        }catch(FileNotFoundException fnfe){
            return null
        }catch(IOException ioe){
            return null;
        }

        return retorno;
    }


Finalmente haremos una funcion complementaria que mandara a leer el documento SQL y creara el Query para hacer el comit a la base de datos

    public static boolean importaQuery(String documento){
        String query = obtenContenido(documento);
        return executeQuery(query);
    }



Aqui se termina todo y como resultado tenemos una pequeña aplicacion capaz de leer un archivo SQL y ejecutarse en java

Espero que te solucione tu problema o al menos te pueda ayudar, si tienes broncas con el codigo o dudas echame un correo ¿vale?


Exito, bye_!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ejecutar Fichero SQL por JDBC

Publicado por webness (57 intervenciones) el 12/02/2009 14:20:54
Hola, muchas gracias por tu ejemplo completico, hay lo tengo de reserva, estoy hagotando la posibilidad de poderlo ejecutar sin necesidad de tener que hacer el algortimo para leerlo, me dijeron que usara esto:

http://mojo.codehaus.org/sql-maven-plugin/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ejecutar Fichero SQL por JDBC

Publicado por Tom (1831 intervenciones) el 12/02/2009 17:58:57
Pues te lees el fichero Tables.sql a un String y luego se lo pasas a un ExecSQL().
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ejecutar Fichero SQL por JDBC

Publicado por webness (57 intervenciones) el 12/02/2009 21:38:08
lo que pasa es que estos ficheros poseen informacion de muchas pero muchas tablas, estan tabulados, tienen comentarios.

Por lo tanto no se puede asumir que cada linea es una sentencia valida, he encotrado algoritmos que hacen todas estas verificaciones, pero hacerlas seria sacrificar el rendimiento de mi aplicacion, puesto que tocaria hacaer este mismo proceso para:

tablas, indices, comentarios, primary keys, f keys, tables, permisos de usuarios, configuraciones, etc.

Asumo que hay muchas de las sentencias de mis ficheros sql que no lsd puedo ejecutar por java, pero a mis jefes les dio que si se puede.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ejecutar Fichero SQL por JDBC

Publicado por Gerardo y Mely (62 intervenciones) el 13/02/2009 05:16:40
El codigo que escribi lo he probado con una base de datos robusta, no sé si sepas que cuando haces un comit a la base de datos no importa cuantos registros o tablas generes, lo importante para ganar velocidad es no abrir y cerrar comunicacion con tu DB. El algoritmo que escribi lo utilizo y sabes?? el unico problema que tengo es cuando obtengo los datos del archivo SQL porque al hacer mis backUps tengo que guardar 79 tablas y la mas grande tiene 2,129,727 registros y tengo varios catalogos que tienen arriba de 1000 registros, cuando hago el restore de la DB me tarda aprox 40 minutos pero el problema no es la concexion con la base de datos, el problema es al leer el archivo SQL ya que al parecer conforme va leyendo va saturando el buffer y alenta los procesos de lectura. Pero no te preocupes hasta el mismo SQLManager tarda un buen de tiempo, osea que sean por peras o por manzanas tendras que gastarte tiempo considerable dependiendo de la magnitud de tu base de datos.

ftp://ftp2.sat.gob.mx/agti_servicio_ftp/verifica_comprobante_ftp/FoliosCFD.txt
ftp://ftp2.sat.gob.mx/agti_servicio_ftp/verifica_comprobante_ftp/CSD.txt

la otra es hacer tu recovery por medio de separadores Pype, la cosa es hacer el elgoritmo que te construya el QUERY, yo lo tengo solucionado pero en realidad el problema es el tiempo de ejecucion


e parece que no te quedara de otra mas que resignarte a que el proceso de restauracion es muy lento, claro que depende de los datos que tengas, ahora bien, me imagino que eso lo haras en caso de que emplees un DRP o algo similar porque no es muy comun en un sistema que tengas que restaurar una version anterior a la base de datos, eso iria en contra de la ingenieria de software porque es como si a ti te borraran la memoria y perdieras una semana de recuerdos, en fin, si lo necesitas es por algo pero de antemano espero que no plenees utilizar restauraciones de DB a cada rato

Saludos!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ejecutar Fichero SQL por JDBC

Publicado por webness (57 intervenciones) el 13/02/2009 17:57:56
Resignacion, listo tu algoritmo me sirve para las sentencias create table, create index, y esta clase de sentencias, el lio, es que tengo unos ficheros sql que hacen compilacion de paquetes de oracle y vainas mas complejas que no estan dentro del dml y el ddl. ES POR eso que no he utilizado tu algoritmo, o que modificacion le podemos hacer, para tambien se puedan ejecutar sentencias de manipulacion de permisos, compilar objetos y cosas por el estilo??? no he econtrado nada
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar