# Working with Query Runner - [What is `QueryRunner`](#what-is-queryrunner) - [Creating a new `QueryRunner` instance](#creating-a-new-queryrunner-instance) - [Using `QueryRunner`](#using-queryrunner) ## What is `QueryRunner` Each new `QueryRunner` instance takes a single connection from connection pool, if RDBMS supports connection pooling. For databases not supporting connection pools, it uses the same connection across data source. ## Creating a new `QueryRunner` instance Use `createQueryRunner` method to create a new `QueryRunner`: ```typescript const queryRunner = dataSource.createQueryRunner() ``` ## Using `QueryRunner` After you create a new instance of `QueryRunner` use `connect` method to actually obtain a connection from the connection pool: ```typescript const queryRunner = dataSource.createQueryRunner() await queryRunner.connect() ``` **Important**: make sure to release it when it is not needed anymore to make it available to the connection pool again: ```typescript await queryRunner.release() ``` After connection is released it is not possible to use the query runner methods. `QueryRunner` has bunch of methods you can use, it also has its own `EntityManager` instance, which you can use through `manager` property in order to run `EntityManager` methods on a particular database connection used by `QueryRunner` instance: ```typescript const queryRunner = dataSource.createQueryRunner() // take a connection from the connection pool await queryRunner.connect() // use this particular connection to execute queries const users = await queryRunner.manager.find(User) // don't forget to release connection after you are done using it await queryRunner.release() ```