كيفية استخدام برنامج تشغيل JDBC من مكان التعسفي

StackOverflow https://stackoverflow.com/questions/288828

  •  08-07-2019
  •  | 
  •  

سؤال

وأنا بحاجة لاختبار اتصال JDBC إلى قاعدة بيانات. يجب أن يكون الرمز جافا للقيام بهذه البساطة كما:

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

ومدير السائق سوف يفحص المناسبة برنامج تشغيل URL اتصال معينة. ولكن أنا بحاجة إلى أن تكون قادرة على تحميل برنامج تشغيل JDBC (جرة) في وقت التشغيل. أي بمعنى ليس لدي السائق JDBC على CLASSPATH من تطبيق جافا الذي يمتد مقتطف الشفرة أعلاه.

وهكذا يمكنني تحميل برنامج التشغيل باستخدام هذا الرمز، على سبيل المثال:

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

ولكن بعد ذلك مدير السائق لا يزال لن يستلم وأنا لا أستطيع أن أقول ذلك الذي classloader لاستخدام. حاولت وضع classloader السياق موضوع الحالي وأنه لا يزال لا يعمل.

وأي شخص لديه أي فكرة عن أفضل طريقة لتحقيق ذلك؟

هل كانت مفيدة؟

المحلول

ومن المادة اختيار السائق JDBC في وقت التشغيل . أنا مجرد الذهاب للنشر الشفرة هنا للرجوع إليها.

والفكرة هي لخداع إدارة برنامج تشغيل إلى التفكير في أن السائق كان تحميله من classloader النظام. للقيام بذلك نستخدم هذه الفئة:

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 النظام. لديك الآن فقط لتحميل برنامج التشغيل الذي تريد حقا أن استخدام باستخدام أي 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

نصائح أخرى

والمشكلة هي DriverManager ينفذ "المهام باستخدام المثال محمل فئة المتصل الفوري ل". انظر المبدأ التوجيهي 6-3 من الآمنة الترميز المبادئ التوجيهية ل لغة البرمجة جافا، الإصدار 2.0 . محمل الطبقة نظام ليست في طريقة خاصة في هذه القضية.

وفقط لركلات، كتبت دخول بلوق على هذا الموضوع من حين الى الوراء. بلدي الحل، وإن كان أكثر تعقيدا ثم نيك الساير في حل ، هو أكثر اكتمالا وحتى يعمل من التعليمات البرمجية غير موثوق بها. لاحظ أيضا ويفضل URLClassLoader.newInstance على new URLClassLoader.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top