Подтвердить что ты не робот

Как подключиться к источнику данных Websphere с данным JNDI-именем?

Я использую Websphere Portal 7.0 и создаю портлет с RAD 8.0. Мой портлет пытается подключить db2 к удаленному серверу. Я написал программу java локально, чтобы выполнить базовое соединение JDBC с сервером и получить записи из таблицы. Код работает нормально; однако, когда я добавляю код в портлет, а также в db2jcc4.jar, соединение не работает. Я использую основное:

Connection connection = DriverManager.getConnection("jdbc:db2://server:port/db:user=user;password=pw;");

Я полагаю, что использование источника данных Websphere - правильный путь. Я знаю имя JNDI для источника данных, но я не нахожу четких примеров того, как установить соединение. В нескольких примерах используется класс DataSource (я набирал это, и это не похоже на то, что он исходит из собственного пакета java, и какой импорт я использую здесь?) В сочетании с контекстом. Я встретил код вроде:

Context ctx = new InitialContext();
ctx.lookup("jdbc/xxxx");

... Может кто-то сломает это для меня?

РЕДАКТИРОВАТЬ 1

Я обновил свой код в соответствии с указанными вами ответами. Я действительно думаю, что приближаюсь. Вот мой метод getConnection():

private Connection getConnection() throws SQLException {
    javax.naming.InitialContext ctx = null;
    javax.sql.DataSource ds = null;
    System.out.println("Attempting connection..." + DateUtil.now() );
    try {
        ctx = new javax.naming.InitialContext();
        ds = (javax.sql.DataSource) ctx.lookup("java:comp/env/jdbc/db");
        connection = ds.getConnection();
    } catch (NamingException e) {
        System.out.println("peformanceappraisalstatus: COULDN'T CREATE CONNECTION!");
        e.printStackTrace();
    }       
    System.out.println("connection: " + connection.getClass().getName() + " at " + DateUtil.now());
    return connection;
}

Весь мой файл web.xml выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>PeformanceAppraisalStatus</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <resource-ref>
        <description>
        Datasource connection to Db</description>
        <res-ref-name>jdbc/db</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
</web-app>

Я вижу ошибку, которая описывает то, о чем вы, ребята, говорите мне, что Websphere должна побудить меня сделать, но не делает:

SRVE0169I: Loading Web Module: PeformanceAppraisalStatus.
[8/23/11 18:08:02:166 CDT] 00000009 InjectionProc E   CWNEN0044E: A resource reference binding could not be found for the jdbc/db resource reference, defined for the PeformanceAppraisalStatus component.
[8/23/11 18:08:02:169 CDT] 00000009 InjectionEngi E   CWNEN0011E:  The injection engine failed to process bindings for the metadata.

Да, я знаю, что я ошибся в производительности в качестве примера во всем приложении.

Решение

Я был так близко. Вот недостающие бит, которые все это встали на свои места:

web.xml:
<resource-ref>      
    <description>
    Datasource connection to db</description>
    <res-ref-name>jdbc/db</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
    <mapped-name>jdbc/db</mapped-name>      
</resource-ref>

ibm-web-bnd.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-bnd 
    xmlns="http://websphere.ibm.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_0.xsd"
    version="1.0">

    <virtual-host name="default_host" />


    <resource-ref name="jdbc/db" binding-name="jdbc/mydatasource" />
</web-bnd>

Похоже, что файл ibm-web-bnd.xml обрабатывает привязку между именем ресурса проекта и источником данных в websphere. Как только я добавил строку:

<resource-ref name="jdbc/db" binding-name="jdbc/mydatasource" />

Websphere Portal выглядел умиротворенным. Теперь мой код работает и подключается к базе данных.

4b9b3361

Ответ 1

Вам необходимо определить ссылку на ресурс в приложении, а затем сопоставить эту ссылку на логический ресурс для физического ресурса (источника данных) во время развертывания.

В web.xml добавьте следующую конфигурацию (изменяя имена и свойства в зависимости от ситуации):

