java - Spring Boot应用程序无法检测sqlite db文件中定义的表

标签 java spring sqlite maven spring-boot

我有一个 Spring boot 应用程序,它使用 SQLite db 来执行 CRUD 操作。当我尝试向数据库中插入一行时,总是收到此错误。我希望能够使用 sqlite 数据库执行 CRUD 操作。下面给出了我的堆栈跟踪

org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (no such table: Chats)
    at org.sqlite.core.DB.newSQLException(DB.java:909) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.core.DB.newSQLException(DB.java:921) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.core.DB.throwex(DB.java:886) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.core.NativeDB.prepare_utf8(Native Method) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.core.NativeDB.prepare(NativeDB.java:127) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.core.DB.prepare(DB.java:227) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.core.CorePreparedStatement.<init>(CorePreparedStatement.java:41) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.jdbc3.JDBC3PreparedStatement.<init>(JDBC3PreparedStatement.java:30) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.jdbc4.JDBC4PreparedStatement.<init>(JDBC4PreparedStatement.java:19) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.jdbc4.JDBC4Connection.prepareStatement(JDBC4Connection.java:48) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.jdbc3.JDBC3Connection.prepareStatement(JDBC3Connection.java:254) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.jdbc3.JDBC3Connection.prepareStatement(JDBC3Connection.java:226) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.springframework.jdbc.core.JdbcTemplate$SimplePreparedStatementCreator.createPreparedStatement(JdbcTemplate.java:1524) ~[spring-jdbc-4.3.12.RELEASE.jar:4.3.12.RELEASE]
... 

这是不正确的,因为我可以在文件中的 SQLite 客户端中看到正在创建的表的 DDL。

Chats DDL

SQLite db 文件位于 maven 项目中的 src/main/resources/mydb.db 位置。我在应用程序属性中尝试了以下配置。

spring.datasource.url=jdbc:sqlite:mydb.db
spring.datasource.driver-class-name=org.sqlite.JDBC
spring.jpa.database-platform=com.myproject.assignment.SqliteDialect
spring.datasource.username=
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true

方言的配置取自以下 SO 帖子

  1. spring boot: configure Sqlite database

  2. Spring boot and SQLite

  3. resources in a Spring Boot application are missing from jar file when using Spring Boot Maven Plugin

这是将代码插入数据库的方法。

public long insertChatRecord(final ChatRecord chatRecord) {
    if (LOGGER.isDebugEnabled()) {
      LOGGER.debug("Inserting chat record: " + chatRecord);
    }
    DateTime dateTime = DateTime.now().withZone(DateTimeZone.UTC);
    DateTime expirationTime = dateTime.plusSeconds(
        chatRecord.getTimeout() != null ? chatRecord.getTimeout().intValue(): 60);
    final String timestamp = expirationTime.toString(TIMESTAMP_FORMAT);
    long chatId = SequenceGenerator.getInstance().next();
    chatRecord.setChatId(chatId);
    chatRecord.setExpirationTimestamp(expirationTime);
    StringBuilder sb = new StringBuilder();
    sb.append("INSERT INTO Chats(chat_id, username, chat_text, expiration_date) ");
    sb.append("VALUES(?, ?, ?, ?)");
    jdbcTemplate.update(sb.toString(), new PreparedStatementSetter() {

      @Override
      public void setValues(PreparedStatement ps)
          throws SQLException, DataAccessException {
        // TODO Auto-generated method stub
        ps.setLong(1, chatRecord.getChatId());
        ps.setString(2,  chatRecord.getUsername());
        ps.setString(3,  chatRecord.getText());
        ps.setString(4, timestamp);
      }});
    return chatId;
  }

此特定行引发异常。

jdbcTemplate.update(sb.toString(), new PreparedStatementSetter() {

      @Override
      public void setValues(PreparedStatement ps)
          throws SQLException, DataAccessException {
        // Setting values for prepared statement.
      }});

我不知道我做错了什么。我正在 Eclipse 中运行 Spring Boot 应用程序。主要类如下:

@SpringBootApplication
public  class Application {

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

}

我的pom.xml配置为suggested by plugin documentation下面给出。

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

最佳答案

看起来您正在尝试将数据库放入资源 src/main/resources/mydb.db 但根据 spring.datasource.url=jdbc:sqlite:mydb.db spring 正在寻找 jar/执行目录旁边的 db。

我认为你实际上应该选择一个

  • 使用 spring.datasource.url=jdbc:sqlite::resource:mydb.db 语法访问 JAR 存档中包含的只读 DB 文件 More info
  • 将数据库放在 jar 之外。在 IDE 中,它可能位于 src 目录附近:

    projectRoot/
       src/
       mydb.db
    

    并保留spring.datasource.url=jdbc:sqlite:mydb.db

关于java - Spring Boot应用程序无法检测sqlite db文件中定义的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47108612/

相关文章:

java - 使用 RequestHeaderAuthenticationFilter 时如何测试 Internet Explorer?

java - SQLite 插入三行而不是一行

c# - 使用c#在sqlite表中分页

java - 项目 Reactor 中的 Parallel Flux 与 Flux

java - 使用 Scanner 一次读取一个文件夹中的所有文件会给出 NoSuchElementException

java - JSF 1.2 + Spring 2.5。如何?

java - 删除 SQLite 表时出现 IllegalStateException - Android

java - 如何简单地使用stream api编写代码

java - GAE Memcache 读\写问题

java - 确定此 REST 应用程序背后的工具?