我对来自Java servlet的H2数据库连接(在Tomcat上运行)有一个奇怪的问题。
方案如下: 首先,我在Tomcat 7.0上运行servlet,一切都很好。我可以访问localhost上的静态网页。然后,当我尝试通过HTML表单执行与servlet的通信时,一切都会中断,我得到一个异常:
java.lang.ClassNotFoundException: org.h2.Driver
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1718)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1569)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
....
等等。
问题是,我在类路径中有h2 jar文件(使用Eclipse:右键单击项目 - >属性 - >库选项卡 - >添加(外部)JAR ...)。我真正无法理解的是,如果我从非servlet类(如Java Application)运行相同的代码,一切正常,我可以连接到数据库。
我用来连接的代码是:
try {
Class.forName("org.h2.Driver").newInstance();//it breaks here
}
catch(Exception Ex) {
Ex.printStackTrace();
}
try {
connection = DriverManager.getConnection(url, username, password);
}
catch(Exception Ex){
Ex.printStackTrace();
}
我使用与H2控制台完全相同的连接URL,用户名和密码,我可以毫无问题地连接到该控制台。
谢谢!
答案 0 :(得分:2)
将H2驱动程序jar放入Tomcat的类路径中,或者将maven依赖项tomcat-jdbc(可能还有tomcat-juli)添加到pom.xml中。
这是我的理论。您在webapp类加载器级别(在web-inf \ lib下)具有H2驱动程序,但Tomcat的catalina类(在服务器类路径中)无法访问它。如果您在本地webapp中没有tomcat-jdbc,则创建连接池的任务将委派给系统/服务器类加载器,该类加载器显然无法访问本地webapp类加载器。
答案 1 :(得分:1)
您需要确保库位于类路径中,Eclipse中的那些设置可能没有您期望的效果。
您可以在WEB-INF / lib上手动包含该库。或者,您可以在Tomcat common lib文件夹中包含H2 jar。