如何通过 POSTGRES JDBC 使用多个结果集?

发布于 2024-10-10 22:53:35 字数 1779 浏览 1 评论 0原文

我在 PostgreSQL 数据库上使用 JDBC。 当我查询结果集中的实体时,它返回 5 行。 与该实体相关的是另一个实体,我在使用上述结果集中的行时对其进行查询。 当我执行此查询时,上面的结果集将关闭。

这意味着它一次只允许 1 个结果集在 1 个连接上处于活动状态。

以前,相同的代码对于 Oracle DB 服务器来说可以完美运行。

我是否需要要求数据库管理员将服务器配置为允许多个结果集? 或者对代码进行一些更改? 或者在postgre中不可能做到这一点? 这是更多详细信息的代码:

    Connection conn = PTSConnection.getConnection();

    Statement stmt = conn.createStatement();

    ResultSet lines = stmt.executeQuery("SELECT LINEID,STARTSTOPID,ENDSTOPID FROM LINES"); **//first resultset is active**

    while (lines.next()){
        int lineId= lines.getInt(1);
        Stop ss = StopStorage.getByID(lines.getInt(2));
        Stop es = StopStorage.getByID(lines.getInt(3));
        ResultSet stops = stmt.executeQuery("SELECT STOPID FROM STOPSINLINES WHERE LINEID=" + lineId); **//first resultset dies**

        List<Stop> lineStops = new ArrayList<Stop>();
        while(stops.next()){
            Stop stop = StopStorage.getByID(stops.getInt(1));
            lineStops.add(stop);
        }
        stops.close();

        Line aLine = null;

        ResultSet emergencyLine = stmt.executeQuery("SELECT CAUSE, STARTTIME, ENDTIME FROM EMERGENCYLINES WHERE LINEID =" + lineId);
        if(emergencyLine.next()){
            String cause = emergencyLine.getString(1);
            Time startTime = emergencyLine.getTime(2);
            Time endTime = emergencyLine.getTime(3);

            aLine = new EmergencyLine(ss, es, cause, startTime, endTime, (Stop[]) lineStops.toArray(new Stop[lineStops.size()]));
        } else {
            aLine = new Line(ss, es, (Stop[]) lineStops.toArray(new Stop[lineStops.size()]));
        }

        emergencyLine.close();

        LineRepository.getInstance().addLine(aLine);
    }

    lines.close();

I am using JDBC on a PostgreSQL database.
When I query for an entity in a resultset, it returns 5 rows.
Related to that entity is another entity, for which I query while i am using a row in the above resultset.
When I execute this query, the above resultset is closed.

This means that it is allowing only 1 resultset to be active on 1 connection at a time.

Previously the same code was working perfect for Oracle DB server.

Is it that I need to ask the DB admin to configure the server to allow multiple resultsets?
Or to do some change in the code?
Or is it impossible to do it in postgre?
Here is the code for more details:

    Connection conn = PTSConnection.getConnection();

    Statement stmt = conn.createStatement();

    ResultSet lines = stmt.executeQuery("SELECT LINEID,STARTSTOPID,ENDSTOPID FROM LINES"); **//first resultset is active**

    while (lines.next()){
        int lineId= lines.getInt(1);
        Stop ss = StopStorage.getByID(lines.getInt(2));
        Stop es = StopStorage.getByID(lines.getInt(3));
        ResultSet stops = stmt.executeQuery("SELECT STOPID FROM STOPSINLINES WHERE LINEID=" + lineId); **//first resultset dies**

        List<Stop> lineStops = new ArrayList<Stop>();
        while(stops.next()){
            Stop stop = StopStorage.getByID(stops.getInt(1));
            lineStops.add(stop);
        }
        stops.close();

        Line aLine = null;

        ResultSet emergencyLine = stmt.executeQuery("SELECT CAUSE, STARTTIME, ENDTIME FROM EMERGENCYLINES WHERE LINEID =" + lineId);
        if(emergencyLine.next()){
            String cause = emergencyLine.getString(1);
            Time startTime = emergencyLine.getTime(2);
            Time endTime = emergencyLine.getTime(3);

            aLine = new EmergencyLine(ss, es, cause, startTime, endTime, (Stop[]) lineStops.toArray(new Stop[lineStops.size()]));
        } else {
            aLine = new Line(ss, es, (Stop[]) lineStops.toArray(new Stop[lineStops.size()]));
        }

        emergencyLine.close();

        LineRepository.getInstance().addLine(aLine);
    }

    lines.close();

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

懵少女 2024-10-17 22:53:35

原因不是您在同一连接上使用两个结果集,而是您在新查询中重复使用相同的 Statement 对象。当您在Statement实例上运行executeQuery()时,任何先前的结果都将被关闭(我很惊讶您的代码确实可以与Oracle一起使用...)

只需在执行第二个查询之前创建一个新的Statement对象:

Statement stmt = conn.createStatement();
Statement nestedStmt = conn.createStatement();

ResultSet lines = stmt.executeQuery("SELECT LINEID,STARTSTOPID,ENDSTOPID FROM LINES"); **//first resultset is active**

while (lines.next()){
  ... 
    ResultSet stops = nestedStmt.executeQuery("SELECT STOPID FROM STOPSINLINES WHERE LINEID=" + lineId); **//first resultset dies**
    List lineStops = new ArrayList();
    while(stops.next()){
        Stop stop = StopStorage.getByID(stops.getInt(1));
        lineStops.add(stop);
    }
    stops.close();

    ...
    ResultSet emergencyLine = nestedStmt.executeQuery("SELECT CAUSE, STARTTIME, ENDTIME FROM EMERGENCYLINES WHERE LINEID =" + lineId);
    if(emergencyLine.next()){
        String cause = emergencyLine.getString(1);

    ....
    }
    emergencyLine.close();

并且不要为正确关闭所有语句和结果集!

The reason is not that you are using two resultsets on the same connection, but you are re-using the same Statement object for a new query. When you run executeQuery() on a Statement instance, any previous result will be closed (I'm surprised that your code did work with Oracle...)

Simply create a new Statement object before executing the second query:

Statement stmt = conn.createStatement();
Statement nestedStmt = conn.createStatement();

ResultSet lines = stmt.executeQuery("SELECT LINEID,STARTSTOPID,ENDSTOPID FROM LINES"); **//first resultset is active**

while (lines.next()){
  ... 
    ResultSet stops = nestedStmt.executeQuery("SELECT STOPID FROM STOPSINLINES WHERE LINEID=" + lineId); **//first resultset dies**
    List lineStops = new ArrayList();
    while(stops.next()){
        Stop stop = StopStorage.getByID(stops.getInt(1));
        lineStops.add(stop);
    }
    stops.close();

    ...
    ResultSet emergencyLine = nestedStmt.executeQuery("SELECT CAUSE, STARTTIME, ENDTIME FROM EMERGENCYLINES WHERE LINEID =" + lineId);
    if(emergencyLine.next()){
        String cause = emergencyLine.getString(1);

    ....
    }
    emergencyLine.close();

And don't for get to properly close all Statements and ResultSets !

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文