【问题标题】:When working with tomcat, how are JDBC Drivers loaded?使用 tomcat 时,如何加载 JDBC 驱动程序?
【发布时间】:2014-11-13 17:41:32
【问题描述】:

我正在使用 Eclipse 和 tomcat 7。我对这两种产品以及 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);
    }

现在它起作用了。我认为在 Java 1.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

【问题讨论】:

  • 驱动程序自动加载是在 Java 6 (JDBC 4) 中引入的,而不是 Java 1.4。
  • 但是您使用的任何版本的 Derby 都支持驱动程序检测模型吗?
  • 我使用的是不久前下载的 10.10.1.1。我认为它应该支持驱动程序检测。我在非网络环境中使用它,我不必显式加载驱动程序。
  • 我正在使用不久前下载的 db-derby 10.10.1.1。所以我认为它应该支持驱动程序检测。我在非网络环境中使用它,我不必显式加载驱动程序。
  • 似乎是一个合理的问题。我给出了所有代码并清楚地解释了我的问题。那么为什么它是-1。这是为了阻止人们提问吗?

标签: java tomcat jdbc


【解决方案1】:

我无法真正解释原因,但我就是这样做的:

  • 如果驱动程序位于war中,我必须在Web应用程序某处的初始化方法中调用Class.forName("...Driver");
  • 如果驱动程序位于 Tomcat 库中,它会在我需要时自动加载。

我知道这更像是一个经验法则而不是一个清晰的解释,但我在类加载方面的知识并不能让我得到更好的答案......

【讨论】:

  • 对我来说,将 jar 文件放入 tomcat/lib 似乎也不起作用。我还查看了类似的帖子stackoverflow.com/questions/23912885/… - 但该解决方案对我不起作用。现在,我必须与加载类作斗争,直到找到原因。
【解决方案2】:

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

【讨论】:

  • 我会尝试更新版本。但是,我在非 Web 上下文(纯 Java 程序)中使用 Derby 客户端 JAR,并且不必显式加载该类。
【解决方案3】:

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

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

不包括“create=true”;完成声明。在您的完整代码示例中,它已包含在内,但已被注释掉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2013-02-17
    • 2016-07-07
    • 2011-08-06
    相关资源
    最近更新 更多