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

请问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 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题