【问题标题】:Problems importing derby drivers in glassfish在 glassfish 中导入 derby 驱动程序的问题
【发布时间】:2012-07-22 15:31:19
【问题描述】:

大家好,

我在让 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 服务器。我一定会尝试的,但我会继续努力解决这个问题。还有什么好主意吗?

【问题讨论】:

    标签: servlets netbeans jdbc jar glassfish


    【解决方案1】:

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

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

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

    更多德比详情请查看documentation

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

    【讨论】:

    • 我会把罐子放在你建议的地方(该死的,这听起来很奇怪:P)。我会忽略不正确的语法,因为我使用了 ide 中的自动完成功能。其他一切都很好。这在那个类中以一种奇怪的方式工作。就在我完成选项卡并单击我的选择后,它们会以红色下划线显示,我收到错误消息。
    【解决方案2】:

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

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

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

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

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

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

    DriverManager.registerDriver(new org.apache.derby.jdbc.ClientDriver()); 
    

    【讨论】:

    • 非常感谢您的解释。我没有提到,我使用了一个驱动程序。我会尝试使用 Class.forName,也许这就是问题所在。
    猜你喜欢
    • 2021-06-24
    • 2020-02-22
    • 2019-07-10
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多