Sling Academy
Home/Node.js/Sequelize.js: How to Set Query Timeout (Max Execution Time)

Sequelize.js: How to Set Query Timeout (Max Execution Time)

Last updated: December 29, 2023

Introduction

Sequelize is a popular Node.js ORM for Postgres, MySQL, MariaDB, SQLite, and Microsoft SQL Server. It enables robust management of data and elegantly handles complex tasks like associations, transactions, and migrations. However, when working with databases, controlling the execution time of queries is essential for both performance tuning and preventing long-running queries that may lock resources. In this tutorial, we will delve into setting query timeout in Sequelize to ensure your application maintains a performant and responsive data layer.

Setting a Basic Query Timeout

The Sequelize constructor allows you to set default options that apply to every query. You can specify the `query` option, which contains a timeout value measured in milliseconds. Here’s an example:

const Sequelize = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
    dialect: 'postgres',
    pool: {
        max: 5,
        min: 1,
        idle: 10000
    },
    define: {
        timestamps: false
    },
    query: {
        timeout: 1000
    }
});

Here, the timeout is set to 1 second (1000 milliseconds). Any query taking longer than that will throw an error, hinting at potentially inefficient queries or unusual system behavior.

Timeout for Specific Queries

Sometimes, you may want to set different timeouts for certain queries without affecting the global settings. Sequelize query methods accept an options object where you can set individual timeouts. For example:

sequelize.query('SELECT * FROM users WHERE active = true', {
    timeout: 2000
}).then(results => {
    console.log(results);
}).catch(error => {
    console.error('Query timed out:', error);
});

This SQL query will time out if it runs for more than 2 seconds.

Advanced Timeout Options

For enterprise applications, timeouts may need to be conditional or context-dependent. Consider the use of environment variables to easily alter the allowed execution time during different stages of application usage, such as development, testing, and production:

const queryExecutionTimeout = process.env.QUERY_TIMEOUT || 1000;

sequelize.query('SELECT * FROM large_dataset', {
    timeout: queryExecutionTimeout
}).then(results => {
    // Process large dataset
}).catch(error => {
    // Handle timeout
});

Here, the timeout is defined dynamically through an environment variable, providing flexibility across varied environments.

Handling Timeout Errors

Setting timeouts is part of the battle; gracefully handling them is equally important. Sequelize will throw an error if a timeout is exceeded. It’s crucial to have error-handling logic to manage these scenarios:

try {
    const users = await sequelize.query('SELECT * FROM users', {
        timeout: 1500
    });
    console.log(users);
} catch (error) {
    if(error.code === 'ETIMEOUT') {
        console.error('A query timeout has occurred!');
    } else {
        throw error; // Unknown error, rethrow it
    }
}

In this code block, we’re specifically checking for a timeout error code and logging a relevant message if detected.

Summary

Setting query timeouts in Sequelize is a useful capability that protects our systems from overconsumption of resources by long-running activities. Begin with global timeouts for uniformity and pivot to customized timeouts for specific, critical queries. Improved error handling ensures that the system will cope with any timeouts sensibly. Categorize different runtime contexts with dynamic settings, ultimately leading to a more secure and efficient application data layer. This tutorial has illustrated primary methodologies for managing Sequelize query timeout, simplifying an otherwise complex piece of application optimization.

Next Article: Sequelize.js: How to Empty/Truncate a Table

Previous Article: Sequelize.js: How to Alter/Change a Table

Series: Sequelize.js Tutorials

Node.js

You May Also Like

  • NestJS: How to create cursor-based pagination (2 examples)
  • Cursor-Based Pagination in SequelizeJS: Practical Examples
  • MongooseJS: Cursor-Based Pagination Examples
  • Node.js: How to get location from IP address (3 approaches)
  • SequelizeJS: How to reset auto-increment ID after deleting records
  • SequelizeJS: Grouping Results by Multiple Columns
  • NestJS: Using Faker.js to populate database (for testing)
  • NodeJS: Search and download images by keyword from Unsplash API
  • NestJS: Generate N random users using Faker.js
  • Sequelize Upsert: How to insert or update a record in one query
  • NodeJS: Declaring types when using dotenv with TypeScript
  • Using ExpressJS and Multer with TypeScript
  • NodeJS: Link to static assets (JS, CSS) in Pug templates
  • NodeJS: How to use mixins in Pug templates
  • NodeJS: Displaying images and links in Pug templates
  • ExpressJS + Pug: How to use loops to render array data
  • ExpressJS: Using MORGAN to Log HTTP Requests
  • NodeJS: Using express-fileupload to simply upload files
  • ExpressJS: How to render JSON in Pug templates