线程问题:小的ResultSet可以并发运行,大的就不行了,可能是什么原因? 可以用同步来实现,每次只允许一个线程执行sql操作啊 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 同步?指的是synchronize吗?具体应该加到什么地方呢?这是我的线程的run方法:public void run() { try { PrintWriter out = new PrintWriter(new FileOutputStream(filename + ".txt")); Statement stmt = DBConnection.getStatement(); ResultSet rs = stmt.executeQuery(sql); setStatus("Finished getting result sets"); int i = 0; while (rs.next()) { for(int j=0;j<columns.length;j++){ //写入文件,PrintWriter是自动buffered的吧? out.print(rs.getString(columns[j])); } out.println(); i++; setStatus("progress:" + i); try { sleep(1); } catch (InterruptedException ex1) { ex1.printStackTrace(); } } setStatus("Finished"); rs.close(); stmt.close(); out.close(); } catch (SQLException ex) { ex.printStackTrace(); } catch (FileNotFoundException ex) { ex.printStackTrace(); } System.out.println("over"); } 把进行数据库读取和写入的方法进行同步.加上synchronize关键字,看你的代码好像从数据库中读取和写入文件都在run方法中,那就同步run方法吧. 我觉得不是同步的问题。因为获取ResultSet每个线程只调用一次,并且没有公用的变量。刚才试了,加synchronized关键字,效果和原来一样,而且可能是因为同步的原因,速度变慢了。 Statement stmt = DBConnection.getStatement();对这个stmt同步,保证不同的线程得到的stmt不同。 eliu:好像也不是这个问题……DBConnection: public static synchronized Statement getStatement() { if (null == getConnection()) { return null; } try { return getConnection().createStatement(); } catch (SQLException ex) { return null; } } 今天又试了一下,原来是用一个唯一的Connection对象来为每个线程创建Statement,今天改成每个线程都创建一个Connection,以后的步骤相同,这样一来,每个线程都可以一起运行了,不再卡在ResultSet rs=stmt.executeQuery()这一步。问题是,如果我的线程多了的话,岂不是要创建太多的连接?这肯定不是最好的解决的办法,但我实在是想不清为什么公用一个Connection,不公用Statement也会有问题? 另外问一个无关的小问题:Vector的setElementAt(index,newObject)方法调用后,原来位于Vector.get(index)的对象是否会被自动释放?昨天OutOfMemory了 -_-! 问题 你每个线程都创建一个Connection的话,就没有你一开始遇到的停留问题吗,我认为肯定是由影响的,连接池一般不会超过1000把,我想你的测试是否有问题。 你所说的1百万的连接是因为还来不及释原先的连接,所以停住了。 怎么用Java实现保存网页的功能 The problem about JScrollPane 自己做的一道题,有关重写的,为什么输出结果不对头? Java中怎样判断一个字符串是否有效的时间? 新手求助!!关于date方面的! 为何无法安装Java 2 SDK SE v1.4.2...难道我机子破! 求救,怎么实现iterator的双重循环 很简单的一个问题。为什么会出错? 如何把数字字符串转化为整数? 春节将至,大家来抢分吧! 哪位高手知道如何在java程序中取出windows系统中的证书和私钥 如何通过Socket获得客户端的IP地址?
try { PrintWriter out = new PrintWriter(new
FileOutputStream(filename + ".txt"));
Statement stmt = DBConnection.getStatement();
ResultSet rs = stmt.executeQuery(sql);
setStatus("Finished getting result sets"); int i = 0; while (rs.next()) {
for(int j=0;j<columns.length;j++){
//写入文件,PrintWriter是自动buffered的吧?
out.print(rs.getString(columns[j]));
}
out.println();
i++;
setStatus("progress:" + i);
try {
sleep(1);
}
catch (InterruptedException ex1) {
ex1.printStackTrace();
}
}
setStatus("Finished");
rs.close();
stmt.close();
out.close();
}
catch (SQLException ex) {
ex.printStackTrace();
}
catch (FileNotFoundException ex) {
ex.printStackTrace();
}
System.out.println("over");
}
因为获取ResultSet每个线程只调用一次,并且没有公用的变量。刚才试了,加synchronized关键字,效果和原来一样,而且可能是因为同步的原因,速度变慢了。
对这个stmt同步,保证不同的线程得到的stmt不同。
if (null == getConnection()) {
return null;
}
try {
return getConnection().createStatement();
}
catch (SQLException ex) {
return null;
}
}
问题是,如果我的线程多了的话,岂不是要创建太多的连接?这肯定不是最好的解决的办法,但我实在是想不清为什么公用一个Connection,不公用Statement也会有问题?
你每个线程都创建一个Connection的话,就没有你一开始遇到的停留问题吗,我认为肯定是由影响的,连接池一般不会超过1000把,我想你的测试是否有问题。
你所说的1百万的连接是因为还来不及释原先的连接,所以停住了。