返回Resultset会降低程序速度

时间:2012-03-28 20:28:45

标签: java jsp jdbc

所以我编写了一个方法来获取数据库表并返回结果集。但是,它似乎挂在这个方法调用上。我认为它只是返回一个指针,但我仍然是编程的新手。这个调用是返回Resultset的指针还是它传递了整个东西。我的主要问题是,为什么这会减慢程序的速度?桌子不是很大。

public ResultSet getEmployeeTable() throws SQLException
{
    ResultSet rsEmpl;
    Connection con = getDBConnection();
    PreparedStatement pstmt;
    String query;

    query = "Select * from PTO_Employee where enabled = ?";
    pstmt = con.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
    pstmt.setInt(1, 1);
    rsEmpl = pstmt.executeQuery();      

    return rsEmpl;
}

2 个答案:

答案 0 :(得分:2)

它连接占用时间最多的数据库。这可以持续100毫秒到1秒的范围。这也是大多数webapps使用所谓的连接池的原因。连接池包含一堆已经打开的连接,然后webapp可以重用它们。您只需要重写JDBC代码以遵守try-finally块中的开启和关闭的JDBC习惯用法,否则您以后仍然会遇到性能问题,因为您永远不会将连接返回到池中游泳池将耗尽它们。

此外,在您返回ResultSet的那一刻,它不包含内存中的任何记录。当您第一次调用next()时,通常只会从数据库中检索并填充Java的内存。但是,在调用SQL查询的上下文之外传递ResultSet是一种非常糟糕的做法。它通常应映射到实体集合。

另见:

答案 1 :(得分:0)

您的方法返回一个引用。但是这个引用指向堆的位置,结果集的内容存储在内存中。

因此,即使您传阅了引用,也可以将整个结果存储在您的记忆中。

您的方法是“挂起”,因为它处理所有必要的操作以从数据库中获取结果。 (创建连接,对数据库进行身份验证,执行语句,获取结果......)