Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
H2数据库Java Servlet连接路径问题_Java_Sql_Servlets_H2 - Fatal编程技术网

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

H2数据库Java Servlet连接路径问题,java,sql,servlets,h2,Java,Sql,Servlets,H2,最近,我一直在寻找一个带有本地数据库的servlet。通过一些研究,我发现()。这非常适合我的需要,但是我的servlet的本地路径有问题 例如: 我需要在我的WebContent文件夹中创建H2数据库,使其成为项目的一部分。然而,我似乎无法正确地将代码本地化 示例代码:-H2.Jar-到SQL数据库的连接字符串 String url = "jdbc:h2:"+request.getContextPath()+"/emailDB;IFEXISTS=TRUE";

最近,我一直在寻找一个带有本地数据库的servlet。通过一些研究,我发现()。这非常适合我的需要,但是我的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.jdbcsql异常:未找到数据库“C:/emailservlet/emailDB”[90013-174]
位于org.h2.message.DbException.getJdbcSQLException(DbException.java:332)
位于org.h2.message.DbException.get(DbException.java:172)
位于org.h2.message.DbException.get(DbException.java:149)
位于org.h2.engine.engine.openSession(engine.java:54)
位于org.h2.engine.engine.openSession(engine.java:160)
位于org.h2.engine.engine.createSessionAndValidate(engine.java:139)
位于org.h2.engine.engine.createSession(engine.java:122)
位于org.h2.engine.engine.createSession(engine.java:28)
位于org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:323)
JdbcConnection(JdbcConnection.java:105)
JdbcConnection(JdbcConnection.java:90)
位于org.h2.Driver.connect(Driver.java:73)
位于java.sql.DriverManager.getConnection(未知源)
位于java.sql.DriverManager.getConnection(未知源)
在emailservlet.msdbcon(emailservlet.java:540)
正如您所看到的,我遇到的问题是,即使我请求contextpath,我仍然得到了以前编写的C:/

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


提前谢谢你

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

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

下面是如何形成url的

String path = getServletContext().getRealPath("/") + "/WEB-INF";
String url = "jdbc:h2:"+path+"/emailDB;IFEXISTS=TRUE";
这将在WEB-INF文件夹中创建H2文件

从H2Database.com网站上获取的注意事项:

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

getContextPath()未返回正确的文件系统路径;它返回webapp URL上下文路径。可能是H2本身将您提供的相对路径转换为绝对路径。驱动程序需要文件系统路径来创建文件。它使用根目录将相对路径转换为绝对路径,根目录是您的C:driveAh,我不知道如何阻止H2更改url。因为文件应该可以通过web url contextpath/文件访问。我已经在其他应用程序中多次使用requestcontextpath,但我确信您关于H2的建议是正确的。有什么办法可以绕过设置一条绝对路径吗?谢谢你的更新。是的,因为这个原因,我会把它放到WEB-INF中。使用真实路径尝试了您的建议,我得到了C:/Users/user/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/emailservlet/emailDB,它仍在查看驱动器。问题是应用程序需要在系统之间传输,这将无法工作:(.您获得的路径是因为您从Eclipse内部运行tomcat。关于路径,H2数据库需要绝对路径,但您没有提供绝对路径,而是使用getRealPath方法,并且它应该在任何系统上自动获得正确的绝对路径。我在这方面很清楚!字符串url=“jdbc:h2:file:emailDB;IFEXISTS=TRUE”;(文件是emailDB),它是我的servlet的本地文件。返回的错误是:找不到数据库“C:/ProgramFiles(x86)/eclipse/emailDB”[90013-174](在我的eclipse开发套件中查找该文件)。顺便说一句,谢谢您的持续帮助!如果您阅读了上面H2的摘录,前缀文件是可选的。现在您只提供文件名,即emailDB,因此它使用的是当前目录,即eclipse文件夹。在tomcat中部署war文件,并尝试从eclipse外部运行它,您将获得不同的路径,不幸的是,我不知道有一种在另一台tomcat服务器atm上运行war的方法:(仅在本地通过eclipse。我尝试了您的建议字符串路径/字符串URl(从上面),但显然在eclipse中我遇到了相同的问题“C:/Users/user/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/emailservlet/WEB-INF/emailDB”未找到[90013-174](提醒-未找到的错误不是问题-只是文件路径)
String path = getServletContext().getRealPath("/") + "/WEB-INF";
String url = "jdbc:h2:"+path+"/emailDB;IFEXISTS=TRUE";