Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用tomcat时,如何加载JDBC驱动程序?_Java_Tomcat_Jdbc - Fatal编程技术网

Java 使用tomcat时,如何加载JDBC驱动程序?

Java 使用tomcat时,如何加载JDBC驱动程序?,java,tomcat,jdbc,Java,Tomcat,Jdbc,我正在使用Eclipse和Tomcat7。我对这两种产品和Java本身都没有什么经验。我试图从Servlet连接到derby数据库。最初,我的doGet()中只有以下内容: conn = DriverManager.getConnection(connectionURL); 我将connectionURL定义为 static private String connectionURL = "jdbc:derby://localhost:1527/seconddb"; 然后,我将以下内容添加到构

我正在使用Eclipse和Tomcat7。我对这两种产品和Java本身都没有什么经验。我试图从Servlet连接到derby数据库。最初,我的
doGet()
中只有以下内容:

conn = DriverManager.getConnection(connectionURL);
我将connectionURL定义为

static private String connectionURL = "jdbc:derby://localhost:1527/seconddb";
然后,我将以下内容添加到构建路径和部署程序集中

C:\DERBY\db-derby-10.10.1.1-bin\lib\derbyclient.jar
这就是我所做的一切。我有点假设Tomcat会找到驱动程序类并加载它。我犯了以下错误

java.sql.SQLException: No suitable driver found for jdbc:derby://localhost:1527/seconddb
然后,我继续在doGet()中添加以下代码以加载驱动程序类:

    try {
           Class.forName("org.apache.derby.jdbc.ClientDriver");
        }
        catch(ClassNotFoundException ex) {
           System.out.println("Error: unable to load driver class!");
           System.exit(1);
    }
现在它成功了。我认为在Java1.4之后,没有必要显式地加载JDBC驱动程序类。那么我做错了什么?我已经给出了下面的全部代码

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    Connection conn = null;

    try {
           Class.forName("org.apache.derby.jdbc.ClientDriver");
        }
        catch(ClassNotFoundException ex) {
           System.out.println("Error: unable to load driver class!");
           System.exit(1);
    }

    try {
        conn = DriverManager.getConnection(connectionURL);
        //DriverManager.getConnection("jdbc:derby://localhost:1527/testdb;create=true");
    }
    catch (SQLException e) {
        e.printStackTrace();
    }
    PrintWriter p = response.getWriter ();
    p.println("Connected to database");

    try {
        if (conn != null) {
            conn.close();
        }
    }
    catch (SQLException e) {
        e.printStackTrace();
    }
}

我使用的是java 1.7,我无法解释原因,但我是这样做的:

  • 如果驱动程序位于war中,我必须调用
    Class.forName(“…驱动程序”)
  • 如果驱动程序位于Tomcat库中,则在需要时自动加载

我知道这更多的是一条经验法则,而不是一个清晰的解释,但是我在类加载方面的知识不允许我给出更好的答案…

您的Derby驱动程序不支持JDBC 4自动加载,因此您必须手动执行。请尝试查找更为最新的版本。

我可能在这里错了,但在您的第二个代码示例connectionURL中

静态私有字符串connectionURL=“jdbc:derby://localhost:1527/seconddb";


不包括“create=true”;来完成这个陈述。在您的完整代码示例中,它被包括在内,但被注释掉了

驱动程序自动加载是在Java 6(JDBC 4)中引入的,不是Java 1.4。但是您使用的Derby的任何版本都支持驱动程序检测模型吗?我使用的是我不久前下载的10.10.1.1。我认为它应该支持驾驶员检测。我在非web环境中使用它,不必显式加载驱动程序。我使用的是不久前下载的db derby 10.10.1.1。所以我认为它应该支持驾驶员检测。我在非网络环境下使用它,不必显式加载驱动程序。这似乎是一个合理的问题。我给出了所有的代码并清楚地解释了我的问题。那么为什么是a-1呢。这是为了阻止人们提问吗?对我来说,将jar文件放在tomcat/lib中似乎也不起作用。我也看了一篇类似的帖子,但这个解决方案对我来说不起作用。现在,我必须努力加载类,直到找到原因。我将尝试更新版本。但是,我在非web上下文(普通java程序)中使用Derby客户机JAR,并且不必显式加载该类。