如何从另一个 Spring Boot 应用程序访问一个 Spring Boot 应用程序的内存 H2 数据库

Posted

技术标签:

【中文标题】如何从另一个 Spring Boot 应用程序访问一个 Spring Boot 应用程序的内存 H2 数据库【英文标题】:How to access in memory h2 database of one spring boot application from another spring boot application 【发布时间】:2017-09-01 13:11:52 【问题描述】:

在我的项目中,我创建了 3 个 spring boot 应用程序。第一个 Spring Boot 应用程序具有 h2 嵌入式数据库。现在我想直接从我的第二个和第三个 spring boot 应用程序访问这个数据库,而不需要编写任何服务来获取这些数据。那么谁能告诉我如何才能做到这一点?

【问题讨论】:

Raj,别忘了接受对你有帮助的答案... 【参考方案1】:

您可以将 H2 服务器设置为 Spring Bean。

首先编辑 pom.xml - 从 h2 依赖中删除 <scope>runtime</scope>

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

然后将H2服务器bean添加到SpringBootApplicationConfiguration类:

@SpringBootApplication
public class Application 

    public static void main(String[] args) 
        SpringApplication.run(Application.class, args);
    

    /**
     * Start internal H2 server so we can query the DB from IDE
     *
     * @return H2 Server instance
     * @throws SQLException
     */
    @Bean(initMethod = "start", destroyMethod = "stop")
    public Server h2Server() throws SQLException 
        return Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9092");
    

最后 - 编辑application.properties - 设置数据库名称:

spring.datasource.url=jdbc:h2:mem:dbname
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create

然后您可以使用此连接从外部连接到此 H2 服务器(例如,使用 H2 DB 连接到您的应用程序):

jdbc:h2:tcp://localhost:9092/mem:dbname

使用此网址作为奖励,您可以直接从您的 IDE 连接到应用程序的数据库

更新

尝试连接到 H2 for Spring Boot app 1.5.x 版本时可能会出错。在这种情况下,只需将 H2 的版本更改为以前的版本,例如:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.193</version>
</dependency>

更新 2

如果您需要在同一主机上同时运行多个带有 H2 的应用程序,您应该在 Server.createTcpServer 方法中为它们设置不同的 H2 端口,例如:9092、9093 等。

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


// Second App
@Bean(initMethod = "start", destroyMethod = "stop")
public Server h2Server() throws SQLException 
    return Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9093");

然后您可以使用以下 url 连接到这些应用程序的 H2 DB:

App1 H2: jdbc:h2:tcp://localhost:9092/mem:dbname
App2 H2: jdbc:h2:tcp://localhost:9093/mem:dbname

【讨论】:

@Salman Server 是来自 com.h2database:h2 工件的 org.h2.tools 包的类 - 请参阅依赖项。并且不要忘记从中删除&lt;scope&gt;runtime&lt;/scope&gt; 谢谢。顺便说一句,在您尝试连接的其他应用程序的配置文件中,您应该将spring.datasource.url 设置为jdbc:h2:tcp://localhost:9092/mem:dbname @sedooe 关闭原因。我写的 - 见答案的最后几行。或者你的意思是不同的?.. 啊抱歉,没看到那行:) @AndyDufresne 您只需要第一个应用程序拥有数据库,第二个应用程序连接到第一个应用程序数据库?在这种情况下,您应该只在第一个应用程序中设置 h2Server bean。第一个应用程序应该使用 url jdbc:h2:mem:dbname 连接到自己的数据库,第二个应用程序应该使用 url jdbc:h2:tcp://localhost:9092/mem:dbname 连接到数据库。【参考方案2】:

您可以在服务器模式下运行H2

import org.h2.tools.Server;
...
// start the TCP Server
server = Server.createTcpServer("-tcpAllowOthers").start();
...
// stop the TCP Server
server.stop();

Usage: java org.h2.tools.Server 
When running without options, -tcp, -web, -browser and -pg are started.
Options are case sensitive. Supported options are:
[-help] or [-?]         Print the list of options
[-web]                  Start the web server with the H2 Console
[-webAllowOthers]       Allow other computers to connect - see below
[-webDaemon]            Use a daemon thread
[-webPort ]       The port (default: 8082)
[-webSSL]               Use encrypted (HTTPS) connections
[-browser]              Start a browser connecting to the web server
[-tcp]                  Start the TCP server
[-tcpAllowOthers]       Allow other computers to connect - see below
[-tcpDaemon]            Use a daemon thread
[-tcpPort ]       The port (default: 9092)
[-tcpSSL]               Use encrypted (SSL) connections
[-tcpPassword ]    The password for shutting down a TCP server
[-tcpShutdown ""]  Stop the TCP server; example: tcp://localhost
[-tcpShutdownForce]     Do not wait until all connections are closed
[-pg]                   Start the PG server
[-pgAllowOthers]        Allow other computers to connect - see below
[-pgDaemon]             Use a daemon thread
[-pgPort ]        The port (default: 5435)
[-properties ""]   Server properties (default: ~, disable: null)
[-baseDir ]        The base directory for H2 databases (all servers)
[-ifExists]             Only existing databases may be opened (all servers)
[-trace]                Print additional trace information (all servers)
The options -xAllowOthers are potentially risky.
For details, see Advanced Topics / Protection against Remote Access.
See also http://h2database.com/javadoc/org/h2/tools/Server.html

How to use h2 as a server

Similar question 1

Similar question 2

【讨论】:

以上是关于如何从另一个 Spring Boot 应用程序访问一个 Spring Boot 应用程序的内存 H2 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个新的 Spring Boot 项目调用一个 Spring Boot 项目中存在的 Spring Boot api

从另一个 Magnolia 模块访问 Spring 服务(不使用 Spring Blossom)

Spring-Boot 多模块无法从另一个模块读取属性文件

从另一个 Spring Boot JPA 项目插入的数据库中读取数据

使用 Spring Boot 从另一个服务调用 Rest Service 以进行课程注册系统

如何从 Spring Boot 应用程序之外的位置读取 application.properties 文件