Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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 JDBC连接器在SELECT上速度太慢_Java_Mysql_Jdbc_Mysql Connector - Fatal编程技术网

Java JDBC连接器在SELECT上速度太慢

Java JDBC连接器在SELECT上速度太慢,java,mysql,jdbc,mysql-connector,Java,Mysql,Jdbc,Mysql Connector,这在网上并不少见,但我用MySQL服务器做了一些优化工作来解决这个问题,但没有得到结果。因此,首先我使用maven的包mysql:mysql连接器java:6.0.6。 我尝试运行以下代码: try { mysqlConnection = DriverManager.getConnection(DatabaseUtils.mysqlUrl, DatabaseUtils.mysqlUser, DatabaseUtils.mysqlPassword);

这在网上并不少见,但我用MySQL服务器做了一些优化工作来解决这个问题,但没有得到结果。因此,首先我使用maven的包mysql:mysql连接器java:6.0.6。 我尝试运行以下代码:

try {
            mysqlConnection = DriverManager.getConnection(DatabaseUtils.mysqlUrl, DatabaseUtils.mysqlUser, DatabaseUtils.mysqlPassword);
            PreparedStatement valuesStatement = "SELECT * FROM `test` ORDER BY `id`"
            ResultSet cursor = valuesStatement.executeQuery();
            double value = 0;
            if (cursor.next())
                value = cursor.getDouble("value");
        } catch (SQLException sqlEx) {
            sqlEx.printStackTrace();
        } finally {
            cursor.close();
            pricesStatement.close();
        }
我桌上有很多记录。它大约有一百万张,但是每天增加大约一千张记录。因此,当这个简单的示例执行30秒时,我感到非常惊讶。我在谷歌上搜索了我的问题,发现只有使用pool,调优mysql服务器,尝试解释选择。但我注意到执行时间与行数有关。因此,我查看了驾驶员代码,发现:

TextResultStreamer::读取:

        while(true) {
            if(row == null) {
                rows = new ResultsetRowsStatic(rowList, cdef);
                break;
            }

            if(maxRows == -1 || rowList.size() < maxRows) {
                rowList.add(row);
            }

            row = (ResultsetRow)this.protocol.read(ResultsetRow.class, trf);
        }
这段代码无条件地获取所有剩余的数据,只是为了记录我没有获取多少记录。真奇怪。如果连接了记录器,这将是合理的。但在我的例子中,这段代码在30秒内计算未蚀刻的行,然后。。。不要用它。这个问题我无法解决,因为并没有参数可以告诉代码不要计算行数

现在我不知道下一步该怎么办。查询时间对我来说很慢。例如,用于php的mysql驱动程序在0.0004-0.001秒内执行此查询

所以那些使用mysql connector for Java的人,请告诉我你们有这些问题吗?如果没有,你能举一些例子吗?我应该做些什么来绕过上述问题?也许你用了另一个连接器。那么请告诉我,该怎么办?

您的SQL查询显示

SELECT * FROM test ORDER BY id
通过该查询,您将指示MySQL服务器序列化测试表每行的每一列,并将其发送到Java程序。所以,MySQL服从了。你有一张大桌子。因此,对MySQL的指令需要时间。是的,表中的行越多,所需时间越长。这不是JDBC或驱动程序的问题;这是您使用的SQL的一个问题

从示例代码中可以看出,您希望表中的第一行中有一列名为value的列。您可以使用以下SQL语句来实现这一点:

 SELECT value FROM test ORDER BY id LIMIT 1
如果id列是表的主键,那么这将非常快


SQL的全部要点是允许表包含如此多的行,以至于在短时间内将它们全部提取到Java或其他程序中是不合理的。这就是为什么SQL有WHERE和LIMIT子句

如果我理解正确-您得到了想要的结果,但语句在结束之前继续执行select?您是否尝试过valuesStatement.cancel?我试图在关闭前添加“取消”,但也没有帮助。所有剩余数据都由驱动程序获取。我使用的是jar,所以我无法编辑驱动程序代码。如果您只需要一行,请告诉服务器只发送一行,使用。在我的情况下,我不知道应该设置什么限制。我的目的比这个例子更复杂。我选择所有数据,通过非线性算法生成一些数组,当我得到需要的数组数量时,我就停止提取数据。所以我说不出我需要多少行:一行还是一万行。关于你不知道你需要多少行的评论:请你的问题告诉我们一些关于你决定需要哪一行的逻辑。解决此问题后,您将在SQL中使用WHERE、ORDER BY和LIMIT子句来实现该逻辑。对于此类问题,获取大型表中的所有行通常是不正确的解决方案。正如我所写的,另一个MySQL驱动程序,特别是PHP和来自bash的原生MySQL查询,非常快速地执行这个查询。我有列id的索引,所以MySQL比以往任何时候都更快地给我第一条记录。我坚持认为这不是MySQL的问题,并在问题中描述了我为什么这么认为。排到第一行的时间并不能有效地反映您对稀缺资源(MySQL服务器)的负担。@abr_stackoverflow我完全同意这个答案。如果您需要100行,请将限制设置为100。如果你不知道你需要多少行,把结果翻一页。
 SELECT value FROM test ORDER BY id LIMIT 1