2012-03-25 34 views
0

代码破坏:结果集后的ObjectOutputStream .reset段()

Connection connection; 
    String url, usernameDB, passwordDB; 

    url = "..."; 
    usernameDB = "..."; 
    passwordDB = "..."; 

    Class.forName("com.mysql.jdbc.Driver"); 
    connection = DriverManager.getConnection(url, usernameDB, passwordDB); 
    Statement statement = connection.createStatement(); 

    queryResult = statement.executeQuery(query); 
    boolean moreRecords = queryResult.next(); 
    if(!moreRecords) 
    { 
     out.writeBoolean(false); 
     out.flush(); 
    } 
    else 
    { 
     int cols=0; 
     out.writeBoolean(true); 
     out.flush(); 
     out.reset(); // line 1 
     cols = queryResult.getMetaData().getColumnCount(); 
     out.writeInt(cols); 
     out.flush(); 
     out.reset(); 
     out.flush(); 
     out.reset(); 
     do 
     { 
      for(int i=1;i<=cols;i++) 
      { 
       out.writeObject(queryResult.getObject(i)); // line 2 
       out.flush(); 
       out.reset(); 
      } 
      out.writeBoolean(false); 
      out.flush(); 
      out.reset(); 
     } 
     while(queryResult.next()); 
    } 

'出' 是一个ObjectOutputStream。

当我到在上面的代码行1中,QueryResult对象重置本身,并且当我来线路2我得到一个异常:

“java.sql.SQLException中:结果的结束后组”。

我试图找到一种方法来增加连接超时,但没有找到办法。 看来,当我到达上面的代码中的第1行时,我失去了与数据库的连接,从而破坏了我的queryResult对象。

有没有办法解决这个问题,或者克隆结果集(用它的值)?

EDIT

此代码运行在Tomcat的6,我打开一个ServerSocket和为每个连接我启动一个新的线程继而执行上面的代码....

+1

的任何操作上的'ObjectOutputStream'将对一个'java.sql.ResultSet'没有影响。因此,必须有一些你没有发布的代码。 – 2012-03-25 03:49:26

+0

但这是我的问题,即ObjectOutStream对ResultSet有影响.... 我唯一能想到的是该代码在一个线程中运行.... – Netanel 2012-03-25 15:45:54

回答

0

一些研究后,我找到了解决方案。

我使用CachedRowset对象来保存结果集中的一个副本及其所有值。

这是变更后的代码:

CachedRowSet cachedResults = new CachedRowSetImpl(); 

queryResult = statement.executeQuery(query); 
cachedResults.populate(queryResult); // this is important!! 
boolean moreRecords = cachedResults.next(); 
if(!moreRecords) 
{ 
    out.writeBoolean(false); 
    out.flush(); 
} 
else 
{ 
    int cols=0; 
    out.writeBoolean(true); 
    out.flush(); 
    cols = cachedResults.getMetaData().getColumnCount(); 
    out.writeInt(cols); 
    out.flush(); 
    do 
    { 
     for(int i=1;i<=cols;i++) 
     { 
      out.writeObject(cachedResults.getObject(i)); 
      out.flush(); 
     } 
        out.writeBoolean(false); 
     out.flush(); 
    } 
    while(cachedResults.next()); 
}