2 stophin stophin 于 2016.04.17 22:58 提问

请问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个回答

caozhy
caozhy   Ds   Rxr 2016.04.17 23:08

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

多线程没必要。

stophin
stophin 我的问题写得比较简单,获取result那一段意思不是指String性能,而是说COLUMN有几百个,这样不断fetch使用了几秒的时间,要是做到多线程中,本来生成一个String就变为生成几个String,但阻碍在于resultSet是临界资源,必须加锁,如果能把resultSet做内存映射,不断做fetch然后多个线程只管从映射的内存取数据拼接字符串那就好,不知道有没有这样的函数
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
jdbcodbc-ResultSet前后都能读取
import java.sql.*;public class TestSql{ public static void main(String[] args) {  ResultSet result;  try  {  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  Connection con = DriverManager.getConnect
ODBC的多线程应用
ODBC从2.0版本开始已经支持多线程,但是并不意味着跨线程使用ODBC是安全的。微软的意思是说:“嘿,你可以在不同的线程里面使用同一个ODBC连接,但是我没保证那是安全的。”所以,为了我们自己的身家性命,我们有必要在跨线程SQLExecute的时候,自己加上一把锁。 PS:本文为个人使用ODBC心得,并非来自官方文档。
JDBC学习篇之使用ResultSet执行简单查询操作
一、前言 结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,它同时还具有操纵数据的功能,可能完成对数据的更新等。 结果集读取数据的方法主要是getXXX(),它的参数可以是整型,表示第几列,下标从1开始;还可以是列名,指定根据别名返回某一列的值,返回的是对应的XXX类型的值。 如
从”JAVA“而终 18:java Jdbc编程(ResultSet)集合讲解
结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等.      结果集读取数据的方法主要是getXXX(),他的参数可以是整型表示第几列(是从1开始的),还可以是列名。返回的是对应的XXX类型的值。如果对应那列 是空值,XXX是对象的话返回XXX型的空值,如果X
[疯狂Java]JDBC:Statement、ResultSet、连接资源自动关闭、Properties配置文件
1. 建立连接得到Connection对象后如何继续操作数据库?     1) 查询数据库就必须要执行SQL语句,可以通过Connection对象conn获取一个代表要提交给数据库的SQL语句的句柄,即Statement对象;     2) 使用Connection的createStatement方法得到SQL语句句柄:Statement Connection.createStatement(
java.sql.SQLException: ResultSet is closed 的一种解决
碰到这个问题应该不是第一次了,现在才知道其中的一个原因。我在关闭数据库时,总是习惯性地只关闭ResultSet,并且认为那样的话,connnection and statement也会自动关闭的。而事实是,正好相反,JDBC的层次是,Connection一旦关闭,其他两个就自动关闭了。这个与我之前看到的有关IO操作的的值是发生了冲突。因为我记得,在IO中,如果用BufferReader包装
15个顶级Java多线程面试题及回答 / Java程序员面试中的多线程问题
1)现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉。这个多线程问题比较简单,可以用join方法实现。 2)在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性
大规模数据运行时,可以考虑使用多线程处理!
今年3月份测试了一段代码,数据库中有300万条数据,抽出处理后写入文件中。   大规模数据执行时,希望24小时内执行完毕,但是实际测试中,时间达到了27个小时之多。 --------------------------- ---------------------------   今天又看到了这段代码,发现他们应该已经解决了这个问题。   他们解决的方式是才有多线程进行处理。(以下
ODBC API开发教程1
第 1 章        介绍... 2 第 2 章        ODBC API访问数据库... 2 2.1       ODBC简要介绍... 2 2.1.1        在没有ODBC以前... 2 2.1.2    ODBC介绍... 3 2.1.3    ODBC结构... 3 2.1.4    ODBC的一致性... 4 2.2      
线程安全的问题,这是编程中肯定会遇到,遇到必须要解决的问题
趣IT科技 2017-01-13 17:41 在计算机编程中,线程的出现极大的提高了我们的运行效率,所以程序中好多都是多线程,然而多线程的使用却存在一些问题,就是当他操作共享数据的时候,如果不对它们进行严格的把控就有可能出现一些问题,就会导致多线程不仅不会增加效率反而会造成程序bug,所以为了防止这种事情出现,今天就帮助大家解决这个问题,让大家知道什么时候可能会出现问题,并且如何解决它,