2008-11-14 17 views
17

मुझे डेटाबेस में जेडीबीसी कनेक्शन का परीक्षण करने की आवश्यकता है। ऐसा करने के लिए जावा कोड जितना सरल होना चाहिए:एक मनमानी स्थान से जेडीबीसी ड्राइवर का उपयोग कैसे करें

DriverManager.getConnection("jdbc connection URL", "username", "password"); 

चालक प्रबंधक दिए गए कनेक्शन URL के लिए उपयुक्त ड्राइवर को देखेगा। हालांकि मुझे रनटाइम पर जेडीबीसी ड्राइवर (जार) लोड करने में सक्षम होना चाहिए। मेरे पास जावा एप्लिकेशन के क्लासपाथ पर जेडीबीसी ड्राइवर नहीं है जो उपरोक्त कोड के स्निपेट चलाता है।

तो मैं उदाहरण के लिए, इस कोड का उपयोग लोड कर सकते हैं चालक:

URLClassLoader classLoader = new URLClassLoader(new URL[]{"jar URL"}, this.getClass().getClassLoader()); 
Driver driver = (Driver) Class.forName("jdbc driver class name", true, classLoader).newInstance(); 

लेकिन तब ड्राइवर प्रबंधक अभी भी यह लेने नहीं होगा के रूप में मैं इसे नहीं बता सकता जो classloader उपयोग करने के लिए। मैंने वर्तमान थ्रेड के संदर्भ क्लासलोडर को सेट करने का प्रयास किया और यह अभी भी काम नहीं करता है।

किसी को भी इसे प्राप्त करने का सबसे अच्छा तरीका है?

+0

क्या कोई अच्छा कारण है कि आपके पास क्लासपाथ पर ड्राइवर नहीं है? –

+0

हां। एप्लिकेशन कई डेटाबेस से कनेक्ट कर सकते हैं। इसके अलावा मैं लाइसेंसिंग कारणों के लिए सभी ड्राइवरों को बंडल नहीं कर सकता। जो मैं प्राप्त करना चाहता हूं वह उपयोगकर्ता के लिए जार लोड करने के लिए एक साधारण संवाद है, जबकि एप्लिकेशन चल रहा है। – SaM

+0

वहां मैं एक सर्वर-साइड डेवलपर की तरह सोच रहा था ... :) –

उत्तर

17

लेख Pick your JDBC driver at runtime से; मैं संदर्भ के लिए यहां कोड पोस्ट करने जा रहा हूं।

विचार ड्राइवर चालक को यह सोचने के लिए चालित करना है कि ड्राइवर को सिस्टम क्लासलोडर से लोड किया गया था।

public class DelegatingDriver implements Driver 
{ 
    private final Driver driver; 

    public DelegatingDriver(Driver driver) 
    { 
     if (driver == null) 
     { 
      throw new IllegalArgumentException("Driver must not be null."); 
     } 
     this.driver = driver; 
    } 

    public Connection connect(String url, Properties info) throws SQLException 
    { 
     return driver.connect(url, info); 
    } 

    public boolean acceptsURL(String url) throws SQLException 
    { 
     return driver.acceptsURL(url); 
    } 

    public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException 
    { 
     return driver.getPropertyInfo(url, info); 
    } 

    public int getMajorVersion() 
    { 
     return driver.getMajorVersion(); 
    } 

    public int getMinorVersion() 
    { 
     return driver.getMinorVersion(); 
    } 

    public boolean jdbcCompliant() 
    { 
     return driver.jdbcCompliant(); 
    } 
} 

इस तरह चालक आप रजिस्टर प्रकार DelegatingDriver जो प्रणाली classloader से भरा हुआ है की है ऐसा करने के लिए हम इस वर्ग का उपयोग करें। अब आपको उस ड्राइवर को लोड करना होगा जिसे आप वास्तव में जो भी क्लासलोडर चाहते हैं उसका उपयोग करके उपयोग करना चाहते हैं। उदाहरण के लिए:

URLClassLoader classLoader = new URLClassLoader(new URL[]{"path to my jdbc driver jar"}, this.getClass().getClassLoader()); 
Driver driver = (Driver) Class.forName("org.postgresql.Driver", true, classLoader).newInstance(); 
DriverManager.registerDriver(new DelegatingDriver(driver)); // register using the Delegating Driver 

DriverManager.getDriver("jdbc:postgresql://host/db"); // checks that the driver is found 
5

समस्या DriverManager प्रदर्शन "तत्काल फोन करने वाले का वर्ग लोडर उदाहरण का उपयोग कर कार्यों" है। Secure Coding Guidelines for the Java Programming Language, version 2.0 के दिशानिर्देश 6-3 देखें। इस मामले में सिस्टम क्लास लोडर किसी भी तरह से विशेष नहीं है।

बस किक्स के लिए, मैंने कुछ समय पहले इस विषय पर blog entry लिखा था। मेरा समाधान, हालांकि Nick Sayer's solution अधिक जटिल है, और अधिक पूर्ण है और अविश्वसनीय कोड से भी काम करता है। को new URLClassLoader से भी अधिक पसंद किया गया है।

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