可以用同步来实现,每次只允许一个线程执行sql操作啊

解决方案 »

  1.   

    同步?指的是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");
      }
      

  2.   

    把进行数据库读取和写入的方法进行同步.加上synchronize关键字,看你的代码好像从数据库中读取和写入文件都在run方法中,那就同步run方法吧.
      

  3.   

    我觉得不是同步的问题。
    因为获取ResultSet每个线程只调用一次,并且没有公用的变量。刚才试了,加synchronized关键字,效果和原来一样,而且可能是因为同步的原因,速度变慢了。
      

  4.   

    Statement stmt = DBConnection.getStatement();
    对这个stmt同步,保证不同的线程得到的stmt不同。
      

  5.   

    eliu:好像也不是这个问题……DBConnection:  public static synchronized Statement getStatement() {
        if (null == getConnection()) {
          return null;
        }
        try {
          return getConnection().createStatement();
        }
        catch (SQLException ex) {
          return null;
        }
      }
      

  6.   

    今天又试了一下,原来是用一个唯一的Connection对象来为每个线程创建Statement,今天改成每个线程都创建一个Connection,以后的步骤相同,这样一来,每个线程都可以一起运行了,不再卡在ResultSet rs=stmt.executeQuery()这一步。
    问题是,如果我的线程多了的话,岂不是要创建太多的连接?这肯定不是最好的解决的办法,但我实在是想不清为什么公用一个Connection,不公用Statement也会有问题?
      

  7.   

    另外问一个无关的小问题:Vector的setElementAt(index,newObject)方法调用后,原来位于Vector.get(index)的对象是否会被自动释放?昨天OutOfMemory了 -_-!
      

  8.   

    问题
       你每个线程都创建一个Connection的话,就没有你一开始遇到的停留问题吗,我认为肯定是由影响的,连接池一般不会超过1000把,我想你的测试是否有问题。
       你所说的1百万的连接是因为还来不及释原先的连接,所以停住了。