Не найдено подходящего драйвера для подключения Oracle Database
У меня есть небольшое Java-приложение, которое выполняется каждый день и проверяет данные в базе данных с помощью Cronj Schedular, и все работает нормально, но недавно я заметил, что он не работает из-за
java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@160.110.xx.xxx:1521/test
В то же время, когда я запускаю свой тестовый код, чтобы проверить подключение к базе данных, которое отлично работает без исключения. Я не могу понять это. Хотя, было просто небольшое изменение кода, но это нигде не связано с подключением базы данных или базы данных. Кто-нибудь, помогите мне в этом?
dbconf.java
public class dbconf {
private Connection connect;
private String connstr;
public Connection getConnection() throws SQLException {
connstr = "jdbc:oracle:thin:@160.110.xx.xxx:1521/test";
try {
String uname = "scott";
String pass = "tiger";
Class.forName("oracle.jdbc.OracleDriver").newInstance();
connect = DriverManager.getConnection(connstr, uname, pass);
} catch (Exception e) {
System.out.println(e.toString());
}
return connect;
}
}
Я использую ojdbc6.jar и Oracle11g
Отредактировано - Файл журнала приложений
Wed Jul 01 09:25:17 IST 2015:------- Initializing -------------------
Wed Jul 01 09:25:17 IST 2015:------- Scheduling Jobs ----------------
Wed Jul 01 09:25:17 IST 2015:------- Job Started Running ----------------
Thu Jul 02 06:00:00 IST 2015 : Job Executed..!! Bschedularv2.2
java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@160.xxx.67.xxx:1521/test
Sat Jul 04 06:00:00 IST 2015 : Job Executed..!! Bschedularv2.2
Sun Jul 05 06:00:00 IST 2015 : Job Executed..!! Bschedularv2.2
java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@160.xxx.67.xxx:1521/test
Итак, вы можете видеть, Это не удалось 3 и 6 июля. Но между ними это нормально.
== Обновление 1 ==
Кажется, никто не читает мой вопрос должным образом, я ясно сказал, что он работает нормально, но когда-нибудь он провалится. Если это была проблема с classpath, значит, она не должна была работать в любой день.
=== Обновление 2 ===
Многие из нижеприведенных ответов были бессмысленными, но у немногих было некоторое логическое представление. Я использовал printStracktrace
и пытался отлаживать каждую точку, и, наконец, я получил некоторое представление. 3 дня назад, я развернул новую версию приложения на том же сервере (включая printStackTrace и SysOut), Первые 2 дня Он прошел нормально, сегодня он не выполнил следующую ошибку.
INFO: Illegal access: this web application instance has been stopped already. Could not load com.schedular.job.BirthdayJob. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
at org.quartz.simpl.LoadingLoaderClassLoadHelper.loadClass(LoadingLoaderClassLoadHelper.java:59)
at org.quartz.simpl.CascadingClassLoadHelper.loadClass(CascadingClassLoadHelper.java:99)
at org.quartz.simpl.CascadingClassLoadHelper.loadClass(CascadingClassLoadHelper.java:138)
at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.selectJobDetail(StdJDBCDelegate.java:852)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.acquireNextTrigger(JobStoreSupport.java:2816)
at org.quartz.impl.jdbcjobstore.JobStoreSupport$40.execute(JobStoreSupport.java:2759)
at org.quartz.impl.jdbcjobstore.JobStoreSupport$40.execute(JobStoreSupport.java:2757)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3787)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.acquireNextTriggers(JobStoreSupport.java:2756)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:272)
Jul 13, 2015 6:00:00 AM org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already. Could not load com.schedular.job.BirthdayJob. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
at org.quartz.simpl.LoadingLoaderClassLoadHelper.loadClass(LoadingLoaderClassLoadHelper.java:59)
at org.quartz.simpl.CascadingClassLoadHelper.loadClass(CascadingClassLoadHelper.java:99)
at org.quartz.simpl.CascadingClassLoadHelper.loadClass(CascadingClassLoadHelper.java:138)
at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.selectJobDetail(StdJDBCDelegate.java:852)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveJob(JobStoreSupport.java:1385)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggerFired(JobStoreSupport.java:2964)
at org.quartz.impl.jdbcjobstore.JobStoreSupport$43.execute(JobStoreSupport.java:2908)
at org.quartz.impl.jdbcjobstore.JobStoreSupport$43.execute(JobStoreSupport.java:2901)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3787)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggersFired(JobStoreSupport.java:2900)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:336)
Ответы
Ответ 1
Как кто-то подошел ко мне для решения этой проблемы. Я отправляю его сейчас.
- Я не развернул приложение, которое имело эту проблему, и очистило все связанные файлы с сервера.
- Затем я перезапустил сервер tomcat. Таким образом, он очистит все временные файлы и кеш.
- Затем я развернул одно и то же приложение и начал работать без каких-либо проблем.
Ответ 2
Правильный формат вашего URL-адреса JDBC - это не то, что вы написали:
connstr = "jdbc: oracle: thin: @160.110.xx.xxx: 1521/test";
но либо
connstr = "jdbc: oracle: thin: @//160.110.xx.xxx:1521/test";
или
connstr = "jdbc: oracle: thin: @160.110.xx.xxx: 1521: test";
в зависимости от того, является ли "тест" службой или SID.
Выбранный фрагмент журнала не показывает, что метод getConnection работал на 4-м! Это только показало, что ошибки не было выброшено им. Возможно, это означало, что метод никогда не вызывался (поэтому никаких попыток подключения не было).
Ответ 3
Не уверен, что это помогает, но это код, который я должен сделать то же самое,
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
System.out.println("Could not load the driver");
}
Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@ten10:1521:acdb", user, pass);
Итак, не совсем то же самое Class.forName, но такая же форма для протокола.
Класс для имени имеет важное значение, он гарантирует загрузку загрузчика класса драйвер Oracle jdbc.
Что может случиться, это некоторая проблема подключения на машине, где работает код, так что местоположение, содержащее фактический файл ojdbc6.jar(как указано в пути к классам), не всегда доступно (если оно не на локальном диск?).
Ответ 4
Кажется, "ojdbc6.jar" не находится в CLASSPATH вашего сервера приложений.
Ответ 5
Когда он говорит, что не может найти класс, он не может найти класс.
По моему опыту, такие проблемы, которые иногда срабатывают и когда-то не связаны нитями. Мое предположение ClassLoader
загружает ваш асинхронный вызов класса, поэтому вызов соединения сразу после загрузки может быть проблемой. Вы пытались загрузить класс оракула в статической части? что-то вроде:
public class dbconf {
static {
Class.forName("oracle.jdbc.OracleDriver");
}
public Connection getConnection() throws SQLException {
String connstr = "jdbc:oracle:thin:@160.110.xx.xxx:1521/test";
try {
String uname = "scott";
String pass = "tiger";
return DriverManager.getConnection(connstr, uname, pass);
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
Другая проблема: Собирает ли ваш код каждый день (по непрерывной доставке или...)?
Ответ 6
Кажется, проблема заключается в том, что ваша jar попытается заменить ojdbc14.jar и добавить ее в Class-path, если вы используете Eclipse, выполните следующие шаги:
Eclipse → (выберите проект). Перейти к Свойствам → Путь сборки Java → Выберите Добавить Jar или Добавить внешнюю банку.
Ответ 7
Если возможно, просмотрите файл println для DriverManager.getConnection() метод. Вы можете получить нулевой объект соединения из БД без каких-либо исключений во время сбоев.
SQLException reason = null;
for(DriverInfo aDriver : registeredDrivers) {
if(isDriverAllowed(aDriver.driver, callerCL)) {
try {
println(" trying " + aDriver.driver.getClass().getName());
Connection con = aDriver.driver.connect(url, info);
if (con != null) {
println("getConnection returning " + aDriver.driver.getClass().getName());
return (con);
}
} catch (SQLException ex) {
if (reason == null) {
reason = ex;
}
}
} else {
println(" skipping: " + aDriver.getClass().getName());
}
}
if (reason != null) {
println("getConnection failed: " + reason);
throw reason;
}
println("getConnection: no suitable driver found for "+ url);
throw new SQLException("No suitable driver found for "+ url, "08001");
Ответ 8
Возможное решение: перейдите в Event Viewer → Архивы Windows и удалите события приложения и системные события. (НЕ удаляйте события безопасности!). После этого перезагрузите компьютер, и все будет в порядке.
Ответ 9
Я не знаком с "schedular", но ваше последнее обновление предполагает, что у вас есть потоки, которые не были полностью остановлены из предыдущего undeploy/redeploy. Существует информационный бюллетень JavaSpecialists о том, как отключить потоки в чистоте.
Интересно, может ли ваш код завершения сервлета отменить регистрацию драйвера базы данных? Из вашего stacktrace это похоже на то, что вы работаете в Tomcat. Даже если ваш код не отменяет деинсталляцию драйвера, я считаю, что Tomcat 7 и выше будут отменить регистрацию драйверов как часть обнаружения/снижения утечки памяти Tomcat.
Это может объяснить, почему драйвер иногда присутствует, а иногда и нет.
Ответ 10
Не сохранять имя драйвера статическим способом. Используйте JDBC + Java API для получения имени класса драйвера следующим образом:
public class dbconf {
private Connection connect;
private String connstr;
public Connection getConnection() throws SQLException {
connstr = "jdbc:oracle:thin:@160.110.xx.xxx:1521/test";
try {
String uname = "scott";
String pass = "tiger";
Class.forName(OracleDriver.class.getClass().getName().toString()).newInstance();
connect = DriverManager.getConnection(connstr, uname, pass);
} catch (Exception e) {
System.out.println(e.toString());
}
return connect;
}
}
Лучше, если вы сделали какую-либо опечатку или можете проверить, правильно ли установлен ojdbc6.jar в пути сборки.
Надеемся, что эта информация поможет...
Ответ 11
Используемый вами драйвер ошибки не поддерживает URL-адрес соединения. Кажется, что ваш URL использует синтаксис MySQL (имя базы данных разделено на "/" ). Попробуйте использовать определенное определение Oracle: jdbc: oracle: thin: @160.110.xx.xxx: 1521: test