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

R2dbc不使用tcp处理h2数据库

邹晟睿
2023-03-14

我尝试使用docker容器oscarfonts/h2将h2与r2dbc一起使用。默认情况下,在使用此容器时,我们必须使用tcp协议,

当我尝试将其用于r2dbc时。我得到了明确的以下错误消息:

由于类java.lang.IllegalArgumentException重试获取数据库连接:不支持协议选项tcp(file, mem)

文档r2dbc h2说它应该与tcp协议一起工作。是吗?

使用Spring boot 2.3.0。相应地发布和r2dbc版本。

共有3个答案

强志学
2023-03-14

我只是用这句话把我的头撞到墙上,想和大家分享一下结论:

正在使用的依存关系:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.2</version>
    <relativePath />
</parent>

<dependencies>
    <dependency>
        <groupId>io.r2dbc</groupId>
        <artifactId>r2dbc-h2</artifactId>
    </dependency>

    <!-- and something to provide spring beans -->

</dependencies>

application.properties

spring.r2dbc.url=r2dbc:h2:tcp://localhost:9090/mem:mydb
# also works for file-based h2db 
# spring.r2dbc.url=r2dbc:h2:tcp://localhost:9090/file./oreport
spring.r2dbc.username=sa
spring.r2dbc.password=

这个bean将创建您需要的H2ConnectionFactory实例。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import io.r2dbc.h2.H2ConnectionConfiguration;
import io.r2dbc.h2.H2ConnectionFactory;

@ConditionalOnProperty("spring.r2dbc.url")
@ConditionalOnExpression("#{'${spring.r2dbc.url}'.substring(0,12) matches 'r2dbc:h2:tcp'}")
@Configuration
public class H2Config {

    /**
     * As of 2021-08-06 the latest r2dbc-h2 version is 0.8.4.RELEASE and, even when
     * tcp connections where enabled, there's still no auto-configuration. This Bean
     * helps that.
     * 
     * @see <a href="https://github.com/r2dbc/r2dbc-h2/issues/86">r2dbc-h2
     *      Issue#86</a>
     */
    @Bean
    public H2ConnectionFactory h2ConnectionFactory(@Value("${spring.r2dbc.url}") String url,
            @Value("${spring.r2dbc.username}") String username, @Value("${spring.r2dbc.password}") String password) {
        url = url.substring("r2dbc:h2:".length());
        return new H2ConnectionFactory(
                H2ConnectionConfiguration.builder().url(url).username(username).password(password).build());
    }
}

顺致敬意,

弗拉丹蒂姆

鱼锦
2023-03-14

不,这是不可能的。

如果您将使用类似spring.r2dbc.url=r2dbc:h2的内容:tcp://...您将得到IllegalArgumentException:协议选项tcp不受支持(文件,内存)

使用文件或内存

来源:

正如你所见,有构建器。文件和生成器。inMemory只能使用,但不能使用生成器。tcp:

白光耀
2023-03-14

R2DBC H2是H2数据库的一个小包装器。这意味着整个基础设施使用与JDBC相同的H2实现,这都是阻塞。

因此,在使用R2DBC时,您不应该通过TCP使用H2,而应该使用具有适当的非阻塞I/O实现的不同数据库(MySQL、MariaDB、Postgres、SQLServer)。

 类似资料:
  • 我有一个在mySQL上运行的小型数据库应用程序。 我想使用H2进行测试。 我向build.gradle添加了必要的依赖项: runtimeOnly’com。h2数据库:h2' 然而,我注意到,在完成测试之后,我的mySQL数据库包含测试期间生成的字段,就好像spring没有使用H2一样。 有什么问题吗?

  • 欢迎任何输入或反馈。

  • 关于函数使用,与带来的问题。 函数 函数主要给数据提供处理与转换方便。 大多数SQL实现的函数 用于处理文本串(删除,充值,大小写转换) 用于在数值的数据上进行算术(返回绝对值,代数运算)操作。 用于处理日期时间值并从这些值中提取特定成份。 返回DBMS正使用的特殊信息(用户登录信息)。 文本处理函数 使用UPPER()函数来转换大小写。 mysql> SELECT vend_name, UPPE

  • 我刚刚用Java8创建了springboot批处理应用程序,我想用Anotation为springbatch表创建一个数据库。 我想我必须创建配置文件,但我不知道怎么做。 @Configuration公共类ConfigBatch{ } 我导入“@ImportResource”生成一个错误,因为在我的java代码中有一个数据源,在我的xml文件中有一个数据源: 我只想在H2数据源中生成spring批

  • 我正在使用Glassfish应用服务器开发一个web应用程序。我已经安装了H2 DB,现在正试图在glassfish中定义一个连接池,但在尝试ping DB时失败了。 以下是我所做的: > 资源类型:javax。sql。数据源 数据库驱动程序供应商:H2 数据源类名:org。h2.jdbcx。JdbcDataSource 我的“其他属性”包括: 用户:my\u db\u user 当我尝试ping

  • 有人知道为什么吗?我该怎么解决?