在glassfish中导入德比驱动程序的问题

时间:2012-07-24 10:19:39

标签: servlets netbeans jdbc jar glassfish

每个人都过得愉快,

我在使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添加到libs。

当我尝试在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,因为“Package org.apache.derby.jdbc不存在”。

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

  • servlet和java代码在同一个项目中,因此两者都应该看到derbyclient.jar。
  • 当我写org.apache.berby时,netbeans向我展示了自动完成的包导航器,所以它知道有一个罐子。
  • 我试图将derbyclient.jar放入其中:
    • Glassfish的/的glassfish /域/域1 / lib中
    • Glassfish的/的glassfish /域/域1 / lib / ext目录
    • Glassfish的/的glassfish / lib中
  • 尝试没有驱动程序注册,java代码没有它,但我得到“javax.servlet.ServletException:找不到合适的app驱动程序”。我觉得这很合理。

我在我的智慧结束。有人在乎帮忙吗?

编辑:

昨天我收到了老师的消息:她指责Netbeans IDE失去了对罐子的追踪。这似乎是一个已知的错误。

我被热烈鼓励切换到tomcat服务器。我肯定会尝试一下,我会继续努力解决这个问题。还有其他好主意吗?

2 个答案:

答案 0 :(得分:2)

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

在连接到DB之前,必须使用Class.forName加载驱动程序。 Derby的URL是:

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

有关Derby的更多详情,请查看documentation

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

答案 1 :(得分:1)

您应该(通常)不使用DriverManager自行注册驱动程序,这是驱动程序实现的责任。对于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());