<resource-ref>
    <description>Resource reference to my database</description>
    <res-ref-name>jdbc/MyDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

Затем во время развертывания приложения WAS предложит вам сопоставить эту ссылку ресурса (jdbc/MyDB) с источником данных, созданным в WAS.

В вашем коде вы можете получить DataSource, похожий на то, как вы показали его в своем примере; однако имя JNDI, которое вы будете использовать для его поиска, должно фактически быть названным ссылочным именем ресурса (res-ref-name), а не JNDI-именем физического источника данных. Кроме того, вам нужно будет префикс res-ref-name с помощью контекста именования приложений (java:comp/env/).

Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/MyDB");

Ответ 2

Чтобы получить соединение с источником данных, следующий код должен работать:

import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

Context ctx = new InitialContext();
DataSource dataSource = ctx.lookup("java:comp/env/jdbc/xxxx");
Connection conn = dataSource.getConnection();

// use the connection

conn.close();

В то время как вы можете напрямую искать источник данных, определенный в конфигурации источников данных Websphere (то есть через консоль websphere), поиск из java: comp/env/jdbc/xxxx означает, что должна быть запись в Интернете .xml:

<resource-ref>
    <res-ref-name>jdbc/xxxx</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

Это означает, что источники данных могут отображаться на основе каждого приложения, и вам не нужно менять имя источника данных, если вы хотите указать свое приложение на другой источник данных. Это полезно при развертывании приложения на разных серверах (например, test, preprod, prod), которые должны указывать на разные базы данных.

Ответ 3

DNS для служб

JNDI нужно подходить с пониманием того, что это локатор сервисов. Когда желаемая служба размещается на том же сервере / node в качестве приложения, то ваше использование InitialContext может работать.

Что делает его более сложным, так это то, что определение источника данных в веб-сфере (по крайней мере, в 4.0) позволило вам определить видимость в разной степени. В основном это добавляет пространства имен в среду, и клиенты должны знать, где размещается ресурс.

Простой пример.

javax.naming.InitialContext ctx = new javax.naming.InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/DataSourceAlias");

Ниже приведена справочная страница IBM .

Если вы пытаетесь ссылаться на источник данных из приложения, которое НЕ находится в контейнере J2EE, вам понадобится немного другой подход, начиная с необходимости использования некоторых J2EE-контейнеров в вашем пути к классам. http://www.coderanch.com/t/75386/Websphere/lookup-datasources-JNDI-outside-EE

Ответ 4

Джейсон

Вот как это работает.

Localnamespace - java: comp/env - это локальное пространство имен, используемое приложением. Имя, которое вы используете в нем jdbc/db, является просто псевдонимом. Он не относится к физическому ресурсу.

Во время развертывания этот псевдоним должен быть сопоставлен с физическим ресурсом (в вашем случае источником данных), который определен в времени выполнения WAS/WPS.

Это фактически хранится в файлах ejb-bnd.xmi. В последних версиях XMI заменяются XML файлами. Эти файлы называются файлами Binding.

НТН Manglu

Ответ 5

Найдите код ниже, чтобы получить соединение с сервером веб-приложений. Просто создайте источник данных на сервере приложений и используйте следующий код для подключения:

// To Get DataSource
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/abcd");
// Get Connection and Statement
Connection c = ds.getConnection();
stmt = c.createStatement();

Импортировать имена и классы sql. Не нужно добавлять какой-либо xml файл или редактировать что-либо в проекте.
Что это..

Ответ 6

Для таких, как я, нужна только информация о том, как подключиться к источнику данных WAS от DB2 с использованием поиска JNDI (используется IBM Websphere 8.5.5 и универсальный поставщик JDBC для DB2 с классом реализации: com.ibm.db2.jcc.DB2ConnectionPoolDataSource):

public DataSource getJndiDataSource() throws NamingException {
    DataSource datasource = null;
    InitialContext context = new InitialContext();
    // Tomcat/Possibly others: java:comp/env/jdbc/myDatasourceJndiName
    datasource = (DataSource) context.lookup("jdbc/myDatasourceJndiName");
    return datasource;
}