【发布时间】:2013-11-05 10:36:16
【问题描述】:
最近我一直在寻找一个带有本地数据库的 servlet。通过一些研究,我发现了H2 Database Engine (Wikipedia)。这非常适合我想要的,但是我的 servlet 的本地路径有问题。
例子:
我需要在我的 WebContent 文件夹中创建 H2 数据库,使其成为项目的一部分。但是我似乎无法正确地对代码进行本地化。
示例代码:- H2.Jar - SQL 数据库的连接字符串
String url = "jdbc:h2:"+request.getContextPath()+"/emailDB;IFEXISTS=TRUE";
Class.forName("org.h2.Driver");
Connection conn = DriverManager.
getConnection(url, "adminuser", "pass");
示例代码(错误):- H2.Jar - SQL 数据库的连接字符串(输出)
org.h2.jdbc.JdbcSQLException: Database "C:/emailservlet/emailDB" not found [90013-174]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:332)
at org.h2.message.DbException.get(DbException.java:172)
at org.h2.message.DbException.get(DbException.java:149)
at org.h2.engine.Engine.openSession(Engine.java:54)
at org.h2.engine.Engine.openSession(Engine.java:160)
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:139)
at org.h2.engine.Engine.createSession(Engine.java:122)
at org.h2.engine.Engine.createSession(Engine.java:28)
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:323)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:105)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:90)
at org.h2.Driver.connect(Driver.java:73)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at emailservlet.msdbcon(emailservlet.java:540)
正如您所看到的,我遇到的问题是,即使我请求上下文路径,我仍然得到 C:/ 之前编写的。
如果您能帮我找出代码中的错误,那将非常有帮助!
提前谢谢你!
【问题讨论】:
-
getContextPath() 没有返回正确的文件系统路径;它返回 webapp URL 上下文路径。可能是 H2 本身将您提供的相对路径转换为绝对路径。
-
驱动程序需要它可以创建文件的文件系统路径。它使用 C: 驱动器的根目录将相对路径转换为绝对路径
-
啊,我不确定如何阻止 H2 更改 url。因为该文件应该可以通过 web url contextpath/file 访问。我已经多次将 requestcontextpath 用于其他应用程序,但我相信您对 H2 的建议是正确的。任何想法如何绕过它设置绝对路径?