2012-02-09 2 views
8

Я пытаюсь настроить пул соединений с mysql databe с tomcat. Мой простое приложение называется Projekt, в моем Projekt.xml в Apache/CONF/Каталина/локальный У меня естьОбъединение соединений Tomcat и JDBC

<Context docBase="Projekt.war" path="/Projekt"> 
    <Resource name="jdbc/mysqldb" 
     auth="Container" 
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
     type="javax.sql.DataSource" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://localhost:3306/Music" 
     username="andrzej" 
     password="qazxsw" 
     maxActive="20" 
     maxIdle="30" 
     maxWait="5" 
    /> 
</Context> 

web.xml моего приложения

<servlet> 
    <servlet-name>HelloServlet</servlet-name> 
    <servlet-class>org.jtp.HelloServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>HelloServlet</servlet-name> 
    <url-pattern>/Hai</url-pattern> 
</servlet-mapping> 

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

и в моем Apache/Lib папку I есть

mysql-connector-java-5.1.18-bin.jar 

, но когда я исполню этот код:

Context initContext = new InitialContext(); 
dataSource = (DataSource)initContext.lookup("java:comp/env/jdbc/mysqldb"); 
System.out.println(dataSource.getConnection().createStatement(). 
      execute("select * from Users")); 

я получаю исключение

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null' 

теперь я озадачен, в некоторых местах я читал, что это может быть вызвано не размещая водителя в TOMCAT/Lib, но у меня есть это, и это работает, потому что, когда я тестировал драйвер с ручным подключением он работал.

Для моей установки я пытался следовать http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html

EDIT: Наконец получил это работает, казалось, что у меня были некоторые левые контекстные теги в одном из файлов, так что при разборе он переопределен другие атрибуты, так это это моя вина в конце.

ответ

10

Похоже, вам не хватает Context envCtx = (Context) initCtx.lookup("java:comp/env");
JNDI поиска должно быть сделано, как это:

// Obtain our environment naming context 
Context initCtx = new InitialContext(); 
Context envCtx = (Context) initCtx.lookup("java:comp/env"); 

// Look up our data source 
DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB"); 

// Allocate and use a connection from the pool 
Connection conn = ds.getConnection(); 

документацию от http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html.

+0

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

+0

Похоже, у этого парня была такая же проблема, и он опубликовал решение http://blogs.agilefaqs.com/2009/11/23/cannot-create-jdbc-driver-of-class-for-connect-url-null/ – drobson

+0

Все еще ничего, я могу написать в эту папку, я даже создал contex.xml в моем webapp, по-прежнему ту же ошибку. – Andna

13

Для создания пула соединений JDBC с Tomcat существует альтернатива файлам конфигурации XML. Я никогда не мог получить их Контекст и resource-ref теги для работы. Кроме того, эти теги являются излишними, если вам действительно не нужны функции JNDI.

Альтернатива - Код Java для настройки Пул соединений JDBC от Tomcat. См. Пример кода в разделе Plain Ol 'Java раздела документации Tomcat 7, The Tomcat JDBC Connection Pool.

В принципе, вы:

  1. Инстанцировать в PoolProperties объект для хранения настроек (URL в базу данных, дб имя пользователя, пароль БД, и такие).
  2. Создайте объект Tomcat DataSource, передавая объект PoolProperties из шага # 1 выше.

Easy peasy.Как это ...

PoolProperties p = new PoolProperties(); 
p.setUrl(jdbc:postgresql://localhost:5432/" + "my_database_name"); 
p.setDriverClassName("org.postgresql.Driver"); 
p.setUsername("someUserName"); 
p.setPassword("somePassword"); 
… 
DataSource datasource = new org.apache.tomcat.jdbc.pool.DataSource(p); 
datasource.setPoolProperties(p); 

Чтобы использовать источник данных ...

Connection conn = null; 
try { 
    conn = datasource.getConnection(); 
    … 

экземпляр DataSource может храниться:

  • В поле члена на вашем Servlet.
  • Как Singleton, как указано в комментариях другого ответа.
  • В качестве «атрибута» на ServletContext с использованием встроенного картографирования String на Object, как описано в an Answer of mine, и, как обсуждалось в Вопросе How to get and set a global object in Java servlet context.
+0

Это потрясающе. Благодарю. –

+0

это то, что я ищу более 3 дней ....! :) спасибо для обмена ....! – Saedawke

Смежные вопросы