ResultSet уничтожен после ObjectOutputStream .reset () - PullRequest
0 голосов
/ 25 марта 2012

код:

    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());
    }

'out' - это ObjectOutputStream.

Когда я добираюсь до строки 1 в приведенном выше коде, объект queryResult сбрасывается сам, и когда я прихожу кстрока 2 я получаю исключение:

"java.sql.SQLException: после окончания набора результатов".

Я попытался найти способ увеличить время ожиданиясвязи, но не нашел пути.кажется, что когда я попадаю в строку 1 в приведенном выше коде, я теряю соединение с базой данных, тем самым разрушая мой объект queryResult.

Есть ли способ решить эту проблему или, возможно, клонировать набор результатов (сзначения)?

РЕДАКТИРОВАТЬ

этот код выполняется в Tomcat 6, я открываю ServerSocket и для каждого соединения я запускаю новый поток, который, в свою очередь, выполняет код выше....

1 Ответ

0 голосов
/ 25 марта 2012

после некоторого исследования я нашел решение.

Я использую объект CachedRowset для хранения копии из ResultSet со всеми его значениями.

это код после изменения:

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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...