处理多个ResultSet

时间:2014-07-15 04:09:22

标签: java

我有以下类有3个结果集。

public class AllMetricsResultSet {

        ResultSet top10Files;
        ResultSet top10FilesForUsage;
        ResultSet top10DataSet;

    }

在另一种方法中,我有3个不同的选择语句(我只给出了一个选择,但有3个),它们将结果集分配到上面。

public AllMetricsResultSet SPDataList (String alldata)
{
...........

     String sSQL = "SELECT USERNAME, NUMBEROFFILES FROM FILE_INFO";

     PreparedStatement stm = dbConnection.prepareStatement(sSQL);

                    if (stm.execute())
                        //TopTenantsForUsage = stm.getResultSet();
                        rs.top10Files = stm.getResultSet();
                        rs.top10FilesForUsage = stm.getResultSet();
                        rs.top10DataSet = stm.getResultSet()

然后最后从另一个方法,我调用前面的方法如下:

AllMetricsResultSet mrs = SPDataList(alldata);

        while (mrs.top10Files.next()) 

(这个while语句失败。我看到有10行返回。我试过mrs.top10Files.getFetchSize()(这也失败了)

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

在一种方法中执行查询并以不同方法从结果集中读取数据不是一个好习惯。

您希望尽快完成数据库访问并关闭连接,以便将连接返回到连接池(当您有多个线程访问数据库时相关)并释放语句可能需要的任何数据库锁。

因此,结果集变量根本不应该是实例变量。您应该使用相同的方法创建和使用它们。

但是,对于3个查询中的每个查询,您可以拥有一个单独的方法,并且每个查询都可以返回它所获取的数据。

答案 1 :(得分:0)

相反尝试这样

public AllMetricsResultSet SPDataList (String alldata) {

    String sSQL1 = "query1";
    String sSQL2 = "query2";
    String sSQL3 = "query3";
    try {
        PreparedStatement stm1 = dbConnection.prepareStatement(sSQL1);
        PreparedStatement stm2 = dbConnection.prepareStatement(sSQL2);
        PreparedStatement stm3 = dbConnection.prepareStatement(sSQL3);

        if (stm1.execute())
            top10Files = stm1.getResultSet();
        if (stm2.execute())
            top10FilesForUsage = stm2.getResultSet();
        if (stm3.execute())
            top10DataSet = stm3.getResultSet();
        while (top10Files.next()) {
            //get the resultset1 data   
        }
        while (top10FilesForUsage.next()) {
            //get the resultset2 data   
        }
        while (top10DataSet.next()) {
            //get the resultset3 data   
        }
 // dont know why as you want to return the classType
 //create an object of the class initialize it the the data you obtained 
 //and return it
    }
    catch(SQLException e)
    {
        e.printStackTrace();
    }
    finally {
        //resultsetobject close
        //statementObject close
        //connection object close
    }
}