2013-01-26 34 views
8

में C3PO कनेक्शन पूल मैं अपने जावा प्रोग्राम में अनुवर्ती कोड है कि मुझे मेरे Postgres डेटाबेस में एक फ़ाइल से डेटा कॉपी करने की अनुमति देता है:प्रतिलिपि से और Postgres

Connection con = DriverManager.getConnection("jdbc:postgresql://localhost:####/myDb", 
                "myuser", "mypassword"); 
CopyManager cm = new CopyManager((BaseConnection) con); 
cm.copyIn("COPY prices FROM STDIN WITH DELIMITER AS ','", 
      new BufferedReader(new FileReader(filepath)), buffersize); 

इस कोड को ठीक काम करता है, लेकिन मैं चाहते हैं मेरे कनेक्शन को प्रबंधित करने के लिए कनेक्शन पूल का उपयोग करने के लिए, क्योंकि मेरे पास यह कोड कई फ़ाइलों के लिए चल रहा है। इसलिए मैंने C3P0 का उपयोग किया।

public static final ComboPooledDataSource cpds = new ComboPooledDataSource(); 

public class MyPooledConnection { 
MyPooledConnection() throws PropertyVetoException { 
    cpds.setDriverClass("org.postgresql.Driver"); 
    cpds.setJdbcUrl("jdbc:postgresql://localhost:5432/myStockDatabase"); 
    cpds.setUser("myUserName"); 
    cpds.setPassword("myPassword"); 
    cpds.setInitialPoolSize(4); 
    cpds.setMinPoolSize(4); 
    cpds.setMaxIdleTime(30); 
    cpds.setMaxPoolSize(MAX_CONNECTIONS); 
} 

public static Connection getConnection() { 
    return cpds.getConnection(); 
} 
} 

हालांकि, जब मैं ऊपर कनेक्शन पूल से एक कनेक्शन हो और नीचे दिए गए उदाहरण में तरह CopyManager साथ इसका इस्तेमाल करने की कोशिश करते हैं, कोड

Connection pooled_con = MyPooledConnection.getConnection(); 
CopyManager cm = new CopyManager((BaseConnection) pooled_con); 
cm.copyIn("COPY prices FROM STDIN WITH DELIMITER AS ','", 
      new BufferedReader(new FileReader(filepath)), buffersize); 

मेरा अनुमान है कि काम नहीं करता है समस्या कनेक्शन के साथ है, लेकिन मुझे यह पता लगाना प्रतीत नहीं होता कि इसके बारे में क्या अलग है। मैंने SQLException और IOException के साथ त्रुटि को पकड़ने का प्रयास किया है, लेकिन यह या तो पकड़ नहीं है। क्या किसी ने इसका सामना किया है?

---- UPDATED ----

धन्यवाद इस पर मार्गदर्शन a_horse_with_no_name करने के लिए। निम्नलिखित कोड मेरे लिए काम किया

// Cast the connection as a proxy connection 
C3P0ProxyConnection proxycon = (C3P0ProxyConnection)cpds.getConnection(); 
try { 

    // Pass the getCopyAPI (from PGConnection) to a method 
    Method m = PGConnection.class.getMethod("getCopyAPI", new Class[]{}); 
    Object[] arg = new Object[] {}; 

    // Call rawConnectionOperation, passing the method, the raw_connection, 
    // and method parameters, and then cast as CopyManager 
    CopyManager cm = (CopyManager) proxycon.rawConnectionOperation(m, 
             C3P0ProxyConnection.RAW_CONNECTION,arg); 
    cm.copyIn("COPY prices FROM STDIN WITH DELIMITER AS ','", new BufferedReader(new 
               FileReader(filepath)), buffersize); 
} catch (NoSuchMethodException | IllegalAccessException 
         | IllegalArgumentException | InvocationTargetException e) { 
    // Deal with errors here 
} 
+1

त्रुटि का पूरा स्टैक ट्रेस है? आप एक कन्स्ट्रक्टर से स्थिर क्षेत्र क्यों शुरू कर रहे हैं? और आपको क्या लगता है कि सी 3 पी 0 द्वारा लौटाए गए कनेक्शन बेसकनेक्शन के उदाहरण हैं (जो भी हो सकता है?) –

+0

काम करने से आपका क्या मतलब है? किसी भी प्रकार का कोई अपवाद फेंक दिया गया है? क्या यह लटका है? – AHungerArtist

+0

@AHungerArtist: "काम नहीं करता" जैसा कि फ़ाइल में डेटा में तालिका में कॉपी नहीं किया गया है। कोई अपवाद फेंक दिया गया है, न ही यह लटका है; यह अभी भी जारी है जैसे कोड निष्पादित किया गया था। – Jaycal

उत्तर

4

पूल आप "मूल" कनेक्शन नहीं दे करता है, यह हमेशा एक प्रॉक्सी वस्तु बाहर हाथ:

मैनुअल से:

C3P0 wraps इन ऑब्जेक्ट्स को प्रॉक्सी के पीछे, इसलिए आप विक्रेता-विशिष्ट कार्यान्वयन कक्षाओं में सी 3 पी 0-रिटर्न कनेक्शन या स्टेटमेंट्स नहीं डाल सकते हैं

आप शायद C3P0 का उपयोग कर CopyManager का उपयोग नहीं कर सकते हैं। मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन हो सकता है आप समाधान यहाँ वर्णित का उपयोग कर सकते हैं: http://www.mchange.com/projects/c3p0/#raw_connection_ops

कि काम नहीं करता है आप एक अलग कनेक्शन पूल का उपयोग करना चाहें (उदाहरण के लिए नई Tomcat 7 JDBC-Pool) आप अंतर्निहित देशी कनेक्शन तक पहुँच देता है ।

+0

सही दिशा में मुझे इंगित करने के लिए धन्यवाद। कच्चा कनेक्शन वह है जो मुझे इसे काम करने के लिए आवश्यक था। मैं अपनी मूल पोस्ट को उस कोड के साथ अपडेट करूंगा जिसका उपयोग मैंने किया था। – Jaycal