stophin 2016-04-17 14:58 采纳率: 50%
浏览 2102
已采纳

请问JAVA ODBC编程ResultSet多线程的问题

使用ResultSet取得SQL查询的结果,并对每个next进行处理,写入文件中:
File c=new File("E:\test.txt");
FileWriter x = new FileWriter(c);
Statement stat = conn.createStatement();
ResultSet resultSet = stat.executeQuery(sql);
String result = "";
while(resultSet.next()) {
for (int i = 0; i < 100; i++) {
result = result + resultSet.getString(DEF_COLUMN(i));
}
x.write(result);
}
...
然后觉得速度太慢,想要把字符串处理放到线程中(以下简写)
LinkedBlockingQueu queue = new LinkedBlockingQueu(20);
thread 1:
do {
String result = "";
for (int i = 0; i < 100; i++) {
result = result + resultSet.getString(DEF_COLUMN(i));
}
queue.put(result);
}while(resultSet.next());
thread2:
do {
String result = queue.take();
x.write(result);
}while(!queue.isEmpty());
像上面的形式,当thread1开启一个的时候没有问题。但当开启多个thread1时,resultSet在for循环时不能被其他线程执行next否则报错,没办法只能加锁,这样虽然使用了多线程,但thread1被强制转换成单线程,速度并没有多大提升。所以我想问有没有提升resultSet的fetch速度的好方法。
ps:使用ResultSet localSet = reultSet; 尝试了一下,哈哈,localSet只是resultSet的一个引用,并没有把数据复制到localSet中,localSet.next()的时候另一个线程还是会报错。这种办法不可行。

  • 写回答

1条回答 默认 最新

  • threenewbee 2016-04-17 15:08
    关注

    result = result + resultSet.getString(DEF_COLUMN(i));
    用StringBuffer代替直接+运算连接,可以优化性能。

    多线程没必要。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 1月24日

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器