Как указать jdbc / DataSource? - PullRequest
       8

Как указать jdbc / DataSource?

3 голосов
/ 13 января 2012

Я пытаюсь установить соединение с базой данных оракула, используя примеры кодов, подобных этому:

public static Connection getConnection() throws ClassNotFoundException {
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Properties env = new Properties();
    //env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://192.168.1.1:389/o=myo,dc=mydc,dc=us");
    Connection connection = null;

    try {
        InitialContext context = new InitialContext(env);
        DataSource dataSource = (DataSource) context.lookup("jdbc/DataSource");
        connection = dataSource.getConnection();
    } catch (NamingException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }

    return connection;
}

Но всегда выдается исключение, например:

javax.naming.InvalidNameException: jdbc: [LDAP: error code 34 - invalid DN]; remaining name 'jdbc/DataSource'

Где икак мне указать этот jdbc / DataSource?

Я запутался, поскольку мне дали рабочий проект, использующий коды, аналогичные описанным выше, но нигде не сказано, что такое DataSource.Мне интересно, должен ли jdbc / DataSource быть DN в LDAP, но я не вижу ничего подходящего в моих данных ldap.Извините, если этот вопрос глуп или не имеет смысла, я новичок во всем этом.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Проучившись несколько недель, наконец, составьте решение, как показано ниже.Надеюсь, что это может помочь другим в случае, если они столкнутся с той же проблемой.

Я должен был переключить веб-приложение с WebSphere на Tomcat, где приложение получает соединения из каталога в WebSphere.У Tomcat нет этого каталога, но он может указать это в server.xml / context.xml / web.xml, но я так и не смог заставить его работать!Поэтому я решил использовать каталог на основе файлов:

public static Connection getConnection() throws ClassNotFoundException {
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Properties env = new Properties();

    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
    env.put(Context.PROVIDER_URL, "file:/C://JNDI");

    Connection connection = null;

    try {
        InitialContext context = new InitialContext(env);
        DataSource dataSource = (DataSource) context.lookup("jdbc/DataSource");
        connection = dataSource.getConnection();
    } catch (NamingException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }

    return connection;
}

Просто изменил две строки в env.put и работает нормально.Но есть некоторая подготовительная работа для создания директории на основе файлов, и вот программа, которая создает файл C: \ JNDI.binding

public static void main(String args[]) throws SQLException, NamingException {

    Context ctx = null;
    try {
        Properties prop = new Properties();
        prop.setProperty(Context.INITIAL_CONTEXT_FACTORY,
                "com.sun.jndi.fscontext.RefFSContextFactory");
        prop.setProperty(Context.PROVIDER_URL, "file:/C:/JNDI");
        ctx = new InitialContext(prop);

        OracleDataSource ds = new OracleDataSource();
        ds.setDriverType("thin");
        ds.setServerName("123.123.123.123");
        ds.setPortNumber(1521);
        ds.setDatabaseName("xe");
        ds.setUser("username");
        ds.setPassword("password");
        ctx.bind("jdbc/DataSource", ds);

    } catch (NamingException ne) {
        System.err.println(ne.getMessage());

        ne.printStackTrace();
    }

}

Чтобы он работал в моей производственной среде и тестирую tomcat, я простоиспользование различных настроек INITIAL_CONTEXT_FACTORY зависит от файла свойств,

Спасибо Олафу за большую помощь!

0 голосов
/ 13 января 2012

Если ваш код раньше работал в WebSphere, я предполагаю, что контекст jdbc может быть внутри контекста jee: jndi-lookup. Можете ли вы попробовать поискать «jee: jndi-lookup / jdbc / DataSource» или «java: comp / env / jdbc / DataSource»?

Вам следует попробовать браузер каталогов GUI, чтобы просмотреть каталог OpenLDAP и выяснить, в каком контексте определен ваш источник данных.

0 голосов
/ 13 января 2012

Получил это от http://kb2.adobe.com/cps/195/tn_19576.html:

Ошибка: ошибка в привязке из источника LDAP: [LDAP: код ошибки 34 - недопустимое DN] javax.naming.InvalidNameException

Причина: это вызвано неправильным префиксом, указанным на вкладке «Настройки» в большинстве систем LDAP / AD.Это может означать, что вы вообще не указали префикс, что означает, что сервер LDAP / AD не получил полное DN от CPS, или что вы не указали правильный префикс, такой как CN вместо UID, что приводит к LDAP /Сервер AD не получает правильное DN от CPS.Может также быть вызвано отсутствующей запятой в начале суффикса или дополнительной запятой в конце суффикса.Эта ошибка также может означать, что тип аутентификации неверен.

...