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

Java 未找到适合Oracle数据库连接的驱动程序,java,jdbc,oracle11g,driver,sqlexception,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 pu

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

已编辑-应用程序日志文件

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),前两天运行正常,今天失败了,出现以下错误

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)

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

您的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”

取决于“测试”是服务还是SID。


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

不确定它是否有用,但这是我必须执行相同操作的代码

    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的类是必需的,它确保类加载器已经加载了oraclejdbc驱动程序


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

似乎是“ojdbc6.jar”不在应用程序服务器的类路径中。

当它说找不到类时,它就找不到该类

根据我的经验,这类问题有时有效,有时与线程无关。我的假设是
ClassLoader
正在异步加载您的类,因此在加载后调用连接可能是个问题。您是否尝试过在静态部分加载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());
    }
}
}

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

问题似乎在于您的jar尝试用ojdbc14.jar替换,并将其添加到类路径中(如果您使用Eclipse),请遵循以下步骤:-
Eclipse-->(选择项目)转到属性-->Java构建路径-->选择添加Jar或添加外部Jar。

如果可能,查看DriverManager.getConnection()的println 方法。在失败期间,您可能会毫无例外地从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");

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

我不熟悉“schedular”但您的最新更新表明,您的线程在以前的取消部署/重新部署中没有完全停止。有一个问题

我想知道您的servlet关闭代码是否注销了数据库驱动程序?从stacktrace上看,您似乎正在运行Tomcat。即使您的代码没有直接注销驱动程序,我相信Tomcat 7和更高版本将注销驱动程序,作为Tomcat内存泄漏检测/缓解的一部分


这也许可以解释为什么驱动程序有时存在,有时不存在。

不要以静态方式保存驱动程序名称。使用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


希望这些信息能帮助…

因为有人向我寻求这个问题的解决方案。我现在就发

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

  • 我认为你应该问的问题是,在这两次失败中,发生了什么变化。一般来说,我会假设,如果它能工作一次,它会工作十次。这是我们的假设。但是,它不起作用。即使如此,我也找不到任何线索来追踪它(问题:-上面代码中显示的方法..dbconf.java..是静态的吗???建议:-Class.forName(“oracle.jdbc.OracleDriver”).newInstance(),newInstance()这里不是必需的。为什么要使用它???@PranavManiar它有什么区别吗?@PranavManiar我的代码可能效率不高,但没有错。因为,它在几天内可以工作,这可以在日志中看到,我在问题的末尾提到过。这两种方法对于Oracle都是正确的,但有微妙的不同含义。用法:如果您有SID,/if