【问题标题】:How to run H2 database in server mode?如何在服务器模式下运行 H2 数据库?
【发布时间】:2012-03-08 06:06:39
【问题描述】:

我需要从我的应用程序以服务器模式启动 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)

【问题讨论】:

  • 这对我不起作用
  • 好的...我的意思是 - 请更具体。为什么这不起作用?你想达到什么目标?到目前为止,您尝试过什么?
  • 请展示你目前所做的研究、代码、工作。

标签: java database h2


【解决方案1】:

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

顺便说一下,不要同时使用AUTO_SERVER=TRUE服务器模式。请参阅automatic mixed mode 的文档。使用任何一个。

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

【讨论】:

  • 异常消息给人的印象是在embedded mode 中运行数据库只允许1 个连接,而将它放在server mode 中将允许多个连接。不是这样吗?
  • 不,事实并非如此。请参阅文档。
  • @Thomas--我浏览了许多帖子,我一直看到你说要查看文档。请不要那样做。文档,尤其是关于 startTcpServer 的文档,充其量是稀疏的。服务器启动,可以远程关闭,但拒绝所有连接。
  • @Steve11235 我为“嵌入式模式只允许 1 个连接”的问题写了“参见文档”。这有明确的记录。 TcpServer 的文档可能不够好,这是真的。但是这里的这个问题与 TcpServer 无关。也许你应该写你自己的问题?
【解决方案2】:

从命令行,

java -jar h2-1.3.160.jar -webAllowOthers -tcpAllowOthers

这将在服务器模式下启动一个 h2 数据库:

Web Console server running at http://A.B.C.D:8082 (others can connect)
TCP server running at tcp://A.B.C.D:9092 (others can connect)
PG server running at pg://A.B.C.D:5435 (only local connections)

打开浏览器以获得管理 GUI

【讨论】:

  • 使用这种方式时,如何增加最大允许连接数?
  • 这个对我有用。特别要注意默认的TCP端口:9092(可以使用-tcpPort调整)!
【解决方案3】:

您可以使用以下代码在服务器模式下运行 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>

您可以使用 SQuirrel SQL 客户端 (http://squirrel-sql.sourceforge.net/) 连接到您的 H2 数据库并查看表。

  1. 创建新连接。
  2. 在驱动程序下拉菜单中选择 H2
  3. 将 url 设置为您的项目目标文件夹 h2 文件夹 (jdbc:h2:C:\projects\workspace\TestProject\target/h2/ps;AUTO_SERVER=true)
  4. 输入用户名(“sa”)
  5. 输入密码(“”)

【讨论】:

  • org.h2.jdbc.JdbcSQLException:数据库 URL“jdbc:h2:target/h2/ps;AUTO_SERVER=TRUE”中不允许隐式相对于当前工作目录的文件路径.请改用绝对路径、~/name、./name 或 baseDir 设置。 [90011-196]
【解决方案4】:

关闭所有使用 H2 的应用程序(Web 控制台等) 然后将 AUTO_SERVER=TRUE 添加到 h2 控制台和 java 程序中的位置末尾(您已经完成了)

【讨论】:

    【解决方案5】:

    我在尝试启动 H2 时遇到此错误。
    另见http://h2database.com/javadoc/org/h2/tools/Server.html

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

    所以我按照以下步骤操作:

    1. make dir mkdir h2db 此目录将包含您的 db 文件。
    2. 点击这个命令: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
    3. 如果您想在后端运行 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/ &amp;
    4. 现在运行 ./bin.h2.sh。

    【讨论】:

      【解决方案6】:

      还有一种方法。你可以定义@Configuration bean, fg.: ' @配置 公共类 H2Configuration {

      @Bean
      public void startTCPServer(){
          try {
              Server h2Server = Server.createTcpServer().start();
              if (h2Server.isRunning(true)) {
                  System.out.println(h2Server.getStatus());
              } else {
                  throw new RuntimeException("Could not start H2 server.");
              }
          } catch (SQLException e) {
              throw new RuntimeException("Failed to start H2 server: ", e);
          }
      }
      

      } '

      【讨论】:

        猜你喜欢
        • 2014-11-12
        • 2013-01-24
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        • 2013-02-21
        • 2011-11-17
        • 1970-01-01
        相关资源
        最近更新 更多