0

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

当我尝试将它与 r2dbc 一起使用时。我收到以下明确的错误消息:

由于类 java.lang.IllegalArgumentException 重试获取数据库连接:不支持协议选项 tcp(文件、内存)

文档 r2dbc h2 说它应该与 tcp 协议一起使用。可以?

相应地使用 spring boot 2.3.0.RELEASE 和 r2dbc 版本。

4

2 回答 2

0

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

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

于 2020-05-27T11:58:22.253 回答
0

只是把我的头撞到墙上,想分享结论:

正在使用的依赖项:

<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>

应用程序属性

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());
    }
}

此致

弗拉丹蒂姆

于 2021-08-06T04:38:53.110 回答