Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Database connection pool and Tomcat


Автор: elnino 13.4.2006, 16:40
Проблема:
При попытке создания пула соединений к базе данных падает
Код

org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:780)
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
.......
Caused by: java.sql.SQLException: No suitable driver
    at java.sql.DriverManager.getDriver(DriverManager.java:243)
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:773)

Используемое программное обеспечение:
  • jakarta-tomcat-5.0.28
  • jdk-1.5.0_05
  • Connector/J (mysql-connector-java-3.1.12-bin.jar) лежит в common/lib
По сути проблема сводится к тому, что томкат не может найти параметры соединения с базой данных.

Параметры соединения задаются следующим образом:
Код

<Context backgroundProcessorDelay="5" docBase="myapp" reloadable="true" debug="true" path="/mypath">
  <Resource name="jdbc/MySQLDB"
               auth="Container"
               type="javax.sql.DataSource"/>

  <ResourceParams name="jdbc/MySQLDB">
    <parameter>
      <name>factory</name>
      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
    </parameter>
    <parameter>
      <name>maxActive</name>
      <value>10</value>
    </parameter>
    <parameter>
      <name>maxIdle</name>
      <value>5</value>
    </parameter>
    <parameter>
      <name>maxWait</name>
      <value>10000</value>
    </parameter>
    <parameter>
     <name>username</name>
     <value>username</value>
    </parameter>
    <parameter>
     <name>password</name>
     <value>password</value>
    </parameter>
    <parameter>
       <name>driverClassName</name>
       <value>com.mysql.jdbc.Driver</value>
    </parameter>
    <parameter>
      <name>url</name>
      <value>jdbc:mysql://localhost:3306/mydatabase</value>
    </parameter>
  </ResourceParams>

</Context>

При попытке создания пула коннектов:
Код

            Context initContext = new InitialContext();
                Context envContext = (Context) initContext
                        .lookup("java:/comp/env");
                pool = (DataSource) envContext.lookup("jdbc/MySQLDB");
Connection connection = pool.getConnection();

Вылетает исключение, описанное выше.

На apache-tomcat-5.5.12 прекрасно работает следующая конфигурация:
Файл /apache-tomcat-5.5.12/webapps/myapp/META-INF/context.xml:
Код

<Context backgroundProcessorDelay="5" docBase="myapp" reloadable="true" debug="true" path="/mypath">
<Resource name="jdbc/MySQLDB"

        auth="Container"

        type="javax.sql.DataSource"

        username="username"

        password="password"

        driverClassName="com.mysql.jdbc.Driver"

        url="jdbc:mysql://localhost:3306/mydatabase"

        maxActive="10"

        maxIdle="5"

        maxWait="10000"

        validationQuery="SELECT 1"/>
</Context>

Файл /apache-tomcat-5.5.12/webapps/myapp/WEB-INF/web.xml:
Код

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app>

 .......
    
    <resource-ref>
        <res-ref-name>jdbc/MySQLDB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
    
</web-app>


Пробовал прописывать контекст в server.xml,
класть myapp.xml в conf/Catalina/[host],
прописывал параметры соединения в GlobalNamingResources.

Не работает.

На дебаггере обнаруживается, что томкату известно имя "jdbc/MySQL", но при этом ВСЕ параметры соединения инициализированы дефолтовыми значениями.
(В том числе url=null, password=null и.т.д)

Есть ли кто-то, кто юзал пул коннектов на Tomcat-5.0.28? Скажите, пожалуйста, каким образом вы сконфигурировали свое приложение smile

Спасибо.

Автор: tux 13.4.2006, 17:15
Встречный вопрос. А та конфигурация, которую ты приводишь описывается в META-INF/context.xml, как и в случае с 5.5.12?
Видишь ли, похоже, что Tomcat использует context.xml только в том случае если для развертывания использовать его менеджер. Если разворачиваешь просто копированием war-файла, то попробуй положить этот context.xml в conf/Catalina/localhost с именем, соответствующим имени приложения, например, myapp.xml.

Если не поможет, опиши где у тебя определяется источник данных.

Автор: Tony 13.4.2006, 19:00
Код

InitialContext initCtx=new InitialContext();
DataSource ds=(DataSource)initCtx.lookup("java:comp/env/jdbc/your_name");
Connection conn=ds.getConnection();

Попробуй.

Автор: anti_snayper 15.7.2008, 23:15
Подобнвая проблема: пытаюсь с помощью Tomcat создать пул соеденений с базой данных MSSQL.
При создании Connection вылетает ошибка:
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'

Context.xml: 
Код

<Context>
<Resource auth="Container" name="jdbc/storeDB" type="javax.sql.DataSource"/>
    <ResourceParams name="jdbc/storeDB">
        <parameter>
            <name>factory</name>
            <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
        </parameter> 
        <parameter>
            <name>maxActive</name>
            <value>30</value>
        </parameter> 
        <parameter>
            <name>maxIdle</name>
            <value>10</value>
        </parameter> 
        <parameter>
            <name>maxWait</name>
            <value>10000</value>
        </parameter> 
        
        <parameter>
            <name>driverClassName</name>
            <value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value>
        </parameter> 
        <parameter>
            <name>url</name>
            <value>jdbc:sqlserver://localhost:1433:TestDB;User=***;Password=***</value>
        </parameter>
    </ResourceParams> 
</Context>


web.xml:
Код

<resource-ref>
      <description>DB connection</description>
      <res-ref-name>jdbc/storeDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
   </resource-ref>



Код

private Context    initContext   = null;
private Context    envContext    = null;
private DataSource dataSource    = null;
private Connection connection    = null;

initContext = new InitialContext();
envContext = (Context) initContext.lookup("java:comp/env");
dataSource = (DataSource) envContext.lookup("jdbc/storeDB");
connection = dataSource.getConnection();


Цитата

Код

InitialContext initCtx=new InitialContext();
DataSource ds=(DataSource)initCtx.lookup("java:comp/env/jdbc/your_name");
Connection conn=ds.getConnection();

Попробуй.

Не помогает

Может кто-нить помочь? 

Автор: anti_snayper 16.7.2008, 22:47
Народ, хотя бы посоветуйте какую-нибудь толковую литературу на эту тему. Уже несколько дней на одном месте топчусь, то одна ошибка то другая.

Автор: garbuz 29.7.2008, 02:32
Возникает аналогичный эксепшн. Никак не победить. Кто-нибудь разобрался???
Самое интересное, что если запускать из-под IDE, то все валится, а если запускать руками томкат и в браузере забивать нужный адрес, то все работает. Как с этим бороться?  smile 

Автор: necromancer 30.7.2008, 11:53
обычно проблема эта возникает в 2-х случаях:
1. неправильная конфигурация контекста приложения
2. наличие лишней библиотеки

Второй пункт лечится путем проверки не находится ли mysql.jar в друх папках: commons/lib и WEB_INF/lib
первый же целиком зависит от версии веб сервера
вот пример точно работающий на Tomcat 5:
Код

<?xml version="1.0" encoding="UTF-8"?>
<Context displayName="Ras Project" path="/">
    <Resource name="jdbc/sunshine" auth="Container"
              type="javax.sql.DataSource" username="sunshine" password="sunshine"
              driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/sunshine?zeroDateTimeBehavior=convertToNull"
              maxActive="130" maxIdle="115"/>
</Context>


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)