1

祝大家有美好的一天,

我在让 Glassfish 3.1.2 看到一些进口的罐子时遇到了一些问题。因为这是我的研究生项目,所以我有限制。除了 Glassfish、Netbeans,我不能使用其他任何东西,也不能使用 Maven、Hibernate、Ear 或其他任何东西。

我正在使用嵌入式 Derby 驱动程序。(我可以使用另一个数据库,但在我的试验中问题仍然存在)。

我编写了一些普通的 java 代码来连接数据库:

    try{
        Connection c   = DriverManager.getConnection(URL, USER, PWD);
        Statement st   = c.createStatement();                
        st.executeUpdate("CREATE TABLE Users" +
                         " (ACCOUNT VARCHAR(20) PRIMARY KEY," +
                         " PWD VARCHAR(20) NOT NULL," +
                         " USERTYPE INTEGER NOT NULL)");

                       ...

       }
       catch (SQLException x){
         System.out.println(x);  
       }

它很丑,它不使用连接池,它可以工作。我稍后会使用它们。显然我必须将 derbyclient.jar 添加到库中。

当我尝试在 servlet 中使用此方法时出现问题:

protected void processRequest(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException {

    try{           
        DriverManager.registerDriver(org.apache.derby.jdbc.ClientDriver);            
        Connection c = DriverManager.getConnection(dbUsr, pwd, url);            
        Statement st = c.createStatement();            
        ResultSet rs = st.executeQuery(query);

                         ...

       }catch (SQLException e){
        ServletException e1 = new ServletException(e.getMessage());
        throw e1;
    }

我无法编译 servlet,因为“包 org.apache.derby.jdbc 不存在”。

我可以提供更多信息(20 多个小时的阅读和不成功的试验):

  • servlet 和 java 代码在同一个项目中,因此它们应该都能看到 derbyclient.jar。
  • 当我编写 org.apache.berby 时,netbeans 向我展示了用于自动完成的包导航器,因此它知道某个地方有一个 jar。
  • 我试图将 derbyclient.jar 放入:
    • Glassfish/glassfish/domains/domain1/lib
    • Glassfish/glassfish/domains/domain1/lib/ext
    • Glassfish/glassfish/lib
  • 在没有驱动程序注册的情况下尝试,java 代码没有它就可以工作,但我得到“javax.servlet.ServletException:找不到适合应用程序的驱动程序”。我觉得有道理。

我已经黔驴技穷了。有人愿意帮忙吗?

编辑:

昨天我从老师那里得到消息:她责怪 Netbeans IDE 丢失了 jar 的踪迹。这似乎是一个已知的错误。

我受到热烈的鼓励,转而使用 tomcat 服务器。我一定会尝试的,但我会继续努力解决这个问题。还有什么好主意吗?

4

2 回答 2

2

" No suitable driver found" 通常意味着您提供的用于连接的 JDBC URL 的语法不正确。或者根本没有加载驱动程序。

Class.forName在连接到数据库之前,您必须使用加载驱动程序。德比的网址是:

Class.forName("org.apache.derby.jdbc.ClientDriver");

有关 Derby 的更多详细信息,请查看文档

还要检查你derby.jar的类路径中是否有。我建议将 derby.jar 放在/WEB-INF/lib项目目录的物理位置。然后 IDE 将负责其余的工作。

于 2012-07-24T11:10:51.557 回答
1

您(通常)不应该自己向 DriverManager 注册驱动程序,这是 Driver 实现的责任。对于 JDBC 3.0 及更早版本(Java 5 及更早版本),您需要加载该类以使其注册自身:

Class.forName("org.apache.derby.jdbc.ClientDriver")

当类被加载时,驱动程序将自己注册到 DriverManager。

对于 JDBC 4.0 兼容驱动程序(Java 6 和 7),您甚至不需要这样做,因为 JDBC 4.x 使用 ServiceLoader 机制,并且每个兼容驱动程序都会META-INF/services/java.sql.Driver在其 jar 文件中的文件中列出其驱动程序实现。

所以一般来说你不应该自己调用'DriverManager.registerDriver(..)'。如果由于某种原因您确实需要自己在代码中注册驱动程序(例如,因为驱动程序实际上并没有自动向 DriverManager 注册自身),那么请确保实际的驱动程序也在您的编译路径(构建路径)上,并且不只是在您的应用程序服务器的 lib 文件夹中(这似乎是您的实际问题)。

还要记住,您需要注册 Driver 的实例,而不是类。所以你需要实例化它:

DriverManager.registerDriver(new org.apache.derby.jdbc.ClientDriver()); 
于 2012-07-24T19:00:47.267 回答