проблема с источником данных JNDI в Tomcat

Мне было трудно заставить работать источник данных JNDI. Следуйте инструкциям на странице http://tomcat.apache.org/tomcat-5.5-doc/jndi-resources-howto.html Я подключаюсь к оракулу с помощью Tomcat 5.5. Я могу подключиться нормально, если использую прямое соединение JDBC в коде.

Вот что у меня есть: в моем META-INF/context.xml:

<Resource name="jdbc/mydb" auth="Container"
          type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
          url="jdbc:oracle:thin:theserver:1521/mydb"
          username="user" password="password" maxActive="20" maxIdle="10"
/>

вот что в web.xml:

<resource-ref>
  <description>please work</description>
  <res-ref-name>jdbc/mydb</res-ref-name>
    <res-type>
    javax.sql.DataSource
    </res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

вот код:

   Connection conn = null;
    try{
    InitialContext ic = new InitialContext();
    DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/mydb");
    conn = ds.getConnection();
    } catch ....... etc.

Я пробовал много разных конфигураций и начал новый, простой проект, чтобы убедиться, что дополнительные файлы jar не конфликтуют или что-то в этом роде, но .

может ли кто-нибудь увидеть что-нибудь, что не выглядит правильно?

ошибка на сервере указывает на NullPointerException, когда я пытаюсь использовать объект conn. извините, сначала предлагает: org.apache.tomcat.dbcp.dbcp.SQLNestedException: невозможно создать PoolableConnectionFactory (исключение Io: сетевой адаптер не смог установить соединение)


person mcgyver5    schedule 01.12.2009    source источник


Ответы (3)


URL-адрес базы данных кажется мне сломанным.

пытаться:

jdbc:oracle:thin:@theserver:1521/mydb
person Sylar    schedule 01.12.2009
comment
благодаря. это была локальная проблема. Однако при развертывании на сервере возникает другая проблема, о которой я укажу ниже. - person mcgyver5; 01.12.2009
comment
Проблема на сервере теперь org.apache.commons.dbcp.SQLNestedException: не удается создать драйвер JDBC класса '' для подключения URL-адреса 'null', некоторые другие потоки указывают, что мне нужно установить путь и docBase в моем элементе контекста? Не могу заставить это работать. - person mcgyver5; 01.12.2009
comment
Где на сервере находится файл jar драйвера оракула? - person nos; 01.12.2009
comment
нет, он находится в TOMCAT_HOME/common/lib. Хм. он также находится в TOMCAT_HOME/webapps/MyTestApp/WEB-INF/lib - person mcgyver5; 01.12.2009
comment
ух ты. какая боль. Судя по ветке theserverside.com/discussions/thread.tss?thread_id=25459 такие вещи причиняют боль уже 5 лет. Моя проблема заключалась в том, что, несмотря на то, что я несколько раз менял context.xml, сервер сохранял старые данные контекста, поэтому имя ресурса было неверным. он находится в TOMCAT_HOME/conf/Catalina/localhost/XXXXX.xml, где XXXXX — это имя моего приложения. - person mcgyver5; 01.12.2009
comment
Правильно, Tomcat копирует ваш META-INF/context.xml из вашего файла .war в /catalina/yourhost/yourapp.xml во время развертывания и не перезаписывает его, если он уже там, он сохраняет старый файл. Таким образом, для чистого развертывания вам необходимо удалить файл .war, каталог с развернутым файлом .war и файл конфигурации контекста из /catalina/yourhost/. Я думаю, что когда вы отменяете развертывание приложения из приложения менеджера tomcat, все эти шаги выполняются автоматически. - person Sylar; 02.12.2009

"Сетевому адаптеру не удалось установить соединение"

Это ваша подсказка. Он не может получить доступ к базе данных. Проверьте правильность вашего сервера и порта, убедитесь, что они доступны с вашего компьютера.

person Sean Owen    schedule 01.12.2009

Я отвечаю на комментарии в ответе Себастьяна.

Когда я вижу org.apache.commons.dbcp, это означает, что Tomcat использует встроенную библиотеку пула соединений с базой данных Apache Commons вместо библиотеки в драйвере JDBC Oracle.

Драйвер Oracle JDBC, не находящийся в общем каталоге, обычно является первой проблемой, которую я пытаюсь решить. Похоже, это не ваша проблема.

Во-вторых, при запуске приложения, если возникла проблема с созданием источника данных JNDI, Tomcat может использовать библиотеку Commons. Это может быть ваш случай из-за неправильного URL-адреса базы данных. Исправление context.xml или скопированного/переименованного файла в каталоге conf/Catalina/localhost может не решить проблему без остановки и перезапуска Tomcat. Итак, я бы рекомендовал остановить и перезапустить Tomcat и посмотреть, решит ли это проблему.

И последнее замечание: ссылка, которую вы предоставляете, предназначена для настройки библиотеки Common. Мне потребовалось некоторое время, чтобы понять это. Ниже приведен пример одного из моих определений источника данных JNDI Oracle.

  <Resource auth="Container" name="jdbc/mydb" 
    type="oracle.jdbc.xa.client.OracleXADataSource"
    driverClassName="oracle.jdbc.driver.OracleDriver"
    factory="oracle.jdbc.pool.OracleDataSourceFactory"
    url="jdbc:oracle:thin:@theserver:1521:mydb" 
    connectionCachingEnabled="true"
    connectionCacheProperties="{InactivityTimeout=1800,PropertyCheckInterval=300,MaxStatementsLimit=125,ValidateConnection=true}"
    implicitCachingEnabled="true"/>

Я не уверен, имеет ли значение тип в вашем случае, и я считаю, что пользователь и пароль по-прежнему являются атрибутами тега ресурса. Я хочу отметить атрибут connectionCacheProperties. Вот где укажите вы указываете максимальное и минимальное количество подключений. Перейдите к Свойствам кэша подключения. больше информации об этом атрибуте.

Надеюсь это поможет.

person prof401    schedule 01.12.2009