问题描述
在我的 Micronaut 应用程序中,我必须在 sqllite 数据库中注入 csv 数据。目前我已经创建了一个脚本,它像这样调用端点:
curl -v -X POST "http://hostname:3030/inject"
它正在选择一个已经在服务器上可用的 csv 文件并将其注入 sqllite db,但我想将 csv 文件传递给端点本身,并希望使用 Rxjava Flowable 在服务器端接收它,如下所示:
updateDb(@Body Flowable<String> content) {
//saveFlowabletoFile(path,content);
//pick the path to load the data
...
}
我曾尝试查找有关如何执行此操作的文档,但未能成功。
任何人都可以建议上传 20MB csv 文件并注入它是否是正确的方法,或者有更好的方法来做到这一点。
谢谢,
解决方法
大文件最干净的解决方案应该是将数据直接流式传输到 Sqlite。
https://docs.micronaut.io/latest/guide/index.html#binding(流支持)
@Post(value = "/upload",processes = [MediaType.TEXT_PLAIN])
@ExecuteOn(TaskExecutors.IO)
fun read(@Body inputStream: InputStream) {
BufferedReader(InputStreamReader(inputStream))
...for every line in the buffered reader,parse CSV and insert to SQLite...
}
流式传输的全部意义在于在任何时间点都不能在内存中完整表示文件,因此您保存到磁盘然后再次提取的解决方案似乎不是最佳的。
这也可以通过 Reactive 实现,但我无法就该主题做出贡献。