如何从Spring boot应用程序以服务器模式启动HSQLDB

问题描述 投票:0回答:2

我有一个Spring boot应用程序,使用jpa数据和hsqldb 2.3.3(在Centos 7中)运行,该应用程序运行良好,但我想使用HSQLDB数据库管理器来检查数据状态,但是它失败了:

应用程序属性:

spring.datasource.url=jdbc:hsqldb:mem:testdb
spring.datasource.username=sa
spring.datasource.password=

spring.jpa.database-platform=org.hibernate.dialect.HSQLDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create

启动HSQLDB的命令:

java -cp /home/mycentos/.m2/repository/org/hsqldb/hsqldb/2.3.3/hsqldb-2.3.3.jar org.hsqldb.util.DatabaseManagerSwing

如果我尝试使用 HSQLDB 服务器模式登录,则会弹出

Connection refused
错误

jdbc:hsqldb:hsql://localhost/testdb

如果我尝试登录内存数据库,我可以登录,但没有显示表和数据

jdbc:hsqldb:hsql:testdb

问题:

  1. 如何让它发挥作用?
  2. 我是否必须引用 tomcat 部署文件夹中的 hsqldb.jar,因为应用程序使用的是该文件夹?
  3. 从 Spring 应用程序以服务器模式或内存模式配置 hsqldb 有什么配置差异?
  4. 任何方法都可以使内存模式在这种情况下工作(通过Spring boot创建的数据库检查数据)吗?
spring jdbc hsqldb
2个回答
6
投票

要访问Spring boot应用程序创建的HSQL数据库,您必须启动HSQL服务器。例如,创建一个XML配置文件

hsql_cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="hqlServer" class="org.hsqldb.server.Server" init-method="start" destroy-method="stop">
    <property name="properties"><bean class="org.hsqldb.persist.HsqlProperties">
        <constructor-arg><props>
        <prop key="server.database.0">mem:testdb</prop>
        <prop key="server.dbname.0">testdb</prop><!--DB name for network connection-->
        <prop key="server.no_system_exit">true</prop>
        <prop key="server.port">9001</prop><!--default port is 9001 -->
        </props></constructor-arg>
    </bean></property>
</bean>
</beans>

这是在主应用程序类中导入 XML 配置的示例。

@SpringBootApplication
@ImportResource(value="classpath:/package/hsql_cfg.xml")
public class MyApplication {
}

HSQL 服务器将通过 Spring boot 应用程序启动。其他应用程序可以使用 JDBC url 连接到 HSQL 服务器

jdbc:hsqldb:hsql://ip_address:端口/testdb

当然,加载 JDBC 驱动类需要

hsqldb.jar


2
投票

只是为了补充 Beckyang 的答案,这是我的方法。

包括将日志重定向到 slf4j 的 hack。

包括指定相应的数据源。

    import org.hsqldb.jdbc.JDBCDataSource;
    import org.hsqldb.server.Server;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;

    import javax.sql.DataSource;
    import java.io.ByteArrayOutputStream;
    import java.io.PrintWriter;

    @Configuration
    public class DataSourceConfiguration {

        private final Logger log = LoggerFactory.getLogger(getClass());

        @Bean(initMethod = "start", destroyMethod = "stop")
        @ConfigurationProperties//(prefix = "alarms.idempotent.server")
        public Server idempotentServer(@Value("${alarms.idempotent.server.path}") String path, @Value("${alarms.idempotent.port}") int port, @Value("${alarms.idempotent.name}") String name) {

            Server server = new Server();
            server.setDatabaseName(0, name);
            server.setDatabasePath(0, path);
            server.setPort(port);
            server.setLogWriter(slf4jPrintWriter());
            server.setErrWriter(slf4jPrintWriter());

            return server;

        }

        @Bean("idempotentDataSource")
        @Primary
        @ConfigurationProperties
        public DataSource idempotentDataSource(@Value("${alarms.idempotent.datasource.url}") String urlNoPath, @Value("${alarms.idempotent.name}") String name) {
            JDBCDataSource jdbcDataSource = new JDBCDataSource();
            String url = urlNoPath;
            if (!url.endsWith("/")) {
                url += "/";
            }
            url += name;
            jdbcDataSource.setUrl(url);
            jdbcDataSource.setUser("sa");
            return jdbcDataSource;
        }

        private PrintWriter slf4jPrintWriter() {
            PrintWriter printWriter = new PrintWriter(new ByteArrayOutputStream()) {
                @Override
                public void println(final String x) {
                    log.debug(x);
                }
            };
            return printWriter;
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.