Nodejs下Mysql如何实现同步?

Nodejs下Mysql如何实现同步?

代码如下 var tSql = “select * from " + this.config.table + " limit 1,2”; var onlock = false; var lock = true; var date = new Date();

var caller = model.caller; while(lock && (new Date().getTime()-date.getTime()<10000)) { if(!onlock) { this.connection.query(tSql,function(err,rows,fields){ console.log(rows); console.log(“finish”); console.log(lock); console.log(onlock); lock = false; caller.propertys = 123; }); onlock = true; } }

需求:希望query完成后结束while 实际情况:在while那里卡住,经过10秒钟后才进入回调函数


5 回复

在Node.js中,默认情况下,所有的I/O操作都是异步的。这意味着当你的应用程序执行一个数据库查询时,它不会阻塞等待结果,而是会继续执行其他任务。因此,试图通过循环(如while循环)来实现同步的行为通常是不可行的,因为这将导致程序挂起,直到回调函数被调用。

不过,可以通过一些库或技术来实现类似同步的行为。一个常见的方法是使用async/await语法,结合Promises或第三方库如mysql2/promise,它可以让你以更接近同步的方式来编写异步代码。

示例代码

首先,你需要安装mysql2库,如果你还没有安装的话:

npm install mysql2

然后,你可以使用mysql2/promise模块来创建一个支持Promise的MySQL连接,并使用async/await来处理异步操作。

const mysql = require('mysql2/promise');

// 创建一个连接池
const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  database: 'testdb',
});

async function runQuery() {
  try {
    // 获取连接
    const connection = await pool.getConnection();
    
    // 执行查询
    const [rows, fields] = await connection.query('SELECT * FROM your_table LIMIT 1, 2');
    
    console.log(rows);
    console.log('查询完成');
    
    // 释放连接
    connection.release();
  } catch (error) {
    console.error('查询失败', error);
  }
}

// 调用函数
runQuery();

解释

  • mysql2/promise:这是一个支持Promise的MySQL客户端,可以让我们更容易地使用async/await
  • pool.getConnection():从连接池中获取一个数据库连接。使用完后需要释放回连接池。
  • connection.query():执行SQL查询。使用await关键字,使查询操作等待结果返回后再继续执行后续代码。
  • try/catch:用于捕获和处理可能发生的错误。

这种方法避免了使用while循环来模拟同步行为,从而保持了Node.js非阻塞、事件驱动的特性。


你这个必然会这样的,node单线程,当前任务没有执行完的时候,callback永远不会执行。

以你这个为例,query的回调不可能在while执行完之前执行

有没有什么办法可以实现我想要的需求?

好的,谢谢了

为了在Node.js中实现MySQL查询的同步执行,可以使用async/await语法配合promises来简化异步操作。然而,Node.js中的数据库操作本质上是异步的,因为它们涉及I/O操作,所以直接同步执行是不可能的。但可以通过一些方法让代码看起来像同步代码一样。

下面提供一个使用mysql2库和async/await的示例代码,展示如何以更同步的方式处理数据库查询:

const mysql = require('mysql2/promise'); // 使用promise版本

// 创建连接池
const pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    database: 'testdb',
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0
});

async function fetchData() {
    try {
        const [rows, fields] = await pool.execute("SELECT * FROM your_table LIMIT 1, 2");
        console.log(rows); // 查询结果
        return rows;
    } catch (error) {
        console.error(error);
    }
}

fetchData();

解释:

  • mysql2/promise:这个库提供了Promise版本的API,使我们能够用async/await语法来处理异步操作。
  • pool.execute:这个方法会返回一个Promise对象,当查询完成时会解析为结果数组(包含行和字段)。
  • async/await:这使得异步代码块看起来像同步代码一样,更容易理解和维护。

这种方法避免了直接阻塞主线程,同时使得代码逻辑更加清晰和易于管理。在实际应用中,应避免长时间阻塞事件循环,以确保应用的响应性和性能。

回到顶部