【发布时间】:2015-06-21 13:26:25
【问题描述】:
我的班级有两个方法,首先我调用方法dbExecuteStatement(),它执行sql 查询。执行 sql 查询后,我得到一个 ResultSet 对象。我将这个 ResultSet 对象保存在一个静态 hashMap 中,以便在我的下一个方法调用fetchResults() 中,我可以使用现有的结果集来检索结果。将 ResultSet 对象保存在地图中的原因是,在 fetchResults() 方法请求参数中,我将获得最大获取行大小,并根据该值迭代结果集。这两种方法都应该从客户端单独调用。
现在我面临的问题是,当我在 fetchResults() 方法中迭代 ResultSet 对象时,我的行数为零。如果我从 dbExecuteStatement() 中的 hashMap 中获取相同的 ResultSet,我会得到实际的行数,即在我的情况下为 5。我检查了我在fetchResults() 方法和dbExecuteStatement() 中放入哈希映射的ResultSet 对象,它是同一个对象。但是如果在fetchResults() 方法和dbExecuteStatement() 中得到ResultSetMetaData 对象,它们就会不同。有人可以帮助我理解原因,为什么我得到的结果计数为零。
下面是代码:
public class HiveDao1 {
private static Map<Object,Map<Object,Object>> databaseConnectionDetails
= new HashMap<Object,Map<Object,Object>>();
//This method will execute the sql query and will save the ResultSet obj in a hashmap for later use
public void dbExecuteStatement(DbExecuteStatementReq dbExecuteStatementReq){
//I already have a connection object saved in map
String uniqueIdForConnectionObject = dbExecuteStatementReq.getDbUniqueConnectionHandlerId();
Map<Object,Object> dbObject = databaseConnectionDetails.get(uniqueIdForConnectionObject);
Connection connection = (Connection) dbObject.get(DatabaseConstants.CONNECTION);
try {
Statement stmt = connection.createStatement() ;
// Execute the query
ResultSet resultSet = stmt.executeQuery(dbExecuteStatementReq.getStatement().trim()) ;
//save the result set for further use, Result set will be used in fetchResult() call
dbObject.put(DatabaseConstants.RESULTSET, resultSet);
/*
* Now below is the debugging code,which I put to compare the result set
* iteration dbExecuteStatement() and fetchResults method
*/
ResultSet rs = (ResultSet) dbObject.get(DatabaseConstants.RESULTSET);
ResultSetMetaData md = (ResultSetMetaData) dbObject.get(DatabaseConstants.RESULTSETMETADATA);
System.out.println("==ResultSet fethced in dbExecuteStatement=="+rs);
System.out.println("==ResultSet metadata fetched in dbExecuteStatement ==="+rs.getMetaData());
int count = 0;
while (rs.next()) {
++count;
}
if (count == 0) {
System.out.println("No records found");
}
System.out.println("No of rows found from result set in dbExecuteStatement is "+count);
} catch (SQLException e) {
e.printStackTrace();
}
}
/*
* This method fetch the result set object from hashMap
* and iterate it on the basis of fetch size received in req parameter
*/
public void fetchResults(FetchResultsReq fetchResultsReq){
String uniqueIdForConnectionObject = fetchResultsReq.getDbUniqueConnectionHandlerId();
Map<Object,Object> dbObject = databaseConnectionDetails.get(uniqueIdForConnectionObject);
try {
//Fetch the ResultSet object that was saved by dbExecuteStatement()
ResultSet rs = (ResultSet) dbObject.get(DatabaseConstants.RESULTSET);
ResultSetMetaData md = (ResultSetMetaData) dbObject.get(DatabaseConstants.RESULTSETMETADATA);
System.out.println("ResultSet fethced in fetchResults at server side dao layer======"+rs);
System.out.println("ResultSet metadata fetched in fetchResults at server side dao layer======"+md);
int count = 0;
while (rs.next()) {
++count;
}
if (count == 0) {
System.out.println("No records found");
}
//Here the row count is not same as row count in dbExecuteStatement()
System.out.println("No of rows found from result set in fetchResults is "+count);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
【问题讨论】:
-
String uniqueIdForConnectionObject = dbExecuteStatementReq.getDbUniqueConnectionHandlerId();是否有可能在两种方法中返回不同的值?您似乎正在使用该唯一 ID 获取 Map,它可能会返回两个不同的地图。 -
两个问题 - 1. HiveDao1 类是单例吗? 2. 能否附上调用fetchResults方法的代码?
-
不,我检查了,我使用相同的密钥来检索地图。
-
@TechnoCrat,不,它不是单例,它实际上是一个 dao 层,当我公开两个服务时,我有一个服务层,一个用于 executeStatement,另一个用于 fetchResults。这些服务实际上是从客户端一步一步调用的。
-
(a) 请注意,您的调试测试会导致结果集光标移动到末尾,因此任何后续提取都将不起作用。 (b) 如果您一个接一个地立即调用这两个方法,您的问题(假设您删除了调试部分)是否也会发生?