代码:
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,对于每个连接,我启动一个新线程,然后执行上面的代码....
答案 0 :(得分:0)
我使用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());
}