如何在春季访问内存数据库

Posted

技术标签:

【中文标题】如何在春季访问内存数据库【英文标题】:How to access a in-memory database in spring 【发布时间】:2016-09-16 18:32:09 【问题描述】:

我正在使用内存嵌入式数据库开发一个独立的 Java 应用程序。我参考了一些文档,并编写了以下代码。我正在使用弹簧引导。 这些是我到目前为止所做的步骤: 在 pom 文件中我添加了这些依赖项。

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
             <groupId>com.h2database</groupId>
             <artifactId>h2</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
         <version>5.1.36</version>
    </dependency> 

在 application.properties 文件中

 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=admin

我创建了一个脚本 schema.sql 和 data.sql schema.sql

CREATE TABLE users
(
    id int(11) NOT NULL AUTO_INCREMENT,
    name varchar(100) NOT NULL,
    email varchar(100) DEFAULT NULL,
    PRIMARY KEY (id)
);

数据.sql

insert into users(id, name, email) values(1,'demouser','user@test.com'); 

这是我的存储库类。

@Repository
public class UserRepository 

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Transactional(readOnly = true)
    public List<User> findAll() 
        return jdbcTemplate.query("select * from users", new UserRowMapper());
    

    class UserRowMapper implements RowMapper<User> 
        @Override
        public User mapRow(ResultSet rs, int rowNum) throws SQLException 
            User user = new User();
            user.setId(rs.getInt("id"));
            user.setName(rs.getString("name"));
            user.setEmail(rs.getString("email"));
            return user;
        

这是我的junit类

@Autowired
    private UserRepository userRepository;
    private EmbeddedDatabase db;

    @Before
    public void setUp() 
        // db = new EmbeddedDatabaseBuilder().addDefaultScripts().build();
        Object db = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).addScript("schema.sql")
                .addScript("data.sql").build();
    

    @Test
    public void findAllUsers() 
        List<User> users = userRepository.findAll();
        System.out.println(users.get(0).getName());
        assertNotNull(users);
        assertTrue(!users.isEmpty());
     

当我运行 junit 时,出现以下错误。

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userRepository': Unsatisfied dependency expressed through field 'jdbcTemplate': Error creating bean with name 'org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Tomcat.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSourceInitializer': Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.UncategorizedScriptException: Failed to execute database script; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

我是否必须添加任何其他依赖项或下载数据库。

【问题讨论】:

【参考方案1】:

由于您想使用 H2 内存数据库,因此您不应该在 pom.xml 中使用 MySql 依赖,在 application.properties 中使用 mysql 相关属性。

pom.xml中移除MySql连接器依赖

    <!--Delete This-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
     <version>5.1.36</version>

并删除application.properties 文件中的所有属性。 留空,Spring boot 会为 H2 数据库自动配置这些属性。

在 GitHub 存储库中查看完整的 Spring Boot JDBC Demo 项目。

【讨论】:

@madhu 如果这回答了您的问题,请接受它。

以上是关于如何在春季访问内存数据库的主要内容,如果未能解决你的问题,请参考以下文章

swisscom云代工厂春季启动应用程序内存不足

如何分配单独的内存来存储机密数据?

如何在内存分析期间跟踪 .NET 应用程序中内存访问的频率和数量?

内存对齐以及如何关闭内存对齐

JNA 访问 NTFS USN (win32)。如何从内存对象中获取数据?

对象如何创建,布局?如何访问数据