2011-08-05 11 views
14

मैं जेडीबीसी का उपयोग कर फ़ाइल से डेटा को PostgreSQL डीबी में कॉपी करना चाहता हूं। मैं फ़ाइल को डीबी में कॉपी करने के लिए जेडीबीसी स्टेटमेंट ऑब्जेक्ट का उपयोग कर रहा था। यह बहुत धीमा है।जेडीबीसी का उपयोग कर फ़ाइल से डेटा को PostgreSQL में कॉपी करने के लिए कैसे?

मुझे पता चला कि हम फ़ाइल को डीबी में कॉपी करने के लिए कॉपी आउट कमांड का भी उपयोग कर सकते हैं। लेकिन, मैं जेडीबीसी के साथ कैसे करूं? यहां तक ​​कि जेडीबीसी में कॉपी का उदाहरण रखने वाली अच्छी संदर्भ सामग्री भी मदद करेगी।

पुनश्च: अग्रिम

+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

[पेडल-डायलेक्ट] (https://github.com/eclecticlogic/pedal-dialect) आपको जेपीए इकाइयों के साथ सीधे कॉपी कमांड का उपयोग करने की अनुमति देता है। –

+0

कास्ट '(बेसकनेक्शन) con' काम नहीं कर सकता है; कुछ मामलों में कनेक्शन किसी अन्य कनेक्शन प्रकार में लपेटा जाता है (उदाहरण के लिए कनेक्शन पूल या जासूसों का उपयोग करते समय)। मेरे लिए क्या काम किया गया था 'con.unwrap (BaseConnection.class)' का उपयोग करना था। – avivr

1

(aliasmrchips' जवाब :) के आधार पर यदि आप एक ग्रूवी पर्यावरण है (जैसे मुझे इसे चींटी के भीतर का उपयोग कर) आप इसे ऐसा कर सकते हैं (पोस्टग्रेज़ के साथ ओरेकल विनिर्देशों को प्रतिस्थापित करना):

// 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 पर भी आधारित है।

संबंधित मुद्दे

 संबंधित मुद्दे