Java 如何在服务器模式下运行H2数据库?

Java 如何在服务器模式下运行H2数据库?,java,database,h2,Java,Database,H2,如何在服务器模式下启动H2数据库。我需要从我的应用程序启动它。我尝试了以下代码: server = Server.createTcpServer().start(); 以下是连接的属性: javabase.jdbc.url = jdbc:h2:tcp://localhost:9092/nio:~/source/db/database/db;AUTO_SERVER=TRUE javabase.jdbc.driver = org.h2.Driver javabase.jdbc.username =

如何在服务器模式下启动H2数据库。我需要从我的应用程序启动它。我尝试了以下代码:

server = Server.createTcpServer().start();
以下是连接的属性:

javabase.jdbc.url = jdbc:h2:tcp://localhost:9092/nio:~/source/db/database/db;AUTO_SERVER=TRUE
javabase.jdbc.driver = org.h2.Driver
javabase.jdbc.username = sa
javabase.jdbc.password =
当我运行该程序时,出现以下错误:

client.db.exception.DAOException: org.h2.jdbc.JdbcSQLException: Database may be already in use: "Locked by another process". Possible solutions: close all other connection(s); use the server mode [90020-164]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
    at org.h2.message.DbException.get(DbException.java:169)
    at org.h2.message.DbException.get(DbException.java:146)
    at org.h2.store.FileLock.getExceptionAlreadyInUse(FileLock.java:439)
    at org.h2.store.FileLock.lockFile(FileLock.java:336)
    at org.h2.store.FileLock.lock(FileLock.java:128)
    at org.h2.engine.Database.open(Database.java:542)
    at org.h2.engine.Database.openDatabase(Database.java:222)
    at org.h2.engine.Database.<init>(Database.java:217)
    at org.h2.engine.Engine.openSession(Engine.java:56)
    at org.h2.engine.Engine.openSession(Engine.java:159)
    at org.h2.engine.Engine.createSessionAndValidate(Engine.java:138)
    at org.h2.engine.Engine.createSession(Engine.java:121)
    at org.h2.server.TcpServerThread.run(TcpServerThread.java:133)
    at java.lang.Thread.run(Thread.java:680)

client.db.exception.DAOException:org.h2.jdbc.jdbcsqleexception:数据库可能已在使用中:“被另一个进程锁定”。可能的解决方案:关闭所有其他连接;使用服务器模式[90020-164]
位于org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
位于org.h2.message.DbException.get(DbException.java:169)
位于org.h2.message.DbException.get(DbException.java:146)
位于org.h2.store.FileLock.getExceptionalReadyUse(FileLock.java:439)
位于org.h2.store.FileLock.lockFile(FileLock.java:336)
位于org.h2.store.FileLock.lock(FileLock.java:128)
位于org.h2.engine.Database.open(Database.java:542)
位于org.h2.engine.Database.openDatabase(Database.java:222)
位于org.h2.engine.Database。(Database.java:217)
位于org.h2.engine.engine.openSession(engine.java:56)
位于org.h2.engine.engine.openSession(engine.java:159)
位于org.h2.engine.engine.createSessionAndValidate(engine.java:138)
位于org.h2.engine.engine.createSession(engine.java:121)
位于org.h2.server.TcpServerThread.run(TcpServerThread.java:133)
运行(Thread.java:680)

谢谢,

正如异常消息所说,“数据库可能已经在使用中”。您需要关闭所有其他连接,以确保数据库没有在另一个进程中同时打开

顺便说一下,不要同时使用AUTO_SERVER=TRUE和服务器模式。有关详细信息,请参阅文档。使用任何一个


我猜您对不同的连接模式有点困惑。我建议您阅读,以确保您理解它。

您可以使用以下代码在服务器模式下运行H2

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:target/h2/ps;AUTO_SERVER=TRUE" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

您可以使用squirrelsqlclient()连接到H2数据库并查看表

  • 创建新连接
  • 在驱动程序下拉菜单中选择H2
  • 设置项目目标文件夹h2文件夹的url(jdbc:h2:C:\projects\workspace\TestProject\target/h2/ps;AUTO_SERVER=true)
  • 输入用户名(“sa”)
  • 输入密码(“”)
  • 从命令行

    java -jar h2-1.3.160.jar -webAllowOthers -tcpAllowOthers
    
    这将在服务器模式下启动h2数据库:

    Web控制台服务器运行于http://A.B.C.D:8082 (其他人可以连接)
    正在运行的TCP服务器tcp://A.B.C.D:9092 (其他人可以连接)
    PG服务器运行于PG://A.B.C.D:5435(仅本地连接)
    

    打开浏览器,让管理员GUI关闭所有使用H2(web控制台等)的应用程序
    然后将AUTO_SERVER=TRUE添加到h2控制台和java程序(您已经完成)中位置的末尾。

    我在尝试启动h2时遇到此错误。
    另见


    线程“main”org.h2.jdbc.JdbcSQLException中的异常:功能不可用 支持:“-~webAllowOthers”[50100-197]

    因此,我遵循以下步骤:

  • make dir mkdir h2db此目录将包含您的db文件
  • 点击以下命令:
    java-cp-bin/h2-1.4.197.jar org.h2.tools.Server-web-webAllowOthers-tcp-tcpAllowOthers-baseDir/home/manoj/dev/h2/h2db_6.0

    此命令将启动h2
  • 如果要在后端运行h2,请打开vi h2.sh并将此命令粘贴到以下位置:
    nohup java-cp bin/h2-1.4.197.jar org.h2.tools.Server-web-webAllowOthers-tcp-tcpAllowOthers-baseDir/home/manoj/dev/h2/h2db_6.0/&
  • 现在运行。/bin.h2.sh

  • 这对我不管用。。。我的意思是-请更具体一些。为什么这不起作用?你想要实现什么?到目前为止,您尝试了什么?请演示您迄今为止所做的研究、代码和工作。异常消息给人的印象是,在
    嵌入式模式下运行数据库只允许1个连接,而在
    服务器模式下运行数据库将允许多个连接。不是这样吗?不,不是这样的。看文档。@Thomas——我已经浏览了很多帖子,我一直看到你说要看文档。请不要那样做。这些文档,尤其是关于startTcpServer的文档,充其量是稀疏的。服务器启动,可以远程关闭,但它拒绝所有连接。@Steve11235关于“嵌入式模式只允许1个连接”的问题,我写了“请参阅文档”。这是有明确记录的。TcpServer可能没有足够好的文档记录,这是真的。但是这里的问题不是关于TcpServer的。也许你应该写你自己的问题?当使用这种方法时,你如何增加允许的最大连接数?这一个对我有用。特别要注意默认的TCP端口:9092(可以使用-tcpPort进行调整)!org.h2.jdbc.JdbcSQLException:数据库URL“jdbc:h2:target/h2/ps;AUTO_SERVER=TRUE”中不允许存在与当前工作目录隐式相关的文件路径。请改用绝对路径、~/name、./name或baseDir设置。[90011-196]