Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вытащить подключение к БД из контекста Tomcat? Надо достать DataSourse из контекста. 
V
    Опции темы
Aoli
Дата 7.2.2007, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 24.1.2007

Репутация: -1
Всего: 0



Понадобилось переписать программу (это я к тому, что раньше все работало ОК). Прогоняю тесты. Первый сразу же вылетает с такой ошибкой:
Код

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:780)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
    at test.TestDB.doGet(TestDB.java:27)
    ...
Caused by: java.lang.NullPointerException
    at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(JdbcOdbcDriver.java:507)
    at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(JdbcOdbcDriver.java:476)
    at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(JdbcOdbcDriver.java:307)
    at java.sql.DriverManager.getDriver(DriverManager.java:253)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:773)
    ... 19 more

Код тестового сервлета:
Код

public class TestDB extends HttpServlet {
    protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
        DataSource ds = null;
        try {
            Context initContext = new InitialContext();
            Context envContext = null;
            envContext = (Context) initContext.lookup("java:/comp/env");
            ds = (DataSource) envContext.lookup("library");
        } catch (NamingException e) {
            e.printStackTrace();
        }

        try {
            Connection conn = ds.getConnection(); // здесь SQLException
            ...
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Проверил отладчиком: в envContext (в его HashMap) есть объект по ключу "library". ds - не пустой. Однако все поля ds - либо null, либо 0.
В чем проблема - понять не могу smile
Контекст:
Код

<Context path="/">
    <Resource name="library" auth="Container" type="javax.sql.DataSource"
              maxActive="100" maxIdle="30" maxWait="10000"
              username="sudo" password="XXX" driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/libdb?autoReconnect=true"/>
</Context>

PM WWW ICQ   Вверх
Zamuta
Дата 7.2.2007, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 18.1.2006

Репутация: 4
Всего: 6



Меня здесь смущает <Context path="/">...</Context>

Если это server.xml, то
 
Код

<GlobalNamingResources>
     <Resource
      name="library"
      type="javax.sql.DataSource"
      driverClassName="com.mysql.jdbc.Driver"
      password="password"
      maxIdle="30"
      maxWait="10000"
      username="sudo"
      url="jdbc:mysql://localhost:3306/libdb?autoReconnect=true"
      maxActive="100"/>
  </GlobalNamingResources>


И в web.xml 

Код

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



--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
Aoli
Дата 7.2.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 24.1.2007

Репутация: -1
Всего: 0



В web.xml в <resource-ref> на всякий случай добавил <res-sharing-scope>Shareable</res-sharing-scope>

В Tomcate нет server.xml, поэтому попробовал <GlobalNamingResources> написать в context.xml.

Tomcat не понял шутку. Тот же самый exception.
PM WWW ICQ   Вверх
tux
Дата 7.2.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



В META-INF/context.xml:
Код

<?xml version="1.0" encoding="ISO-8859-1"?>
<Context
docBase="app"
path="/app"
reloadable="true">

<Resource
      name="library"
      type="javax.sql.DataSource"
      driverClassName="com.mysql.jdbc.Driver"
      password="password"
      maxIdle="30"
      maxWait="10000"
      username="sudo"
      url="jdbc:mysql://localhost:3306/libdb?autoReconnect=true"
      maxActive="100"/>

</Context>

В web.xml:
Код

<resource-ref>
        <res-ref-name>library</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
</resource-ref>

А что это за Томкат, у которого нет server.xml? Никогда таких не видел.
PM MAIL Skype GTalk Jabber YIM   Вверх
Aoli
Дата 7.2.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 24.1.2007

Репутация: -1
Всего: 0



Цитата

А что это за Томкат, у которого нет server.xml? Никогда таких не видел. 

Сорри. Нашел в папочке conf.

Вписал в META-INF/context.xml то, что посоветовал tux.
Exception, как ни странно, тот же.
Переписал доставание контекста так:
Код

envContext = (Context) initContext.lookup("java:/comp/env/app");

и получил javax.naming.NameNotFoundException: Name app is not bound in this Context

Т.е., как я понимаю, Tomcat вообще игнорирует мой context.xml???!!!

P.S. в web.xml написано то же, что и у tux.
PM WWW ICQ   Вверх
tux
Дата 7.2.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Здесь
Код

envContext = (Context) initContext.lookup("java:/comp/env/app");

app - это что? Ссылка на источник данных вроде library называется. Или ты что-то другое ищещь?
PM MAIL Skype GTalk Jabber YIM   Вверх
Zamuta
Дата 7.2.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 18.1.2006

Репутация: 4
Всего: 6



Aoli, если ты хочешь получить доступ к java:/comp/env/app, то создай тогда свой ресурс в server.xml
Код

<Resource
      name="app"
      type="javax.sql.DataSource"
      driverClassName="com.mysql.jdbc.Driver"
      password="password"
      maxIdle="30"
      maxWait="10000"
      username="sudo"
      url="jdbc:mysql://localhost:3306/libdb?autoReconnect=true"
      maxActive="100"/>



Теперь имя ресурса у тебя "app", можешь посмотреть это если зайдёшь http://localhost:[port]/admin , пароль от админки лежит в tomcat-users.xml, а обращаться в коде нужно java:/comp/env/app


--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
Aoli
Дата 7.2.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 24.1.2007

Репутация: -1
Всего: 0



Читал доки. Много думал (С).

Создал новый проект.

В server.xml не суюсь.

В context.xml прописал:
Код

<Context path="/">
    <Resource name="jndi/test" type="javax.sql.DataSource"
              maxActive="100" maxIdle="30" maxWait="10000"
              username="root" password="XXX" driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/?autoReconnect=true"/>
</Context>


В web.xml:
Код

<resource-ref>
        <res-ref-name>jndi/test</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
</resource-ref>


В коде сервлета:
Код

public class Test extends HttpServlet {
    protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
        try {
            Context initContext = new InitialContext();
            DataSource ds = (DataSource) initContext.lookup("java:/comp/env/jndi/test");
            Connection c = ds.getConnection();
            Statement s = c.createStatement();
            s.execute("USE LIB");
            ServletOutputStream sos = httpServletResponse.getOutputStream();
            sos.println("ALL OK");
            sos.flush();
            sos.close();
        } catch (NamingException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}


И - чудеса на постном масле: все работает.
Отличий между способом подключения в исходном проекте и в тестовом не нашел.
Почему в исходном проекте не коннектит - не знаю.
Придется пересобирать заново smile

Это сообщение отредактировал(а) Aoli - 8.2.2007, 10:49
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.