java - H2 数据库 Java Servlet 连接路径问题

标签 java sql servlets h2

最近我一直在寻找一个带有本地数据库的 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:/。

如果您能帮我找出代码中的错误,那将非常有帮助!

提前致谢!

最佳答案

驱动程序需要可以创建文件的文件系统路径。它通过使用 C: 驱动器的根目录将相对路径转换为绝对路径。要获取 WebContent 文件夹的绝对路径,您需要使用 ServletContext#getRealPath()

此外,将 H2 文件存储在 WebContent 文件夹中也不是一个好主意,您应该将它们存储在 WEB-INF 文件夹中,这样用户就无法访问它。

下面是url的构成方式

String path = getServletContext().getRealPath("/") + "/WEB-INF";
String url = "jdbc:h2:"+path+"/emailDB;IFEXISTS=TRUE";

这将在 WEB-INF 文件夹中创建 H2 文件。

注意事项取自 Features page在 H2Database.com 网站上:

  • 连接到本地数据库的数据库 URL 是 jdbc:h2:[file:][] 。 前缀文件:可选。如果不使用或仅使用相对路径,则当前工作目录用作起点
  • 路径和数据库名称是否区分大小写取决于操作系统,但建议仅使用小写字母。
  • 数据库名称的长度必须至少为三个字符(File.createTempFile 的限制)。
  • 数据库名称不能包含分号。
  • 要指向用户主目录,请使用 ~/,如:jdbc:h2:~/test。

关于java - H2 数据库 Java Servlet 连接路径问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19786919/

相关文章:

google-app-engine - 在 Google App Engine 中的 session cookie 上设置 httpOnly 和安全标志

tomcat简单重定向

mysql - 如何对 mysql 中的串联结果进行 group_concat

sql - 如何在 SQLite 中实现 MAX(COUNT(x))

php - SQL LOAD DATA INFILE 的编码问题?或者不同

java - 将时区添加到打印格式的 ZonedDateTime

java - Java servlet使用write()方法上传文件位置

java - WebDriver 与 ChromeDriver

java - 从 Map 中的对象检索值

java - JAXB parseMethod 抛出异常,但生成的适配器方法不会