Источник данных JDBC

#java #jdbc #datasource

#java #jdbc #источник данных

Вопрос:

Когда я запускаю следующий код на одной машине, я получаю реализацию tomcat org.apache.tomcat.dbcp.dbcp.BasicDataSource , а когда я запускаю его на другой машине, я получаю реализацию apache commons org.apache.commons.dbcp.BasicDataSource (что, очевидно, приводит к ClassCastException ). Просто интересно, почему никаких изменений в коде и context.xml не приведет к возврату двух разных реализаций DataSource?

 Context context = (Context) initialContext.lookup("java:/comp/env");
return (DataSource) context.lookup("jdbc/dbName");
  

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

1. Вы проверили файлы jar, содержащие эти классы?

2. Может ли это быть так же просто, как проблема с classpath? Запускаются ли оба сервера tomcat с одним и тем же сценарием запуска? Являются ли войны точно такими же файлами на обоих серверах? Одинаковы ли конфигурации обоих серверов?

3. Спасибо за ваши комментарии, ребята, @JSS что я проверяю в их файлах jar? @Corlettk Я не уверен, что вы подразумеваете под проблемой classpath, сценарий запуска отличается с точки зрения выделения памяти, и да, war такой же. Не могли бы вы, пожалуйста, быть немного более конкретным.

4. Измените путь к классу: они имели в виду одинаковые имена файлов jar с одинаковыми размерами и временными метками в ваших каталогах Tomcat common / lib, server / lib и shared / lib. Кроме этого, убедитесь, что вы действительно работаете на той же версии Tomcat.

5. Я не совсем понимаю, когда и почему вы получаете ClassCastException . Оба являются всего лишь java.sql.DataSource реализациями, верно? Просто объявите их как таковые…

Ответ №1:

Я полагаю, вы не включаете DBCP в свою war. Таким образом, он использует любой источник данных, настроенный в Tomcat. Вероятно, вы используете две разные версии Tomcat или, по крайней мере, они были настроены по-разному; одна из них должна иметь commons-dbcp.jar а другой имеет tomcat-dbcp.jar .