找不到适合Oracle数据库连接的驱动程序

时间:2015-06-25 02:52:18

标签: java jdbc oracle11g driver sqlexception

我有一个小型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

所以,你可以看到,它在7月3日和6日失败了。但是,它之间运行良好。

==更新1 ==

看来,没有人正在正确地阅读我的问题,我已经清楚地提到过,有一天它运行正常,但总有一天会失败。如果是类路径问题,那么它不应该在任何一天运行。

===更新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)

11 个答案:

答案 0 :(得分:0)

您的JDBC URL的正确格式不是您所写的:

  

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”;

取决于'test'是服务还是SID
您显示的日志片段未显示getConnection方法在第4天工作!它只表明它没有抛出任何错误。这可能只是意味着从未调用过该方法(因此没有尝试连接)。

答案 1 :(得分:0)

不确定它是否有帮助,但这是我必须做同样事情的代码,

    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,而是相同的协议形式。

name的类是必不可少的,它确保类加载器已加载Oracle jdbc驱动程序。

可能发生的是运行代码的机器上的某些连接问题,因此包含实际ojdbc6.jar(在类路径上指向的)的位置并不总是可访问(如果它不在本地磁盘?)。

答案 2 :(得分:0)

看来,“ojdbc6.jar”不在应用服务器的CLASSPATH中。

答案 3 :(得分:0)

当它说找不到课时它找不到课。

根据我的经验,这类问题有时会起作用,有时也不会与线程相关。我的假设是ClassLoader正在加载你的类async,所以在加载后调用连接可能是问题所在。你是否尝试在静态部分加载oracle类?类似的东西:

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());
    }
}
}

另一个问题:您的代码是否每天都在编译(通过持续交付或......)?

答案 4 :(得分:0)

似乎问题在于您的jar尝试用ojdbc14.jar替换并将其添加到Class-path如果您使用Eclipse,请按照以下步骤操作: - Eclipse - > (选择项目)转到属性 - > Java构建路径 - >选择Add Jar或Add External Jar。

答案 5 :(得分:0)

如果可能,查看DriverManager的DriverManager.getConnection()     方法。在故障期间,您可能正在从DB获取空连接对象而没有任何异常。

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");

答案 6 :(得分:0)

可能的解决方案是:转到事件查看器 - > Windows归档并删除应用程序事件和系统事件。(不要删除安全事件!)。之后重新启动电脑,你就可以了。

答案 7 :(得分:0)

我不熟悉"日程安排"但是您的最新更新表明您的线程没有从先前的取消部署/重新部署中彻底停止。有JavaSpecialists newsletter about how to shutdown threads cleanly

我想知道你的servlet关闭代码是否可以取消注册数据库驱动程序?从您的堆栈跟踪看起来您在Tomcat中运行。即使您的代码没有直接取消注册驱动程序,我相信Tomcat 7及更高版本将取消注册驱动程序,作为Tomcat内存泄漏检测/缓解的一部分。

这也许可以解释为什么司机有时会出现,有时候不会出现。

答案 8 :(得分:0)

不要以静态方式保留驱动程序名称。使用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是否在构建路径中设置得很好..

希望这些信息有所帮助......

答案 9 :(得分:0)

有人找我解决这个问题。我现在发帖了。

  1. 我取消部署了应用程序,该应用程序出现此问题并清除了服务器中的所有相关文件。
  2. 然后,我重新启动了tomcat服务器。这样,它将刷新所有临时文件和缓存。
  3. 然后,我部署了相同的应用程序,它开始工作没有任何问题。

答案 10 :(得分:-2)

错误表示您使用的驱动程序不接受连接URL。您的URL似乎使用MySQL语法(DB名称用'/'分隔)。尝试使用Oracle特定的定义:jdbc:oracle:thin:@ 160.110.xx.xxx:1521:test