当前位置: 首页 > 知识库问答 >
问题:

无法连接到H2数据库

纪翰
2023-03-14

我一直在努力使用数据库URL概述部分提到的以下连接字符串从Spring Boot应用程序连接H2数据库:

spring.datasource.url=jdbc:h2:tcp://localhost:9092/~/test-db

我还尝试了许多不同的tcp(服务器模式)连接组合,但仍然出现错误,例如“连接中断:”java。网运行Spring Boot app时,SocketTimeoutException:连接超时:localhost:9092”。

@SpringBootApplication
public class Application {

    // code omitted
    
    @Bean(initMethod = "start", destroyMethod = "stop")
    public Server h2Server() throws SQLException {
        return Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9092");
    }
}

那么,如何解决这个问题并通过服务器模式连接到H2数据库呢?

共有1个答案

赫连彬炳
2023-03-14

你似乎有点困惑。

H2可以在两种不同的“模式”下运行。

本地模式意味着H2“正常工作”,您可以使用JDBC连接URL中的file:事物访问此模式。JDBC驱动程序本身完成所有数据库工作,例如,它打开文件、写入数据,它完成所有工作。根本没有“数据库服务器”。或者,如果您愿意,JDBC驱动程序是它自己的服务器,尽管它不打开端口。

在这种情况下,您需要一个(单独的)JVM,并在服务器模式下单独启动H2,然后可以使用相同的库(仍然是H2.jar)作为JDBC服务器。在这种模式下,这两件事是完全分开的——如果需要,可以运行h2。jar在一台机器上作为服务器,并运行相同的h2。jar安装在完全不同的机器上,只是为了连接到另一台H2机器。数据库服务器机器完成了大部分工作,“客户机”H2只是JDBC驱动程序。H2与mysql或postgres在这种模式下没有什么不同:您有一个作为数据库引擎运行的“应用程序”/JVM进程,允许多个不同的进程连接到它,如果您愿意,甚至可以来自世界各地完全不同的机器。

您可以使用JDBC字符串中的tcp:内容访问此模式。

如果您真的愿意,您可以运行这种模式,并且仍然在一台机器上,甚至在一个JVM上拥有所有功能,但您为什么要这样做呢?无论您认为这将“解决锁定错误”的原因是什么,都无法通过在单个JVM上运行所有这些东西来修复。只有两种选择:

  • 你分析错了问题

您很可能需要一个单独的JVM,它在之前启动并托管h2数据库;它需要在“客户端”JVM(将连接到它的JVM)开始运行之前运行。Catalina不是你要找的“服务器”,它是org。h2.工具。服务器,如果它说“找不到”,则需要修复maven导入。这需要一个单独的JVM(您可以编写这样的代码:哦,嘿,h2服务器上没有单独的JVM,所以我现在就在这里启动它,但这意味着该进程需要永远悬而未决,这很奇怪。因此,您需要一个单独的JVM进程)。

你还没有解释你在做什么。但是,让我们说,你正在做的是:

  • 我有一个CI脚本,它可以启动多个单独的JVM,有些甚至是并行的,它可以并行运行一系列集成和单元测试
  • 即使它们是并行运行的(或者可能是有意的),您都希望在一个DB上运行它。这通常是个很糟糕的主意(您希望测试被隔离;独立运行测试的行为仍然相同。您不希望测试失败的方式只有在您使用相同的运行代码运行同一批18个独立测试时才能复制,其中一个不相关的测试以特定方式失败,而星期二是满月,贝多芬正在您的音乐播放器中播放,并且温度高于24ºin。)当然,影响CPU节流的空间。如果您尝试在多个测试中重复使用资源,这正是可能发生的情况!)尽管如此,你还是真的想要这个
  • 。。。然后,编辑CI脚本,首先启动承载H2服务器的JVM,一旦启动并运行,可能会运行一个用测试数据填充此数据库的进程,一旦完成,然后并行运行所有测试,一旦完成,关闭JVM,并删除DB文件

确切地说,如何完成第三部分是一个单独的问题-如果您需要帮助,请提出一个新问题,并命名用于运行这些内容、粘贴配置文件等的相关工具。

 类似资料:
  • 测试通过,即数据输入数据库,检查,一切正常。 但当我在调试模式下运行测试,在测试末尾放一个断点,尝试连接到数据库时,它是空的,连表都没有,更别提数据了。要连接,我使用dbever。在连接字符串中,我编写jdbc:h2:mem:mytestdb;db_close_on_exit=false(我尝试了jdbc:h2:tcp://localhost:9092/mem:mytestdb)。检查连接通过,写

  • 我需要帮助。我不知道这个项目出了什么问题。我无法连接到h2数据库。即使我没有持久化任何对象,只是关闭连接,我也会得到错误。 对不起,我知道,这已经被问过几次了,但没有一个答案符合我的情况。 我得到的错误: pom.xml: Hibernate Utils类: 储存库 项目结构:

  • 我在持久性中有以下配置。我的jpa应用程序的xml: 我想它被称为“自动混合模式”,我应该能够使用h2控制台中的jdbc:h2:file:c:/workdir/db/dev url访问它。 我启动h2控制台: 然后,我只看到INFORMATION\u SCHEMA,没有看到我的应用程序创建的表。 怎么了?

  • 问题内容: 这是我简单的测试脚本。只是试图做一个基本的选择语句。在教程中找到了基本知识。 经过一个小时的搜索并尝试了一些解决方案,我比开始时就更接近解决问题了。希望我在某个地方犯了一个简单的错误,但我找不到它… 这是我遇到的错误 任何帮助将非常感激! 问题答案: 如果未在URL中指定,则该方言的默认驱动程序将为“ SQL Server” [1]。这意味着您需要在/etc/unixODBC/odbc

  • 我已经把学校的IT项目带回家完成,虽然我可以在学校连接到我的数据库,但我不能在我自己的电脑上连接到它。我更改了数据库类中的目录,并且几乎100%确定该目录是正确的。它总是给我这样的错误: 驱动程序成功加载无法连接:[Microsoft][ODBC驱动程序管理器]未找到数据源名称且未指定默认驱动程序java.sql.sqlException:[Microsoft][ODBC驱动程序管理器]未找到数据

  • 2012年12月19日下午7:26:55 DBConnect严重:null java.sql.sqlexception:[Microsoft][ODBC Driver Manager]未找到数据源名称,也未在sun.jdbc.ODBC.jdbc.ddc.createsqlexception(jdbcodbc.jdbc.jdbc.jdbc.jdbc.jdbc.jdbc.jdbc.jdbc.jdbc.