Javascript Nodejs:通过Electron前端进行SQL查询花费的时间太长
通过electron html前端接口从SQL查询中获取响应所需的时间让我遇到了一些问题。该场景涉及一个位于localhost的mysql服务器和一个web应用程序,该应用程序最终向sql server进行查询,所有内容都在同一个设备中。最简单的查询是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文件中,相同的指令以毫秒为单位进行解析
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的代码是相同的。我知道我应该避免重复,但这将在解决此问题后实现