我有一项任务要创建一个独立的java应用程序来完成以下任务:
- 分析.csv文件。(这将有大约300万条记录)
- 对于每条记录,在几个DB表中插入约15行
- 如果.csv记录是否成功处理,则输出
我目前设计这个的想法是:
- 阅读.csv文件(还没有考虑这个步骤)
- 为.csv中的每条记录创建一个工作/任务对象。将所有这些任务对象放在队列/列表中
- 创建预定义数量的线程(老式,不使用Executor框架)
每个线程都有一个逻辑:
- 创建数据库连接
if(getNextJobFromList() != null)
// Prepare and insert the statements in a batch update.
- 关闭数据库资源
- 给出输出状态
时间在这里是一个很大的制约因素。
现在的问题是:
-
我可以使用Executor框架加快速度吗?在我的伪代码中,线程在其生命周期中保持DB连接。我可以在Executor框架中做到这一点吗?
-
有其他方法可以优化吗?
提前感谢:)
您可以使用Executor来执行此操作。这听起来不是一个好主意,你会让数据库不堪重负,而且你的大多数线程都会花时间等待。
我认为您最好批量导入数据库(如果您使用的是Oracle,则使用SQL*Loader,其他数据库也有类似的工具),不需要多线程。大容量复制非常快,它可以关闭约束检查和索引修改,只会抓取数据。它比JDBC快几个数量级,如果你想要速度,你应该看看它。