You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Micronaut 4集成SQLite遇只读标志修改失败及启动异常

Micronaut 4 + SQLite 读写连接冲突问题解决方案

问题背景

执行curl --location 'http://localhost:8080/books'请求时触发内部错误,核心报错信息:

{
    "_links": {
        "self": [
            {
                "href": "/books",
                "templated": false
            }
        ]
    },
    "_embedded": {
        "errors": [
            {
                "message": "Internal Server Error: Could not set JDBC Connection [HikariProxyConnection@820093718 wrapping org.sqlite.jdbc4.JDBC4Connection@7d9e8ef7] read-only: Cannot change read-only flag after establishing a connection. Use SQLiteConfig#setReadOnly and SQLiteConfig.createConnection()."
            }
        ]
    },
    "message": "Internal Server Error"
}

问题根源:Micronaut 4默认会对读操作尝试将已建立的连接设为只读,但SQLite不支持在连接创建后修改只读状态。若全局设置连接为只读,又会导致Flyway启动时无法执行写操作,抛出:

io.micronaut.context.exceptions.BeanInstantiationException: Bean definition [javax.sql.DataSource] could not be loaded: Unable to check whether table "main"."flyway_schema_history" exists
...
Caused by: java.sql.SQLException: A statement has already been executed on this connection; cannot upgrade to write transaction

解决步骤

1. 禁用Micronaut Data的自动只读设置

在application.yaml中添加配置,阻止Micronaut Data为读操作修改连接状态:

micronaut:
  data:
    jdbc:
      read-only: false

2. 配置Hikari连接池适配SQLite

修改数据源配置,确保SQLite连接初始即为读写模式,同时避免连接池的状态检查冲突:

datasources:
  default:
    url: jdbc:sqlite:./mydatabase.db
    username: sa
    password: ''
    driver-class-name: org.sqlite.JDBC
    schema-generate: NONE
    dialect: SQLITE # 替换ANSI为SQLite专属方言
    auto-commit: true
    maximum-pool-size: 5
    hikari:
      data-source-properties:
        open_mode: 6 # 对应SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE模式
      connection-test-query: "SELECT 1" # 禁用自动状态检查

3. 修正Repository的方言配置

将Repository的方言从ANSI改为SQLITE,让Micronaut Data针对SQLite做适配:

package com.sqlite.example;

import io.micronaut.core.annotation.NonNull;
import io.micronaut.data.jdbc.annotation.JdbcRepository;
import io.micronaut.data.model.query.builder.sql.Dialect;
import io.micronaut.data.repository.CrudRepository;
import java.util.Optional;

@JdbcRepository(dialect = Dialect.SQLITE)
public interface SqliteSampleRepository extends CrudRepository<Book,Long> {
    @NonNull Optional<Book> findById(Long id);
}

4. 调整Flyway配置(可选)

若Flyway仍出现连接冲突,可增加连接重试次数或确保其使用独立连接:

flyway:
  datasources:
    default:
      enabled: true
      connect-retries: 3

内容的提问来源于stack exchange,提问作者josephjacobmorris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 03:37:03