Bus Alt Connection

bus_alt_connection
REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/19.0/bus_alt_connection
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYExtra Tools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Trobz
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Trobz
COMMITTERS
COMMITTERSOCA-git-bot, oca-ci, roger
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:46
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - bus
    - base
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module makes it possible to use
[PgBouncer](https://pgbouncer.github.io/) as a connection pooler for
odoo.

## Why isn't odoo's connection pooling good enough?

Odoo's builtin connection pooling works at process level: each Odoo
process has its own
[ConnectionPool](https://github.com/odoo/odoo/blob/12.0/odoo/sql_db.py#L525),
limited to `db_maxconn`.

It does the job of re-using open connections available in the pool. But
it never closes these connections, [unless reaching
db_maxconn](https://github.com/odoo/odoo/blob/12.0/odoo/sql_db.py#L593).

In practice, we observe that each odoo worker will end up with up to 3
open connection in its pool. With 10 http workers, that's up to 30
connection continuously open just for one single instance.

## Here comes PgBouncer

PgBouncer will help to limit this number of open connections, by sharing
a pool of connections at the instance level, between all workers. Odoo
workers will still have up to 3 open connections, but these will be
connections to PgBouncer, that on its side will close unnecessary
connections to pg.

This has proven to help performances on Odoo deployments with multiple
instances.

It allows you to define how resources should be shared, according to
your priorities, e.g. :

- key odoo instance on host A can open up to 30 connections
- while odoo instance on host B, dedicated to reports, can open up to 10
  connections only

And most importantly, it helps you to ensure that `max_connections` will
never be reached on pg server side.

## Why is this module needed?

When configuring PgBouncer, you can choose between 2 transaction pooling
modes:

- pool_mode = session
- pool_mode = transaction

If we choose pool_mode = session, then one server connection will be
tied to a given odoo process until its death, which is exactly what
we're trying to change. Thus, to release the server connection once the
transaction is complete, we use pool_mode = transaction.

This works fine, except for Odoo's longpolling features that relies on
the
[LISTEN/NOTIFY](https://www.postgresql.org/docs/9.6/static/sql-notify.html)
mechanism from pg, which is [not
compatible](https://wiki.postgresql.org/wiki/PgBouncer) with that mode.

To be more precise, NOTIFY statements are properly transfered by
PgBouncer in that mode; only the LISTEN statement isn't (because it
needs to keep the server connection open).

So for the unique "listening" connection per instance that requires this
statement
([here](https://github.com/odoo/odoo/blob/12.0/addons/bus/models/bus.py#L166)),
we need odoo to connect directly to the pg server, bypassing PgBouncer.

That's what this module implements, by overriding the relevant method of
the
[Dispatcher](https://github.com/odoo/odoo/blob/12.0/addons/bus/models/bus.py#L105).

Code Analysis

Views touched (0)

No views found for this module.

Models touched (0)

No models found for this module.

REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/18.0/bus_alt_connection
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYExtra Tools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Trobz
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Trobz
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, arantxa-s73
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:08
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - bus
    - base
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module makes it possible to use
[PgBouncer](https://pgbouncer.github.io/) as a connection pooler for
odoo.

## Why isn't odoo's connection pooling good enough?

Odoo's builtin connection pooling works at process level: each Odoo
process has its own
[ConnectionPool](https://github.com/odoo/odoo/blob/12.0/odoo/sql_db.py#L525),
limited to `db_maxconn`.

It does the job of re-using open connections available in the pool. But
it never closes these connections, [unless reaching
db_maxconn](https://github.com/odoo/odoo/blob/12.0/odoo/sql_db.py#L593).

In practice, we observe that each odoo worker will end up with up to 3
open connection in its pool. With 10 http workers, that's up to 30
connection continuously open just for one single instance.

## Here comes PgBouncer

PgBouncer will help to limit this number of open connections, by sharing
a pool of connections at the instance level, between all workers. Odoo
workers will still have up to 3 open connections, but these will be
connections to PgBouncer, that on its side will close unnecessary
connections to pg.

This has proven to help performances on Odoo deployments with multiple
instances.

It allows you to define how resources should be shared, according to
your priorities, e.g. :

- key odoo instance on host A can open up to 30 connections
- while odoo instance on host B, dedicated to reports, can open up to 10
  connections only

And most importantly, it helps you to ensure that `max_connections` will
never be reached on pg server side.

## Why is this module needed?

When configuring PgBouncer, you can choose between 2 transaction pooling
modes:

- pool_mode = session
- pool_mode = transaction

If we choose pool_mode = session, then one server connection will be
tied to a given odoo process until its death, which is exactly what
we're trying to change. Thus, to release the server connection once the
transaction is complete, we use pool_mode = transaction.

This works fine, except for Odoo's longpolling features that relies on
the
[LISTEN/NOTIFY](https://www.postgresql.org/docs/9.6/static/sql-notify.html)
mechanism from pg, which is [not
compatible](https://wiki.postgresql.org/wiki/PgBouncer) with that mode.

To be more precise, NOTIFY statements are properly transfered by
PgBouncer in that mode; only the LISTEN statement isn't (because it
needs to keep the server connection open).

So for the unique "listening" connection per instance that requires this
statement
([here](https://github.com/odoo/odoo/blob/12.0/addons/bus/models/bus.py#L166)),
we need odoo to connect directly to the pg server, bypassing PgBouncer.

That's what this module implements, by overriding the relevant method of
the
[Dispatcher](https://github.com/odoo/odoo/blob/12.0/addons/bus/models/bus.py#L105).

Code Analysis

Views touched (0)

No views found for this module.

Models touched (0)

No models found for this module.

REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/17.0/bus_alt_connection
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYExtra Tools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Trobz
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Trobz
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Reyes4711-S73
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:01
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - bus
    - base
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module makes it possible to use
[PgBouncer](https://pgbouncer.github.io/) as a connection pooler for
odoo.

## Why isn't odoo's connection pooling good enough?

Odoo's builtin connection pooling works at process level: each Odoo
process has its own
[ConnectionPool](https://github.com/odoo/odoo/blob/12.0/odoo/sql_db.py#L525),
limited to `db_maxconn`.

It does the job of re-using open connections available in the pool. But
it never closes these connections, [unless reaching
db_maxconn](https://github.com/odoo/odoo/blob/12.0/odoo/sql_db.py#L593).

In practice, we observe that each odoo worker will end up with up to 3
open connection in its pool. With 10 http workers, that's up to 30
connection continuously open just for one single instance.

## Here comes PgBouncer

PgBouncer will help to limit this number of open connections, by sharing
a pool of connections at the instance level, between all workers. Odoo
workers will still have up to 3 open connections, but these will be
connections to PgBouncer, that on its side will close unnecessary
connections to pg.

This has proven to help performances on Odoo deployments with multiple
instances.

It allows you to define how resources should be shared, according to
your priorities, e.g. :

- key odoo instance on host A can open up to 30 connections
- while odoo instance on host B, dedicated to reports, can open up to 10
  connections only

And most importantly, it helps you to ensure that `max_connections` will
never be reached on pg server side.

## Why is this module needed?

When configuring PgBouncer, you can choose between 2 transaction pooling
modes:

- pool_mode = session
- pool_mode = transaction

If we choose pool_mode = session, then one server connection will be
tied to a given odoo process until its death, which is exactly what
we're trying to change. Thus, to release the server connection once the
transaction is complete, we use pool_mode = transaction.

This works fine, except for Odoo's longpolling features that relies on
the
[LISTEN/NOTIFY](https://www.postgresql.org/docs/9.6/static/sql-notify.html)
mechanism from pg, which is [not
compatible](https://wiki.postgresql.org/wiki/PgBouncer) with that mode.

To be more precise, NOTIFY statements are properly transfered by
PgBouncer in that mode; only the LISTEN statement isn't (because it
needs to keep the server connection open).

So for the unique "listening" connection per instance that requires this
statement
([here](https://github.com/odoo/odoo/blob/12.0/addons/bus/models/bus.py#L166)),
we need odoo to connect directly to the pg server, bypassing PgBouncer.

That's what this module implements, by overriding the relevant method of
the
[Dispatcher](https://github.com/odoo/odoo/blob/12.0/addons/bus/models/bus.py#L105).

Code Analysis

Views touched (0)

No views found for this module.

Models touched (0)

No models found for this module.

REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/16.0/bus_alt_connection
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYExtra Tools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Trobz
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Trobz
COMMITTERS
COMMITTERSWeblate, oca-ci, Ioan Galan (Studio73)
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:53
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - bus
    - base
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (0)

No views found for this module.

Models touched (0)

No models found for this module.

REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/14.0/bus_alt_connection
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYExtra Tools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Trobz
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Trobz
COMMITTERS
COMMITTERSNils Hamerlinck, oca-travis, Weblate, OCA-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:06
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - bus
    - base
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (0)

No views found for this module.

Models touched (0)

No models found for this module.

REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/13.0/bus_alt_connection
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYExtra Tools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Trobz
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Trobz
COMMITTERS
COMMITTERSStefan Rijnhart, Nils Hamerlinck, oca-travis, OCA-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:17
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - bus
    - base
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (0)

No views found for this module.

Models touched (0)

No models found for this module.

REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/12.0/bus_alt_connection
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYExtra Tools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Trobz
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Trobz
COMMITTERS
COMMITTERSNils Hamerlinck, oca-travis, OCA-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:22
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - bus
    - base
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (0)

No views found for this module.

Models touched (0)

No models found for this module.

STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/server-tools
PULL REQUEST
PULL REQUEST[MIG] bus_alt_connection: Migration to 15.0 (#2856)