Spring Boot 在测试执行期间访问相同的H2文件嵌入数据库时连接超时

ehxuflar  于 2023-04-20  发布在  Spring
关注(0)|答案(1)|浏览(151)

我在Spring-boot应用程序启动期间以文件模式创建H2 db。因此,在运行Serrenity BDD集成API测试时,是否可以连接到相同的db文件?
我采用了此处指定的混合模式方法自动混合模式
application.yaml

spring:
  cache:
    enabled: false
  sql:
    init:
      mode: always
  datasource:
    url: jdbc:h2:./../myApp/data/ppyDB;AUTO_SERVER=TRUE;MODE=Oracle
    username: sa
    password: sa
    baseline-on-migrate: true
    driverClassName: org.h2.Driver
  jpa:
    defer-datasource-initialization: false
    show-sql: true
    hibernate:
      ddl-auto: none

  flyway:
    enabled: true
    username: sa
    password: sa  
    url: jdbc:h2:./../myApp/data/ppyDB;AUTO_SERVER=TRUE;MODE=Oracle
    locations: classpath:/db/h2/migration

  h2:
    console:
      enabled: true
      path: /h2-console

测试运行后,我可以看到数据库中的新记录
这是在测试验证期间连接到相同数据库的代码

sql = "SELECT * FROM HEADER";

try{

    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("org.h2.Driver");
    dataSource.setUrl("jdbc:h2:./../myApp/data/ppyDB;AUTO_SERVER=TRUE;MODE=Oracle");
    dataSource.setUsername("sa");
    dataSource.setPassword("sa");
    conn = dataSource.getConnection();

    String metadataValue = "";
    String strMetadata = "test_code";
    statement = conn.createStatement();
    ResultSet rs = statement.executeQuery(sql);

    while (rs.next()) {
        metadataValue = strMetadata.isEmpty() || strMetadata.isBlank() ? rs.getString(0) : rs.getString(strMetadata);
    }
    statement.close();
    conn.close();

    Assert.assertEquals(key, "header.approve", metadataValue);

DB文件实际路径:C:Projects\myApp\data\myDB.mv.db
SerenityBDD集成测试功能文件路径:C:Projects\myApp\api\src\it\resources\
SerenityBDD集成测试stepDef路径:C:Projects\myApp\api\src\it\java\stepdefs,上面的数据库访问代码所在的位置
主应用程序路径:C:Projects\myApp\api\src\main
然而,我不能连接到数据库使用服务器模式通过上述测试代码。

我通过两个连接连接到同一台机器上的同一个H2文件,如果有意义的话。

当前错误:

org.h2.jdbc.JdbcSQLNonTransientConnectionException: Connection is broken: "java.net.SocketTimeoutException: Connect timed out: 172.28.308.1:32632" [90067-214]  at org.h2.message.DbException.getJdbcSQLException(DbException.java:678)     at org.h2.message.DbException.getJdbcSQLException(DbException.java:477)

myDB.lock.db**

#FileLock
#Wed Apr 12 12:39:46 AEST 2023
server=172.28.308.1\:32632
hostName=AULT-D64WVP99.mshome.net
method=file
id=18773536407803de631be7d5c6a327adf2b4a815286

我可以用这个url jdbc:h2:./../myApp/data/ppyDB;AUTO_SERVER=TRUE;MODE=Oracle在两个窗口中连接到嵌入模式的数据库
所以这里的问题,尽管能够连接在两个H2控制台,为什么不通过代码?进一步我的知识和根据文档不需要指定端口或IP地址(在锁定文件)时,做一个新的连接。
请澄清。

bogh5gae

bogh5gae1#

H2文件数据库一次只允许一个连接。您需要重用现有的连接,完全避免并发连接或在服务器模式下使用H2。
在服务器模式下运行h2的一些链接:https://www.h2database.com/html/tutorial.html#using_server

相关问题