Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/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 使用Hibernate查找具有一百万条记录的表_Java_Database_Hibernate_Lookup - Fatal编程技术网

Java 使用Hibernate查找具有一百万条记录的表

Java 使用Hibernate查找具有一百万条记录的表,java,database,hibernate,lookup,Java,Database,Hibernate,Lookup,我的数据库表(geo ip lookup)有7列,其中2列构成。 现在,当我使用前2列查找一个值时,获取一条记录需要12-14秒 我的DAO代码如下所示: String queryString = "from Igeo igeo where igeo.ip_from <= " + ip + "and igeo.ip_to >= " + ip; Query q = session.createQuery(queryString); List&l

我的数据库表(geo ip lookup)有7列,其中2列构成。 现在,当我使用前2列查找一个值时,获取一条记录需要12-14秒

我的DAO代码如下所示:

String queryString = "from Igeo igeo where igeo.ip_from <= " + ip
            + "and igeo.ip_to >= " + ip;

    Query q = session.createQuery(queryString);
    List<Igeo> igeoList = q.list();

    if(igeoList.size() > 0){
        Igeo igeo = igeoList.get(0);

        ISP = igeo.getIsp();
        ...
        ...         
    }
String queryString=“from Igeo Igeo where Igeo.ip_from=“+ip;
Query q=session.createQuery(queryString);
List igeoList=q.List();
如果(igeoList.size()>0){
Igeo Igeo=igeoList.get(0);
ISP=igeo.getIsp();
...
...         
}
*Igeo=java表示表中的类

**当ip位于复合id列的值之间时,将获取记录

ip_from=1;ip_to=3;ip=2

因此,将返回上面的行


此表仅用于读取记录,请向我推荐一个比上述更高效的查询字符串

首先删除hibernate并在查询浏览器中运行查询,然后查看返回所需的时间。如果需要相同的时间,它就不会冬眠。这是数据库的性能。确保在ip_from和ip_to两列中添加索引。您还可以对查询执行查询计划,以查看数据库在后台运行什么,并尝试优化查询计划

我建议不要像现在这样对查询使用连接。这就产生了一个安全漏洞,允许来自外部的潜在SQL注入。最好使用以下选项:

Query q = session.createQuery("from Igeo igeo where igeo.from_ip >= ? and igeo.to_ip <= ?");
q.setString( 0, ip );
q.setString( 1, ip );

Query q=session.createQuery("从Igeo Igeo,其中Igeo.from_ip>=?和Igeo.to_ip首先删除hibernate,并在查询浏览器中运行查询,查看返回所需的时间。如果所需时间相同,则不是休眠。这是数据库的性能。请确保将索引添加到两列ip_from和ip_to上。您还可以执行查询p在您的查询上进行lan,以查看数据库在后台运行什么,并尝试优化查询计划

我建议不要像现在这样在查询中使用连接。这会产生一个安全漏洞,允许来自外部的潜在SQL注入。最好使用以下方法:

Query q = session.createQuery("from Igeo igeo where igeo.from_ip >= ? and igeo.to_ip <= ?");
q.setString( 0, ip );
q.setString( 1, ip );

Query q=session.createQuery(“from Igeo Igeo,其中Igeo.from_ip>=”和Igeo.to_ip如果表Igeo不包含ip_from和ip_to的重叠范围,您可以尝试此操作

    String queryString = "FROM Igeo igeo"
        +  " WHERE igeo.ip_to >= " + ip
        +  " ORDER BY igeo.ip_to";

然后检查列表中的第一项(查看ip_from如果表IGeo不包含ip_from和ip_to的重叠范围,您可以尝试以下操作

    String queryString = "FROM Igeo igeo"
        +  " WHERE igeo.ip_to >= " + ip
        +  " ORDER BY igeo.ip_to";

然后检查列表中的第一项(要看到ip_不仅仅是查询层/hibernate层,还需要通过在查找字段等上添加索引来微调数据库,100万条记录比查询更让数据库头疼(看起来您的查询是简单的选择,所以我会更多地关注数据库,除非有一些隐藏的细节)你能分享一些关于如何做到这一点的链接吗?这取决于数据库供应商。例如,这不仅仅是查询层/休眠层,你还需要通过在查找字段等上添加索引来微调数据库,100万条记录比查询更令人头痛(看起来您的查询很简单,所以我会更多地关注数据库,除非有一些隐藏的细节)你能分享一些关于如何做到这一点的链接吗?这取决于数据库供应商。例如,我的前两个列是唯一的和排序的。你能建议我使用一个二进制查询字符串吗hibernate@David您的评论没有多大意义。您是否在询问如何指定不是字符串而是其他数据类型的查询参数?查看后在你的代码中,我不明白你的查询应该返回什么?你是想找到一行还是多行?实际上,我认为你的查询会返回数据库中的每一行,所以可能你的查询是不合逻辑的。你到底想实现什么?我的前两个列是唯一的,并且经过排序的。你能推荐一个二进制查询吗ng,我可以和它一起使用hibernate@David你的评论没有多大意义。你是在问如何指定不是字符串而是其他数据类型的查询参数吗?看了你的代码后,我不明白你的查询应该返回什么?你是在试图找到一行还是多行?实际上,我想你的查询会返回数据库中的每一行,所以可能你的查询都是不合逻辑的。你到底想做什么?你能给我指一个页面,展示如何在hibernate中使用索引,或者如何在hibernate中编写一个二进制saerch查询,如果它存在的话。你的查询从来没有返回任何东西,因为我猜order by子句阻塞了服务器内存达100万rECORDCSCAN您给我指的是一个页面,其中显示了如何在hibernate中使用索引,或者如果存在,如何在hibernate中编写二进制saerch查询。您的查询从未返回任何内容,因为我猜order by子句阻塞了服务器内存,无法存储数百万条记录