2011-08-05 41 views
14

我想使用JDBC將數據從文件複製到PostgreSQL數據庫。我正在使用JDBC語句對象將文件複製到數據庫中。它非常緩慢。如何使用JDBC將數據從文件複製到PostgreSQL?

我開始知道我們也可以使用copy out命令將文件複製到數據庫。但是,我如何處理JDBC。即使是在JDBC中有一個副本的好參考資料也會有所幫助。

PS:在此先感謝

+1

向我們展示代碼,我們可以解釋爲什麼它很慢。特別是,你使用批量更新?你在使用準備好的語句嗎? –

+0

是的,我正在做批量更新。 – Reddy

回答

27

這工作...

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

[pedal-dialect](https://github.com/eclecticlogic/pedal-dialect)允許您直接使用JPA實體的複製命令。 –

+0

鑄造'(BaseConnection)con'可能不起作用;在某些情況下,連接會以某種其他連接類型進行封裝(例如,在使用連接池或間諜時)。對我來說有效的是使用'con.unwrap(BaseConnection.class)'代替。 – avivr

1

(基於aliasmrchips'答案:)如果你有一個的Groovy環境(像我一樣使用它ANT內)你可以這樣做(用Postgres代替Oracle的細節):

// 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}')) 
    } 
} 

也基於此javaworld.com article

相關問題