Проблемы с использованием пула соединений Tomcat JDBC в Tomcat 7

#java #tomcat #jdbc #connection-pooling #tomcat7

#java #tomcat #jdbc #объединение в пул соединений #tomcat7

Вопрос:

В server.xml:

 <GlobalNamingResources>
<Resource name="jdbc/ArchiveDB" 
    auth="Container" 
    type="javax.sql.DataSource" 
    driverClassName="oracle.jdbc.OracleDriver"
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
    ...etc
  

В web.xml:

 <resource-ref>
<description>Archive Database</description>
<res-ref-name>jdbc/ArchiveDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>  
  

Мой код:

 Context ic = new InitialContext();         
DataSource ds = (DataSource) ic.lookup( "java:/comp/env/jdbc/ArchiveDB" );             
  

Я получаю следующее исключение:

 java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.BasicDataSource cannot be cast to org.apache.tomcat.jdbc.pool.DataSource
  

Есть идеи, что я понял неправильно? Кажется, что поле factory в ресурсе не используется, но я понятия не имею, как выяснить, почему. Есть идеи, как я могу прогрессировать?

Обновление 1. Углубившись в исходный код, обнаружил следующее в ResourceFactory.java

 if (ref.getClassName().equals("javax.sql.DataSource")) {
String javaxSqlDataSourceFactoryClassName =
    System.getProperty("javax.sql.DataSource.Factory",
    Constants.DBCP_DATASOURCE_FACTORY);
  

Я думаю, мне нужно установить это системное свойство, чтобы оно не возвращалось к значению по умолчанию.

Обновление 2. Теперь для запуска установлено следующее:

 -Djavax.sql.DataSource.Factory=org.apache.tomcat.jdbc.pool.DataSourceFactory
  

И получение другой ошибки:

 09-Jun-2011 14:48:20 org.apache.naming.NamingContext lookup
WARNING: Unexpected exception resolving reference
java.sql.SQLException
at        org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:243)
Caused by: java.lang.NullPointerException
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
    at     org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:236)
    ... 57 more
javax.naming.NamingException
    at org.apache.naming.NamingContext.lookup(NamingContext.java:843)
  

Я предполагаю, что он не может получить указанную мной информацию о драйвере.

Комментарии:

1. У меня похожая проблема. Каков тип источника данных при доступе к источнику данных из класса java? Я использую org.apache.tomcat.jdbc.pool.DataSource , или так и должно быть javax.sql.DataSource (последнее является значением type атрибута ресурса)?

Ответ №1:

Кажется, сейчас работает. Я думаю, что это была проблема, которую я отлаживал в Eclipse, поэтому я не использовал server.xml я думал, что использую. Eclipse копирует пул в каталоге tomcat. Решение заключается в удалении и повторном создании в Eclipse, чтобы получить изменения в server.xml чтобы быть эффективным.