2011-08-05 11 views
14

Quiero copiar datos del archivo a DB de PostgreSQL usando JDBC. Estaba usando el objeto de declaración JDBC para copiar el archivo en DB. Es muy lento.cómo copiar datos de un archivo a PostgreSQL usando JDBC?

Llegué a saber que también podemos usar el comando de copiado para copiar el archivo a DB. Pero, ¿cómo hago con JDBC? Incluso un buen material de referencia con un ejemplo de copia en JDBC ayudaría.

PD: gracias de antemano

+1

Muéstrenos el código, y podríamos explicar por qué es lento. En particular, ¿estás usando actualizaciones por lotes? ¿Estás usando declaraciones preparadas? –

+0

Sí, estoy haciendo actualizaciones por lotes. – Reddy

Respuesta

27

Esto funciona ...

import java.io.FileReader; 
import java.sql.Connection; 
import java.sql.DriverManager; 

import org.postgresql.copy.CopyManager; 
import org.postgresql.core.BaseConnection; 

public class PgSqlJdbcCopyStreamsExample { 

    public static void main(String[] args) throws Exception { 

     if(args.length!=4) { 
      System.out.println("Please specify database URL, user, password and file on the command line."); 
      System.out.println("Like this: jdbc:postgresql://localhost:5432/test test password file"); 
     } else { 

      System.err.println("Loading driver"); 
      Class.forName("org.postgresql.Driver"); 

      System.err.println("Connecting to " + args[0]); 
      Connection con = DriverManager.getConnection(args[0],args[1],args[2]); 

      System.err.println("Copying text data rows from stdin"); 

      CopyManager copyManager = new CopyManager((BaseConnection) con); 

      FileReader fileReader = new FileReader(args[3]); 
      copyManager.copyIn("COPY t FROM STDIN", fileReader); 

      System.err.println("Done."); 
     } 
    } 
} 
+0

[dialecto de pedal] (https://github.com/eclecticlogic/pedal-dialect) le permite usar el comando de copia directamente con entidades JPA. –

+0

El molde '(BaseConnection) con' podría no funcionar; en ciertos casos, la conexión se envuelve en algún otro tipo de conexión (por ejemplo, cuando se utilizan grupos de conexión o espías). Lo que funcionó para mí fue usar 'con.unwrap (BaseConnection.class)' en su lugar. – avivr

1

(basado en aliasmrchips' respuesta :) si usted tiene un maravilloso entorno (como yo usarlo dentro ANT) podría hacerlo así (sustituyendo los detalles de Oracle con Postgres):

// exec.groovy 
this.class.classLoader.rootLoader.addURL('${postgres-jdbc-driver-path}') 
PgScript.load() 

// PgScript.groovy 
// (we cannot use the org.postgres.* classes in exec.groovy already!) 
import java.io.FileReader 
import java.sql.DriverManager 
import org.postgresql.copy.CopyManager 
import org.postgresql.core.BaseConnection 

class PgScript { 
    public static void load() {  
     new CopyManager((BaseConnection) DriverManager.getConnection( 
      '${jdbc-db-url}', '${db-usr}', '${db-usr-pass}') 
     ).copyIn('COPY t FROM STDIN', new FileReader('${sqlfile}')) 
    } 
} 

Basado también en este javaworld.com article.

Cuestiones relacionadas