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

SQLDelight插入大体积BLOB数据问题求助

解决SQLDelight插入大体积BLOB数据的内存问题

方法1:直接使用底层JDBC连接操作

SQLDelight基于JDBC(JVM平台),可以直接获取原始Connection,用JDBC原生的流方式插入,避免加载整个文件到内存:

val file = File("your_path")
FileInputStream(file).use { inputStream ->
    database.driver.connection.use { conn ->
        conn.prepareStatement("INSERT INTO MyTable (myBlob) VALUES (?)").use { stmt ->
            stmt.setBlob(1, inputStream)
            stmt.executeUpdate()
        }
    }
}

这种方式绕开SQLDelight生成的查询代码,直接利用JDBC的流处理能力,适合GB级大文件,内存占用极低。

方法2:通过SQLDelight的Bindable接口自定义参数绑定

如果想保留SQLDelight的查询定义,可利用Bindable接口自定义绑定逻辑,直接调用setBlob:

  1. 在myTable.sq中定义插入语句:
CREATE TABLE MyTable (
    myBlob BLOB
);

insertWithStream:
INSERT INTO MyTable (myBlob) VALUES (?);
  1. 在Kotlin代码中自定义绑定逻辑:
val file = File("your_path")
FileInputStream(file).use { inputStream ->
    database.myTableQueries.insertWithStream(
        myBlob = object : Bindable {
            override fun bind(stmt: PreparedStatement, index: Int) {
                stmt.setBlob(index, inputStream)
            }
        }
    )
}

这种方式既遵循SQLDelight的代码结构,又实现了流插入,无需加载全量数据到ByteArray。

方法3:分块写入(极端大文件场景)

针对超大型文件(如几十GB),部分数据库支持分块写入BLOB(比如SQLite的sqlite3_blob_open),此时需要借助数据库原生API或底层JDBC操作分块写入。这种方式实现复杂,仅在其他方法无法满足时考虑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:03:26