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:
- 在
myTable.sq中定义插入语句:
CREATE TABLE MyTable ( myBlob BLOB ); insertWithStream: INSERT INTO MyTable (myBlob) VALUES (?);
- 在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
相关产品推荐
相关产品推荐

