gpt4 book ai didi

java - Mysql 插入存储过程比 Java JDBC 慢

转载 作者:行者123 更新时间:2023-11-29 14:21:35 26 4
gpt4 key购买 nike

与从 IDE 或 mysql 命令行调用相比,我发现通过 JDBC 调用时 mysql 插入时间的执行速度要慢几个数量级,我想知道是否有人能给我指出正确的方向。

我在本地运行所有内容,因此网络延迟不应成为问题。

我创建了以下非常人为的示例来说明这一点。

我创建了一个存储过程,它接受单个 INT 并将其插入表中:

DELIMITER $$

CREATE PROCEDURE testInsert(IN input INT)
BEGIN
INSERT INTO test_table(column_1, column_2)
VALUES(input, input);

END$$

DELIMITER ;

如果我从命令行或 mysql IDE 调用此过程(我正在使用 SQLyog):

CALL testInsert(0);

无论出于何种意图和目的,过程调用都会立即发生:

Execution Time : 0.007 sec
Transfer Time : 0.001 sec
Total Time : 0.009 sec

但是,如果我要从 Java 调用该过程,请使用以下代码:

public void testStoredProcedureInsert() throws SQLException{
//custom class for managing the sql and variables on the prepared statement
SQLStatementBinder sqlBinder = new SQLStatementBinder();
sqlBinder.appendSql("CALL testInsert(?)");

//will store the object into a collection in the sql binder
sqlBinder.addBindVariable(0);

Class.forName("com.mysql.jdbc.Driver").newInstance();

Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/dbname", "user", "pass");

CallableStatement stmt = connection.prepareCall(sqlBinder.getSQL());

//bindSql loops through bind variables and sets the appropriate parameters based on the type of the objects - in this case only preparedStatement.setInt(1, 0) is called.
stmt = (CallableStatement)sqlBinder.bindSql(stmt);

long start = System.currentTimeMillis();

stmt.executeQuery();

long end = System.currentTimeMillis();

System.out.println("time to call procedure - " + (end-start) + "ms");
}

更新的运行时间(请注意,我只是对实际执行进行计时,因此没有考虑连接开销等)平均约为70ms

为了进一步说明这一点,如果我在存储过程中连续插入多个插入内容:

DELIMITER $$

CREATE PROCEDURE testInsert(IN input INT)
BEGIN
INSERT INTO test_table(column_1, column_2)
VALUES(input, input);

INSERT INTO test_table(column_1, column_2)
VALUES(input, input);

INSERT INTO test_table(column_1, column_2)
VALUES(input, input);

INSERT INTO test_table(column_1, column_2)
VALUES(input, input);

INSERT INTO test_table(column_1, column_2)
VALUES(input, input);

END$$

DELIMITER ;

从 SQLyog 调用仍然很快:

Execution Time : 0.040 sec
Transfer Time : 0.003 sec
Total Time : 0.044 sec
---------------------------------------------------

调用上面相同的 Java 代码现在每次过程调用平均 225 毫秒

我希望我做错了一些小事,但我愿意接受任何建议或我应该测试的事情。或者从 java 调用时是否有那么多额外的开销?

很抱歉这篇文章有点长,但我试图提供大量的信息。感谢您的帮助!

更新只是一种额外的情况,如果我将五个插入移动到一行中:

 DELIMITER $$

CREATE PROCEDURE testInsert(IN input INT)
BEGIN
INSERT INTO test_table(column_1, column_2)
VALUES(input, input),(input, input),(input, input),(input, input),(input, input);

END$$

DELIMITER ;

Java 运行时平均为 80ms,这表明过程中的每个单独语句在从 Java 调用时似乎都有一些额外的开销。

调用其他没有插入的过程,即使是那些更复杂并返回几个不同结果集的过程,也比一些简单的插入花费的时间要少得多。仅选择的过程返回速度非常快,但是在过程中添加插入,并且运行时比预期慢得多(同样,仅来自 java - 而不是来自 SQLyog)。

最佳答案

尝试使用 JDBC 连接池并检查时间戳 - 它应该更低(尽管与 MySQL 插入不同)。还要检查用于插入 MySQL 的数据类型以及是否可以以某种方式进行优化。

关于java - Mysql 插入存储过程比 Java JDBC 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11661789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com