Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一次从数据库加载x行,显示它们,加载下一个x行,依此类推_Java_Postgresql_Jdbc_Pagination - Fatal编程技术网

Java 一次从数据库加载x行,显示它们,加载下一个x行,依此类推

Java 一次从数据库加载x行,显示它们,加载下一个x行,依此类推,java,postgresql,jdbc,pagination,Java,Postgresql,Jdbc,Pagination,我有一个包含多个表的数据库,每个表都有数百万行数据。在我的Java应用程序中,我的任务是根据从用户那里获得的参数显示某些表中的某些数据。我已经成功地一次加载了所有这些数据,但是当有1000万行时,这需要很长时间。我已经发现了关于connection.setAutoCommit(false)和语句.setFetchSize(x),但这些似乎不起作用 public static int getTableResults(Result_Controller okno){ int i = 0;

我有一个包含多个表的数据库,每个表都有数百万行数据。在我的Java应用程序中,我的任务是根据从用户那里获得的参数显示某些表中的某些数据。我已经成功地一次加载了所有这些数据,但是当有1000万行时,这需要很长时间。我已经发现了关于
connection.setAutoCommit(false)
语句.setFetchSize(x)
,但这些似乎不起作用

public static int getTableResults(Result_Controller okno){
    int i = 0;
    try {
        Connection con = getConnection();
        con.setAutoCommit(false);

        String query = "SELECT h.\"Nazov hotela\", k.\"Nazov krajiny\", m.\"Nazov mesta\", h.\"Adresa hotela\", h.\"Hviezdicky\", p.\"Cena pobytu\", i.\"Typ izby\", h.\"Pocet izieb\" " +
                "FROM hotel h " +
                "inner JOIN izba i ON i.\"ID hotela\" = h.\"ID hotela\" " +
                "inner JOIN krajina k ON k.\"ID krajiny\" = h.\"ID krajiny\" " +
                "inner JOIN mesto m ON m.\"ID mesta\" = h.\"ID mesta\" " +
                "inner JOIN pobyt p ON p.\"ID hotela\" = h.\"ID hotela\" " +
                "WHERE h.\"Nazov hotela\" = ? " +
                "AND k.\"Nazov krajiny\" = ? " +
                "AND h.\"Hviezdicky\" = ? " +
                "AND i.\"Pocet posteli\" >= ? " +
                "AND p.\"Cena pobytu\" <= ? " +
                "ORDER BY h.\"Nazov hotela\"";

        PreparedStatement pst = con.prepareStatement(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        pst.setFetchSize(150);

        pst.setString(1, okno.getText_nazov().getText());
        pst.setString(2, (String) okno.getKrajina().getValue());

        int pocet_hviezdiciek = Integer.parseInt((String) okno.getHviezdicky().getValue());
        pst.setInt(3, pocet_hviezdiciek);

        int pocet_osob = Integer.parseInt((String) okno.getOsoby().getValue());
        pst.setInt(4, pocet_osob);

        double cena_pobytu = Double.parseDouble(okno.getText_cena().getText());
        pst.setDouble(5, cena_pobytu);

        ResultSet rs = pst.executeQuery();
        System.out.println(pst);

        while (rs.next()) {
            okno.getOblist().add(new Vysledok_hladania(rs.getString("Nazov hotela"),
                    rs.getString("Nazov krajiny"),
                    rs.getString("Nazov mesta"),
                    rs.getString("Adresa hotela"),
                    rs.getInt("Hviezdicky"),
                    rs.getDouble("Cena pobytu"),
                    rs.getString("Typ izby"),
                    rs.getInt("Pocet izieb")));

            System.out.println(i++);
        }
        okno.getTable().setItems(okno.getOblist());
    } catch (SQLException ex) {
        Logger.getLogger(Result_Controller.class.getName()).log(Level.SEVERE, null, ex);
    }
return i;
}
public static int getTableResults(结果\u控制器okno){
int i=0;
试一试{
Connection con=getConnection();
con.setAutoCommit(假);
String query=“选择h.\”纳佐夫酒店\“、k.\”纳佐夫克拉伊尼\“、m.\”纳佐夫酒店\“、h.\”阿雷萨酒店\“、h.\”赫维兹迪基\“、p.”塞纳波比图\“、i.”典型伊兹比\“、h.”波切特伊兹布\”+
“从h酒店”+
“内部连接izba i ON i.\“ID hotela\”=h.\“ID hotela”+
“k.\'ID krajiny\'=h.\'ID krajiny\'上的内部联接krajina k”+
“m.\“ID mesta\”=h.\“ID mesta\”上的内部连接mesto m”+
“p.\“ID hotela\”上的内部连接pobyt p=h.\“ID hotela”+
“其中h.\“Nazov hotela\”=?”+
“和k.“纳佐夫·克拉伊尼”=?”+
“和h.\“Hviezdicky\”=?”+
“和i.\“Pocet posteli\”>=?”+

p.“Cena pobytu\”您没有显示执行计划,但问题一定是
排序依据
。PostgreSQL需要完整的结果才能开始排序

如果您创建以下索引,则可以获得带有嵌套循环的“快速启动”计划:

CREATE INDEX ON hotel ("Nazov hotela");
此外,还需要为所有其他表上的连接条件(ID列)建立索引:

CREATE INDEX ON izba ("ID hotela");
CREATE INDEX ON krajina ("ID krajiny");
CREATE INDEX ON mesto ("ID mesta");
CREATE INDEX ON pobyt ("ID hotela");

您没有显示执行计划,但问题一定是排序依据。
PostgreSQL需要完整的结果才能开始排序

如果您创建以下索引,则可以获得带有嵌套循环的“快速启动”计划:

CREATE INDEX ON hotel ("Nazov hotela");
此外,还需要为所有其他表上的连接条件(ID列)建立索引:

CREATE INDEX ON izba ("ID hotela");
CREATE INDEX ON krajina ("ID krajiny");
CREATE INDEX ON mesto ("ID mesta");
CREATE INDEX ON pobyt ("ID hotela");

这看起来应该很好。你能详细描述一下你的问题吗?这个过程包括用户输入数据、酒店名称(纳佐夫酒店)、酒店所在国(纳佐夫克拉伊尼)、酒店拥有的星级数(赫维兹迪基)、住宿人数(波塞特·波斯特利)和住宿费用(塞纳·波比图)。输入此信息后,程序使用上面的代码连接到数据库,使用pst.setString等获取输入,然后返回一个结果集。现在while循环打印出与输入匹配的记录数,并且应该正确打印出来,但在打印出来之前它将以百万计。我无法确定这是d在javafx gui中显示到一个tableview。这看起来应该可以正常工作。您能详细描述您的问题吗?该过程包括用户输入数据、酒店名称(Nazov hotela)、酒店所在国家(Nazov krajiny)、酒店星级数(Hviezdicky)、住宿人数(Pocet posteli)以及住宿费用(塞纳·波比图)。输入此信息后,程序使用上面的代码连接到数据库,使用pst.setString等获取输入,然后返回一个结果集。现在while循环打印出与输入匹配的记录数,并且应该正确打印出来,但在打印出来之前它将以百万计。我无法确定这是d我在javafx gui中显示到一个tableview。我已经删除了
ORDER BY
语句,并用ID连接了这些表。问题是程序等待直到加载了最后一个结果,然后一次显示所有结果。所有连接条件上都有索引吗?是否可以使用
自动解释
来捕获执行pl一个?那会有帮助。我不知道如何使用
auto\u explain
,你说的所有连接条件上的索引是什么意思?我已经添加了其他索引定义。关于,按照链接。你需要将它添加到
shared\u preload\u库
,然后设置
auto\u explain.log\u min\u duration=0
auto\u explain.log\u_在运行查询之前,statements=on
。理想情况下,为测试设置
auto_explain.log_buffers=on
auto_explain.log_analyze=on
。然后你会在日志文件中得到执行计划。啊,对不起,我写信给我的老师,似乎我们将在本学期晚些时候学习索引。我不知道具体的问题是什么这是,但我在postgresql中找到了一个使用限制和偏移量的解决方法。我制作了一个带有分页的tableview,当我单击下一页时,每一页都有15条记录加载。我删除了
ORDER BY
语句,并用ID将这些表连接起来。问题是程序等待加载最后一个结果,然后一次显示所有结果。所有连接条件上都有索引吗?您可以使用
auto\u explain
捕获执行计划吗?这会有帮助。我不知道如何使用
auto\u explain
,您认为所有连接条件上的索引是什么意思?我已经添加了其他索引定义。关于,请跟随链接。在运行查询之前,您需要将其添加到共享的预加载库中,然后为测试设置
auto\u explain.log\u min\u duration=0
auto\u explain.log\u nested\u statements=on
。理想情况下,设置
auto\u explain.log\u buffers=on
auto\u explain.log\u analysis=on
。然后您将获得日志文件中的执行计划。啊,对不起,我写信给我的老师,似乎我们将在本学期晚些时候学习索引。我不知道这有什么具体问题,但我在postgresql中找到了使用限制和偏移量的解决方法。我