问题描述
- 请问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()的时候另一个线程还是会报错。这种办法不可行。
解决方案
result = result + resultSet.getString(DEF_COLUMN(i));
用StringBuffer代替直接+运算连接,可以优化性能。
多线程没必要。
时间: 2024-09-29 17:43:07