【问题标题】:In memory SQLITE in a Spring Boot application not working在 Spring Boot 应用程序中的内存 SQLITE 中不起作用
【发布时间】:2021-06-22 20:19:14
【问题描述】:

我正在尝试在我的 spring-boot 应用程序中将 SQLITE 设置为内存数据库。但是当我尝试查询数据库时,它给了我一个错误“没有这样的表”

有人可以推荐我做错了什么吗?我只需要在内存中使用 SQLITE,而且我们只在项目中使用 jdbc。

这是我的代码:

application.properties

spring.datasource.url=jdbc:sqlite:memory
spring.datasource.username=
spring.datasource.password= 

spring.datasource.platform=sqlite
spring.datasource.driver-class-name=org.sqlite.JDBC

MyRepo.java

@Repository
public class MyRepo{

    @Autowired
    private NamedParameterJdbcTemplate namedJdbc;
    
    
    public String getUserName() throws Exception{
        String userName = null;
        String sql = "SELECT username FROM emp WHERE username=:name";
        MapSqlParameterSource paramSource = new MapSqlParameterSource();
        paramSource.addValue("name", "tuser");
        userName = this.namedJdbc.query(sql, paramSource, (rs) -> {
                String name = null;
                while (rs.next()) {
                    name = rs.getString("username").trim();
                    return name;
                }
                return null;
            });
        
        return userName;
    }
}

UserDaoTest.java

@SpringBootTest
public class UserDaoTest {
    
    @Autowired
    private MyRepo rep;

    
    @Test
    public void testFindByname() throws Exception{
        rep.getUserName();
        
    }

}

我在 src/main/resources 下也有 schema.sql 和 data.sql 文件

schema.sql

DROP TABLE IF EXISTS emp;CREATE TABLE IF NOT EXISTS emp(username VARCHAR(20), empId BIGINT, PRIMARY KEY(empId) )

数据.sql

INSERT INTO emp(username,empId) VALUES ('tuser',1001);

我得到的异常:

PreparedStatementCallback; uncategorized SQLException for SQL [SELECT username FROM Chats WHERE username=?]; SQL state [null]; error code [1]; [SQLITE_ERROR] SQL error or missing database (no such table: Chats)

【问题讨论】:

  • 还在您的 application.properties 文件中添加属性spring.jpa.hibernate.ddl-auto=update。有关阅读此答案的更多信息:stackoverflow.com/a/66760630/9457633
  • 请注意,Spring Data JDBC(或 JPA)可以完成您需要的一切,而无需自己编写 DAO。
  • @Md. Kawser Habib:我没有在我的项目中使用休眠。我需要让它像 jdbc 本身一样工作
  • @chrylis -cautiouslyoptimistic :我不确定你在说什么,但我需要访问数据并且由于某种原因查询引发异常?

标签: java spring spring-boot sqlite spring-boot-test


【解决方案1】:

好吧,我是在黑暗中拍摄,但看起来您还需要将“聊天”表的架构添加到您的 schema.sql

【讨论】:

    【解决方案2】:

    https://sqlite.org/inmemorydb.html

    数据库连接一关闭,数据库就不再存在。每个 :memory: 数据库都彼此不同。因此,打开两个数据库连接,每个连接的文件名为“:memory:”,将创建两个独立的内存数据库。

    由于其连接池配置,您的问题可能是 Spring Boot 打开多个连接。如果您使用的是 hikari 连接池(在较新的 Spring Boot 版本中默认),请尝试添加这些属性

    spring.datasource.hikari.maximum-pool-size=1
    spring.datasource.hikari.max-lifetime=0
    

    【讨论】:

      猜你喜欢
      • 2018-03-15
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多