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

时间:2014-11-13 17:41:32

标签: java tomcat jdbc

我正在使用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

3 个答案:

答案 0 :(得分:0)

我无法解释原因,但这是我的方式:

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

我知道这更像是一个经验法则,而不是一个明确的解释,但我在课堂上的知识并不能让我得到更好的答案...

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

  

静态私有字符串连接URL =“ jdbc:derby:// localhost:1527 / seconddb”;

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