Javascript Nodejs:通过Electron前端进行SQL查询花费的时间太长

Javascript Nodejs:通过Electron前端进行SQL查询花费的时间太长,javascript,mysql,node.js,electron,Javascript,Mysql,Node.js,Electron,通过electron html前端接口从SQL查询中获取响应所需的时间让我遇到了一些问题。该场景涉及一个位于localhost的mysql服务器和一个web应用程序,该应用程序最终向sql server进行查询,所有内容都在同一个设备中。最简单的查询是 SELECT first_name FROM users WHERE id_no=1; 甚至可能需要5秒以上才能解决。然而,正如预期的那样,“在”electron环境之外,即在由nodejs直接执行的.js文件中,相同的指令以毫秒为单位进行解析

通过electron html前端接口从SQL查询中获取响应所需的时间让我遇到了一些问题。该场景涉及一个位于localhost的mysql服务器和一个web应用程序,该应用程序最终向sql server进行查询,所有内容都在同一个设备中。最简单的查询是

SELECT first_name FROM users WHERE id_no=1;
甚至可能需要5秒以上才能解决。然而,正如预期的那样,“在”electron环境之外,即在由nodejs直接执行的.js文件中,相同的指令以毫秒为单位进行解析。我使用了mysql和mysql2节点包。所以我得出结论,我对电子做了一些错误的事情。 我使用以下代码作为sql查询的模块,来自

sql_db.js代码

// Dependencies
var mysql = require('mysql'); // also tried mysql2 with same results

/*
 * @sqlConnection
 * Creates the connection, makes the query and close it to avoid concurrency conflicts.
 */
var sqlConnection = function sqlConnection(sql, values, next) {

    // It means that the values hasnt been passed
    if (arguments.length === 2) {
        next = values;
        values = null;
    }

    var connection = mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: 'root',
        database: 'office'
    });
    connection.connect(function (err) {
        if (err !== null) {
            console.log("[MYSQL] Error connecting to mysql:" + err + '\n');
        }
    });

    connection.query(sql, values, function (err) {

        connection.end(); // close the connection

        if (err) {
            throw err;
        }

        // Execute the callback
        next.apply(this, arguments);
    });
}

module.exports = sqlConnection;
var mysql_query = require('./js/sql_db');

document.querySelector('#button01').addEventListener('click', function(e){
  // some code
  var query_instruction = 'SELECT firstname FROM users WHERE id_no=123 LIMIT 1;';
  mysql_query(query_instruction, { id: '1' }, function (err, rows) {
    if (err) throw err;
    console.log(rows[0].firstname) // this takes incredibly long!!
  });
});
var query_instruction = 'SELECT firstname FROM users WHERE id_no=123 LIMIT 1;';
  mysql_query(query_instruction, { id: '1' }, function (err, rows) {
    if (err) throw err;
    console.log(rows[0].firstname) // this is resolved as fast as expected
  });
此外,SQL查询由前端事件触发,如单击按钮或按enter键,因此HTML文件中的脚本引用位于body标记内的最新一行。例如,在.js文件中,代码如下

page2.js代码(示例)

总而言之,当运行electron并单击“button01”(如page2.js示例中所示)时,结果花费的时间太长,并且不总是相同的时间。但是,如果我运行以下代码

test2.js代码

// Dependencies
var mysql = require('mysql'); // also tried mysql2 with same results

/*
 * @sqlConnection
 * Creates the connection, makes the query and close it to avoid concurrency conflicts.
 */
var sqlConnection = function sqlConnection(sql, values, next) {

    // It means that the values hasnt been passed
    if (arguments.length === 2) {
        next = values;
        values = null;
    }

    var connection = mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: 'root',
        database: 'office'
    });
    connection.connect(function (err) {
        if (err !== null) {
            console.log("[MYSQL] Error connecting to mysql:" + err + '\n');
        }
    });

    connection.query(sql, values, function (err) {

        connection.end(); // close the connection

        if (err) {
            throw err;
        }

        // Execute the callback
        next.apply(this, arguments);
    });
}

module.exports = sqlConnection;
var mysql_query = require('./js/sql_db');

document.querySelector('#button01').addEventListener('click', function(e){
  // some code
  var query_instruction = 'SELECT firstname FROM users WHERE id_no=123 LIMIT 1;';
  mysql_query(query_instruction, { id: '1' }, function (err, rows) {
    if (err) throw err;
    console.log(rows[0].firstname) // this takes incredibly long!!
  });
});
var query_instruction = 'SELECT firstname FROM users WHERE id_no=123 LIMIT 1;';
  mysql_query(query_instruction, { id: '1' }, function (err, rows) {
    if (err) throw err;
    console.log(rows[0].firstname) // this is resolved as fast as expected
  });
运行
>节点test2.js
可以快速显示结果,正如预期的那样

有什么提示吗

我已经设置了
nodeIntegration:true
,包的版本是
“mysql”:“^2.18.1”
“electron”:“^9.0.2”

更新 因此,我一直在尝试不同的替代方案,其中之一就是通过
pythonshell
node包使用pythonsql连接器。在测试它的同时,我还保留了与javascript/sql相关的代码,令人惊讶的是,它开始以预期的速度运行。我目前代码中的示例如下

var mysqlwrapper_query = require('./js/sql_wrapper'); // this is using mysql package
var mysql_pywrapper_query = require('./js/sql_pywrapper'); // this is using python-shell package and runs a python mysql connector script
// some code
// ...
mysql_pywrapper_query (query_msg);
mysqlwrapper_query(query_msg, { id: '1' }, function (err, rows) {
  if (err) throw err;
  console.log(rows); // this now works perfectly, which is confusing
});
在nodejs中通过Python shell运行Python代码

import sys
import mysql.connector

mydb = mysql.connector.connect(
    host="localhost",
    user="root",
    password="root",
    database="office"
)

mycursor = mydb.cursor()

query = sys.argv[1]

mycursor.execute(query)

myresult = mycursor.fetchall()

print(myresult)
我认为这个问题与sql连接处理有关,但我完全搞不清楚,因为理论上每次发送查询时都会启动和关闭sql连接(请参阅sql_db.js代码),所以。。。发送两次相同的查询(通过javascript和python)根本不是解决方案

更新2 如果python代码以
mycursor=mydb.cursor()
结尾,也可以很好地工作。因此,这与我通过nodejs连接数据库的方式有关。有人有线索吗?就我所见,我建立连接和发送查询的方式是正确的。。。每次需要发送查询时,我都需要模块并重用(复制/粘贴)page2.js示例中显示的相关代码。例如,如果我需要在page2.html和page3.html中发送一个查询,那么page2.js和page3.js的代码是相同的。我知道我应该避免重复,但这将在解决此问题后实现