A typical database operation consists of several steps.
The driver uses a configuration to start a connection to the database server.
A network socket is opened on the client that connects to the database server.
Data is read or written through the network socket.
The connection is closed down.
The network socket is closed down and its resources are freed.
For simple database operations, these steps are not expensive, but as an application scales up, the performance of the application will suffer as each connection is created and destroyed. One pattern for improving performance is a connection pool, a group of already configured and established network connections between the client and database that can be reused for data operations within an application.Each time an application reads or writes data, it will request one of the connections in the pool. After the data operation completes, the connection is returned to the pool so other operations can use it.Connection pooling can be a enabled as a feature of the driver, a separate library used in conjunction with a driver, a feature of an application server, or a proxy server that acts as a gateway to the database server.Sizing a connection pool is critical to maximizing application performance. Too few connections and the application will be blocked, waiting for the connection pool to establish a new connection, or for an existing connection to become available. Conversely, a connection pool with too many connections actively executing a query at the same time can also result in high latency as the cluster cycles through every connection concurrently, decreasing efficiency as the cluster incurs a cost every time it context-switches through every query. For example, the time it takes for many threads to complete many queries in parallel is typically higher than that for a smaller number of threads scaled to the number of available vCPUs or IOPs.To read more about connection pooling, see our What is Connection Pooling, and Why Should You
Care blog post.
These are Cockroach Labs recommendations for settings common to most connection pooling software. If your application has multiple workers, each worker should be configured based on the kinds of queries required for its workload.
The maximum lifetime of a connection should be set to between 5 and 30 minutes. CockroachDB Cloud clusters support 30 minutes as the maximum connection lifetime. When a node is shut down or restarted, client connections can be reset after 30 minutes, causing a disruption to applications.Cockroach Labs recommends starting with a 5 minute maximum connection lifetime and increasing the connection lifetime if there is an impact on tail latency, normally seen when there are large numbers of connections to a cluster. Setting the connection lifetime below 5 minutes is possible, but there is little benefit, and comes at a cost of increased CPU usage for clients and servers. The maximum connection lifetime changes the rate of new connections per second (i.e., average new connections per second = total connections / maximum connection age).Configure your connection pooling with connection jitter to prevent connection storms.
The maximum number of open connections should be set to a value that is greater than the maximum number of concurrent queries that your application worker expects to make. Doing so minimizes the need to establish new connections.
If possible configure your connection pool to avoid periodic spikes in new connections, also known as “thundering herds” or “connection storms.” Most connection pools offer the ability to stagger their connection age through the use of a connection lifetime “jitter,” where the wait time between new connections is randomized. Using a connection jitter of 10% of the maximum connection lifetime smooths out the rate of new connections to a cluster. For example, for a maximum connection lifetime of 1800 seconds (30 minutes), set the connection jitter to 500 seconds (3 minutes).
After a connection pool initializes connections to CockroachDB clusters, those connections can occasionally break. This could be due to changes in the cluster topology, or rolling upgrades and restarts, or network disruptions.Validating connections is typically handled automatically by the connection pool. For example, in HikariCP the connection is validated whenever you request a connection from the pool, and the keepaliveTime property allows you to configure an interval to periodically check if the connections in the pool are valid. Whatever connection pool you use, make sure connection validation is enabled when running your application.
If your connection pool is properly configured, the total number of open connections to your cluster will typically be at least 100 times larger than the number of new connections per second to your cluster.Idle connections in CockroachDB do not consume many resources compared to PostgreSQL. Unlike PostgreSQL, which has a hard limit of 5000 connections, CockroachDB can safely support tens of thousands of connections.The SQL Connection graph shows how many new connections are being created each second. The Open SQL Sessions graph shows the total number of SQL client connections across the cluster. To determine if your connection pool is correctly configured use the metrics from these graphs in the following formula:SQL Connection Attempts < SQL Open Sessions/100That is, divide the number of open SQL sessions by 100. This result should be less than the number of new SQL connections per second.Configure the minimum number of connections to equal to the maximum number of connections, creating a fixed pool size.Configure the maximum connection lifetime to 30 minutes.Multi-region Basic and Standard clusters have the same recommendations as single-region clusters.Cockroach Labs strongly recommends that your application instance run in the same region as your CockroachDB cluster.
If your connection pool is properly configured, the total number of open connections to your cluster will typically be at least 100 times larger than the number of new connections per second to your cluster.Idle connections in CockroachDB do not consume many resources compared to PostgreSQL. Unlike PostgreSQL, which has a hard limit of 5000 connections, CockroachDB can safely support tens of thousands of connections.Use the following formula as a starting point to size the connection pool:active connections = (number of cores * 4)If you have a large number of services connecting to the same cluster, make sure the number of concurrent active connections across all the services does not exceed this recommendation. If each service has its own connection pool, ensure the total number of concurrent active connections across all services stays within this limit.For multi-region clusters, create a connection pool per region, and apply the same active connection limits for each region in your cluster. For example, if you have 3 regions in your cluster, and each region has 12 vCPUs, the concurrent active connection limit per region is 48 (12 [processor cores] * 4).
Connection pool sizes can be much larger than the active connections limit, since most connections will be idle and have almost no overhead.
To control the maximum number of non-superuser (root user or other admin role) connections a gateway node can have open at one time, use the server.max_connections_per_gatewaycluster setting. If a new non-superuser connection would exceed this limit, the error message "sorry, too many clients already" is returned, along with error code 53300.Cockroach Labs strongly recommends that your application instance run in the same region as your CockroachDB cluster.
If your connection pool is properly configured, the total number of open connections to your cluster will typically be at least 100 times larger than the number of new connections per second to your cluster.Idle connections in CockroachDB do not consume many resources compared to PostgreSQL. Unlike PostgreSQL, which has a hard limit of 5000 connections, CockroachDB can safely support tens of thousands of connections.Use the following formula as a starting point to size the connection pool:active connections = (number of cores * 4)If you have a large number of services connecting to the same cluster, make sure the number of concurrent active connections across all the services does not exceed this recommendation. If each service has its own connection pool, ensure the total number of concurrent active connections across all services stays within this limit.For multi-region clusters, create a connection pool per region, and apply the same active connection limits for each region in your cluster. For example, if you have 3 regions in your cluster, and each region has 12 vCPUs, the concurrent active connection limit per region is 48 (12 [processor cores] * 4).
Connection pool sizes can be much larger than the active connections limit, since most connections will be idle and have almost no overhead.
To control the maximum number of non-superuser (root user or other admin role) connections a gateway node can have open at one time, use the server.max_connections_per_gatewaycluster setting. If a new non-superuser connection would exceed this limit, the error message "sorry, too many clients already" is returned, along with error code 53300.Cockroach Labs strongly recommends that your application instance run in the same region as your CockroachDB cluster.
The SQL Connections graph shows the number of new SQL connections per second.A misconfigured connection pool will result in most database operations requiring a new connection to be established, which will increase query latency.
The Open SQL Sessions graph shows the number of open connections on your cluster.If your connection pool is properly configured, the total number of open connections to your cluster should be at least 100 times larger than the number of new connections per second to your cluster.
To validate that your connection pool is correctly configured, monitor the SQL connection metrics and graphs on your cluster.
The sql.new_conns metric and SQL Connection Rate graph expose the number of new SQL connections per second.A misconfigured connection pool will result in most database operations requiring a new connection to be established, which will increase query latency.
The sql.conns metric and Open SQL Sessions graph show the number of open connections on your cluster or node.The sql.statements.active metric and Active SQL Statements graph show the number of active connections on your cluster or node. A connection is “active” when it is actively executing a query.Using the following formula:active connections = (number of cores * 4)If the number of concurrent active connections exceeds 4 times the number of cores in your cluster, your application is likely not achieving maximum throughput. You should reduce the concurrent workload across your applications, or scale the cluster by adding more nodes or cores per node. Reducing the number of active connections may increase overall throughput, possibly at the expense of increased tail latency for your queries.If your connection pool is properly configured, the total number of open connections to your cluster should be at least 100 times larger than the number of new connections per second to your cluster.
To validate that your connection pool is correctly configured, monitor the SQL connection metrics and graphs on your cluster.
The sql.new_conns metric and SQL Connection Rate graph expose the number of new SQL connections per second.A misconfigured connection pool will result in most database operations requiring a new connection to be established, which will increase query latency.
The sql.conns metric and Open SQL Sessions graph show the number of open connections on your cluster or node.The sql.statements.active metric and Active SQL Statements graph show the number of active connections on your cluster or node. A connection is “active” when it is actively executing a query.Using the following formula:active connections = (number of cores * 4)If the number of concurrent active connections exceeds 4 times the number of cores in your cluster, your application is likely not achieving maximum throughput. You should reduce the concurrent workload across your applications, or scale the cluster by adding more nodes or cores per node. Reducing the number of active connections may increase overall throughput, possibly at the expense of increased tail latency for your queries.If your connection pool is properly configured, the total number of open connections to your cluster should be at least 100 times larger than the number of new connections per second to your cluster.
“Serverless” refers to stateless, programmatic functions deployed in a cloud environment that provides an execution
framework to provision resources dynamically, such as Amazon Lambda functions.
If your application uses serverless functions to connect to CockroachDB, use a connection pool if you plan to invoke functions frequently. To ensure that the connection pool is reused across invocations of the same function instance, initialize the connection pool variable outside the scope of the serverless function definition. Set the maximum connection pool size to 1, unless your function is multi-threaded and establishes multiple concurrent requests to your database within a single function instance.
In this example, a Java application similar to the basic JDBC example uses the PostgreSQL JDBC driver and HikariCP as the connection pool layer to connect to a CockroachDB cluster. The database is being run on 10 cores across the cluster.Using the connection pool formula above:connections = (10 [processor cores] * 4)The connection pool size should be 40.The maximum lifetime of a connection is set to 300000 milliseconds, or 5 minutes.
HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:postgresql://localhost:26257/bank");config.setUsername("maxroach");config.setPassword("password");config.addDataSourceProperty("ssl", "true");config.addDataSourceProperty("sslmode", "require");config.addDataSourceProperty("reWriteBatchedInserts", "true");config.setAutoCommit(false);config.setMaximumPoolSize(40);config.setMaxLifetime(300000);config.setKeepaliveTime(150000);HikariDataSource ds = new HikariDataSource(config);Connection conn = ds.getConnection();
In this example, a Go application similar to the basic pgx example uses the pgxpool library to create a connection pool on a CockroachDB cluster. The database is being run on 10 cores across the cluster.Using the connection pool formula above:connections = (10 [processor cores] * 4)The connection pool size should be 40, and is set using the pool_max_conns query parameter.The pool_max_conn_lifetime query parameter sets the maximum age of a connection to 300 seconds, or 5 minutes.The pool_max_conn_lifetime_jitter query parameter sets the connection jitter to 30 seconds, or 10% of the maximum connection age.
// Set connection pool configuration, with maximum connection pool size.config, err := pgxpool.ParseConfig("postgres://max:roach@127.0.0.1:26257/bank?sslmode=require&pool_max_conns=40&pool_max_conn_lifetime=300s&pool_max_conn_lifetime_jitter=30s") if err != nil { log.Fatal("error configuring the database: ", err) }// Create a connection pool to the "bank" database.dbpool, err := pgxpool.ConnectConfig(context.Background(), config)if err != nil { log.Fatal("error connecting to the database: ", err)}defer dbpool.Close()
For a full list of connection pool configuration parameters for pgxpool, see the pgxpool documentation.
When a node has both a high number of client connections and running queries, the node may crash due to memory exhaustion. This is due to CockroachDB not accurately limiting the number of clients and queries based on the amount of available RAM on the node. To prevent memory exhaustion, monitor each node’s memory usage and ensure there is some margin between maximum CockroachDB memory usage and available system RAM. For more details about memory usage in CockroachDB, see this blog post.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"CockroachDB","colors":{"primary":"#9059FF","light":"#9059FF","dark":"#9059FF"},"logo":{"light":"https://mintcdn.com/cockroachlabs/4WvUnbVuGZfqM4kW/images/CockroachLabs_Wordmark_Black.png?fit=max\u0026auto=format\u0026n=4WvUnbVuGZfqM4kW\u0026q=85\u0026s=54ccae625c9986bf1df8ddc7b2c571f0","dark":"https://mintcdn.com/cockroachlabs/4WvUnbVuGZfqM4kW/images/CockroachLabs_Wordmark_White.png?fit=max\u0026auto=format\u0026n=4WvUnbVuGZfqM4kW\u0026q=85\u0026s=0dd9b66973a1c7d3dd72aa67b6094efe","href":"https://www.cockroachlabs.com/"},"favicon":{"light":"https://mintcdn.com/cockroachlabs/2yihO7vMXnL0G_07/images/favicon.svg?fit=max\u0026auto=format\u0026n=2yihO7vMXnL0G_07\u0026q=85\u0026s=01f9aa59c9f275e1f35cd424a27d2551","dark":"https://mintcdn.com/cockroachlabs/2yihO7vMXnL0G_07/images/favicon.svg?fit=max\u0026auto=format\u0026n=2yihO7vMXnL0G_07\u0026q=85\u0026s=01f9aa59c9f275e1f35cd424a27d2551"},"api":{"examples":{"defaults":"required","languages":["curl"]}},"appearance":{"default":"light"},"navbar":{"primary":{"type":"button","label":"Get started free","href":"https://cockroachlabs.cloud/signup?referralId=cc_nav_global\u0026_ga=2.242886210.1147139380.1759903632-41552699.1759903632"}},"footer":{"socials":{"youtube":"https://www.youtube.com/@cockroachdb","x":"https://x.com/CockroachDB","linkedin":"https://www.linkedin.com/company/cockroach-labs/mycompany/verification","instagram":"https://www.instagram.com/cockroachdb"},"links":[{"header":"Product","items":[{"label":"CockroachDB","href":"https://www.cockroachlabs.com/product"},{"label":"CockroachDB Cloud","href":"https://www.cockroachlabs.com/product/cockroachcloud"},{"label":"Compare","href":"https://www.cockroachlabs.com/compare"},{"label":"Pricing","href":"https://www.cockroachlabs.com/pricing"},{"label":"Get CockroachDB","href":"https://www.cockroachlabs.com/get-started-cockroachdb"},{"label":"Sign In","href":"https://cockroachlabs.cloud/"}]},{"header":"Resources","items":[{"label":"Guides","href":"https://resources.cockroachlabs.com/guides"},{"label":"Webinars","href":"https://www.cockroachlabs.com/community/webinars"},{"label":"Videos","href":"https://www.cockroachlabs.com/resources/video"},{"label":"Architecture Overview","href":"https://www.cockroachlabs.com/docs/stable/architecture/overview"},{"label":"FAQ","href":"https://www.cockroachlabs.com/docs/stable/frequently-asked-questions"},{"label":"Security","href":"https://www.cockroachlabs.com/security"}]},{"header":"Learn \u0026 Support","items":[{"label":"Docs","href":"https://www.cockroachlabs.com/docs"},{"label":"University","href":"https://learn.cockroachlabs.com/"},{"label":"Developers","href":"https://www.cockroachlabs.com/developers"},{"label":"Forum","href":"https://forum.cockroachlabs.com/"},{"label":"Slack","href":"https://cockroa.ch/slack"},{"label":"Support Portal","href":"https://support.cockroachlabs.com/hc/en-us"},{"label":"Contact Us","href":"https://www.cockroachlabs.com/contact"}]},{"header":"Company","items":[{"label":"About","href":"https://www.cockroachlabs.com/about"},{"label":"Blog","href":"https://www.cockroachlabs.com/blog"},{"label":"Careers","href":"https://www.cockroachlabs.com/careers"},{"label":"Customers","href":"https://www.cockroachlabs.com/customers"},{"label":"News","href":"https://www.cockroachlabs.com/press"},{"label":"Privacy","href":"https://www.cockroachlabs.com/privacy"},{"label":"Terms of Use","href":"https://www.cockroachlabs.com/website-terms-of-use"}]}]},"fonts":{"heading":{"family":"Poppins"},"body":{"family":"Open Sans"}},"styling":{"eyebrows":"breadcrumbs","codeblocks":{"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}},"latex":true},"integrations":{"gtm":{"tagId":"GTM-NR8LC4"}},"errors":{"404":{"redirect":false,"title":"Page not found","description":"The page you're looking for doesn't exist. [Return to docs home](/index.html)."}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"interaction":{"drilldown":false},"navigation":{"global":{"anchors":[{"anchor":"University","icon":"graduation-cap","href":"https://learn.cockroachlabs.com/"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"cockroachlabs","hasAudioNarration":false,"actualSubdomain":"cockroachlabs","customDomains":["docs.cockroachlabs.com"],"gitSource":{"type":"github","owner":"cockroachlabs","repo":"docs","deployBranch":"main","contentDirectory":"cockroachlabs-preview-main","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af4bb21d7a808c67a4ac795","clientVersion":"0.0.4111","searchFilterCounts":[{"language":"default","tag":"CockroachDB","count":6951},{"language":"default","tag":"Docs","count":3217},{"language":"default","tag":"SQL","count":2566},{"language":"default","tag":"Statements","count":1714},{"language":"default","tag":"Self-Hosted Deployments","count":1457},{"language":"default","tag":"Reference","count":774},{"language":"default","tag":"Cloud Deployments","count":616},{"language":"default","tag":"Endpoints","count":528},{"language":"default","tag":"Cloud API Reference","count":518},{"language":"default","tag":"Get Started","count":441}],"searchSettings":{"isFiltersEnabled":true,"showContentSnippets":true,"fullPageSearch":true}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":true,"toggles":[],"googleFontsInlined":true},"customCss":[{"filePath":"styles.css","content":":root{--inline-code-bg-light: rgb(var(--gray-200) / 0.92);--inline-code-bg-dark: rgb(255 255 255 / 0.08)}.prose :not(pre)>code{background-color:var(--inline-code-bg-light)!important}.dark .prose :not(pre)>code{background-color:var(--inline-code-bg-dark)!important}@media (min-width: 1536px){#navbar>.max-w-8xl,[class*=\"peer-[.is-not-custom]:peer-[.is-not-center]:max-w-8xl\"]{width:100%!important;max-width:none!important}}#navigation-items{display:flex;flex-direction:column}#navigation-items>ul:not(.sidebar-group){order:1;margin-top:1.5rem}.crdb-metrics-table table{table-layout:fixed!important;width:100%!important;min-width:0!important;max-width:100%!important;border-collapse:collapse}.crdb-metrics-table table td,.crdb-metrics-table table th{min-width:0!important;overflow-wrap:anywhere;word-break:break-word}.crdb-fixed-table table{table-layout:fixed!important;width:100%!important;min-width:0!important;max-width:100%!important;border-collapse:collapse}.crdb-fixed-table table td,.crdb-fixed-table table th{min-width:0!important;overflow-wrap:anywhere;word-break:break-word}.bg-cover{background-size:cover;background-repeat:no-repeat;background-position:center center}.bg-cover__bg-3-1{background-image:url(\"https://cockroach-labs-docs.imgix.net/bg-3-1.png?auto=format,compress\u0026w=1200\u0026q=40\")}.home-header{border-radius:0.5rem;margin-bottom:2rem!important;padding:2rem}.card{border:1px solid #e5e7eb;border-radius:0.75rem;background-color:white}.dark .card{background-color:#0d1117;border-color:rgba(255, 255, 255, 0.1)}.card-link{text-decoration:none!important;overflow:hidden}.card-link:hover{outline:1px solid rgba(105, 51, 255, 0.55);outline-offset:-1px}.card-link,.card-link:hover{transform:none!important;box-shadow:none!important}.card-link a,.card-link a:hover,.card-link h3,.card-link h3:hover,.card-link p,.card-link p:hover{border:0!important;text-decoration:none!important;transform:none!important}.card-link a{display:block;width:100%}.card-link h3{font-size:1rem!important;font-weight:600!important}.card-body{padding:1.5rem}.landing-column-title{margin-bottom:1rem}.overline{text-transform:uppercase;letter-spacing:0.05em}.btn-redirect{display:inline-flex;align-items:center;gap:0.5rem;padding:0.75rem 1.5rem;border:2px solid #e5e7eb;border-radius:0.5rem;text-decoration:none;transition:border-color 0.2s}.btn-redirect:hover{border-color:#6933ff}.btn-block{display:flex;width:100%;justify-content:center}.dark .btn-redirect{border-color:rgba(255, 255, 255, 0.1)}.article-section-title{font-size:1.25rem!important}.article-lists h3{font-size:0.875rem!important;font-weight:600!important;text-transform:uppercase;letter-spacing:0.05em;color:#6b7280!important}.dark .article-lists h3{color:#9ca3af!important}.article-lists ul{font-size:0.875rem}.shadow{box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.bg-dark-wing{background-color:#152849;border-radius:0.5rem}.text-ice-temple{color:#1bf8ec!important;display:inline-flex;align-items:center;gap:0.375rem}.text-ice-temple img{display:inline-block;margin:0}.bg-dark-wing h2{font-size:clamp(1.25rem, 1rem + 1.5vw, 1.75rem)!important}@media (max-width: 576px){.card-body.bg-dark-wing{padding:1.25rem!important}}.text-decoration-none{text-decoration:none!important}.text-muted{color:#6b7280!important}.card-link .card-desc{font-size:0.9375rem!important;font-weight:400!important;line-height:1.5!important;text-align:left!important;color:#4b5563!important;width:100%;margin-top:0.5rem}.dark .card-link .card-desc{color:#9ca3af!important}.report-tag{display:inline-block;padding:0.25rem 0.75rem;border-radius:0.25rem;background-color:rgba(84, 42, 189, 0.08);color:#542abd}.dark .report-tag{background-color:rgba(84, 42, 189, 0.3);color:#b39dff}.resilience-report-img{background-image:url(\"/images/state-resilience.png\");background-size:cover;background-position:center;min-height:150px;border-radius:0.5rem}.row{display:flex!important;flex-wrap:wrap;margin-left:-0.75rem;margin-right:-0.75rem}.display-flex{display:flex!important}.col-lg-4{flex:0 0 auto;width:100%;padding-left:0.75rem;padding-right:0.75rem}@media (min-width: 992px){.col-lg-4{width:33.333333%!important}}.col-lg-3,.col-sm-6,.col-xs-12{flex:0 0 auto;width:100%!important;padding-left:0.75rem;padding-right:0.75rem}@media (min-width: 992px){.col-lg-3{width:25%!important}}@media (min-width: 576px){.col-sm-6{width:50%!important}}.col-12{width:100%!important}.col-lg-12{width:100%;padding-left:0.75rem;padding-right:0.75rem}@media (min-width: 992px){.col-lg-12{width:100%!important}}.col-md-4,.col-md-8{flex:0 0 auto;width:100%;padding-left:0.75rem;padding-right:0.75rem}@media (min-width: 768px){.col-md-4{width:33.333333%!important}.col-md-8{width:66.666667%!important}}.h-100{height:100%}.d-flex{display:flex}.flex-column{flex-direction:column}.mb-3{margin-bottom:1rem!important}.mb-5{margin-bottom:3rem!important}.pb-5{padding-bottom:3rem!important}.mb-xl-5{margin-bottom:3rem!important}.mt-auto{margin-top:auto!important}.mt-0{margin-top:0!important}.mt-2{margin-top:0.5rem!important}.mt-3{margin-top:1rem!important}.mt-5:not(.code-block){margin-top:3rem!important}.code-block.mb-8{margin-bottom:calc(var(--spacing) * 5)}.pt-5{padding-top:3rem!important}.m-0{margin:0!important}.ml-2{margin-left:0.5rem!important}.mb-0{margin-bottom:0!important}.mb-2{margin-bottom:0.5rem!important}.mb-4{margin-bottom:1.5rem!important}.p-2{padding:0.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.ml-1{margin-left:0.25rem!important}.mr-auto{margin-right:auto!important}.justify-content-center{justify-content:center!important}.align-items-center{align-items:center!important}@media (min-width: 1200px){.p-xl-5{padding:3rem!important}}.mx-0{margin-left:0!important;margin-right:0!important}.text-center{text-align:center}.text-white{color:white!important}.text-black{color:black!important}.dark .text-black{color:white!important}.container{width:100%;max-width:1200px;margin-left:auto;margin-right:auto;padding-left:1rem;padding-right:1rem}.card-header-overlap-text{position:relative}@media (min-width: 768px){.p-md-5{padding:3rem!important}}@media (min-width: 992px){.d-lg-flex{display:flex!important}.mb-lg-0{margin-bottom:0!important}}.prose table{border-collapse:collapse!important}.prose table th,.prose table td{border:1px solid rgb(var(--gray-200))!important}.dark .prose table th,.dark .prose table td{border-color:rgb(var(--gray-700) / 0.5)!important}.prose table th{padding:0.571429em;font-weight:600;vertical-align:bottom;color:var(--tw-prose-headings);text-align:left}.prose table th.center-align{text-align:center}.prose table td{padding:0.571429em;vertical-align:baseline}[data-component-part=\"accordion-description\"]{font-size:0.875rem!important}.accordion.mb-3{margin-bottom:0.25rem!important}@media (max-width: 991.98px){[id^=\"kapa-widget-container\"] button{width:36px!important;height:36px!important;min-width:36px!important;padding:0!important;font-size:0!important}[id^=\"kapa-widget-container\"] button svg{width:18px!important;height:18px!important}[id^=\"kapa-widget-container\"] button span{display:none!important}}table.crdb-fixed-table{table-layout:fixed!important;min-width:0!important;width:100%}table.crdb-fixed-table td,table.crdb-fixed-table th{min-width:0!important;overflow-wrap:break-word;word-break:normal}.sql-grammar svg .line{fill:none;stroke:#262626}.sql-grammar svg .bold-line{stroke:#0A0A0A;shape-rendering:crispEdges;stroke-width:2}.sql-grammar svg .thin-line{stroke:#0F0F0F;shape-rendering:crispEdges}.sql-grammar svg .filled{fill:#262626;stroke:none}.sql-grammar svg text.terminal{font-family:Verdana, Sans-serif;font-size:12px;fill:#0A0A0A;font-weight:bold}.sql-grammar svg text.nonterminal{font-family:Verdana, Sans-serif;font-size:12px;fill:#0055FF}.sql-grammar svg text.regexp{font-family:Verdana, Sans-serif;font-size:12px;fill:#0F0F0F}.sql-grammar svg rect,.sql-grammar svg circle,.sql-grammar svg polygon{fill:#262626;stroke:#262626}.sql-grammar svg rect.terminal{fill:#ffffff;stroke:#262626}.sql-grammar svg rect.nonterminal{fill:#FFFFFF;stroke:#262626}.sql-grammar svg rect.text{fill:none;stroke:none}.sql-grammar svg polygon.regexp{fill:#FFFFFF;stroke:#262626}.sql-grammar svg{background-color:#ffffff}.sql-grammar a[name]::before{content:'';display:block;height:80px;margin:-80px 0 0}.sql-grammar a[name]:focus{outline:0}pre[language=\"sql\"][data-crdb-prompt-stripped] code::before{content:\"> \";color:#94e2d5;user-select:none}.mark-yes{color:#008a5e;font-weight:600}.dark .mark-yes{color:#3ddc97}"},{"filePath":"collapse-nav.css","content":"html:not(.crl-nav-off) [data-layout-item=\"sidebar\"] li[data-title]:not([data-active]):not([data-crl-keep])>button+ul,html:not(.crl-nav-off) [data-layout-item=\"mobile-nav\"] li[data-title]:not([data-active]):not([data-crl-keep])>button+ul{display:none}html:not(.crl-nav-off) [data-layout-item=\"sidebar\"] li[data-title]:not([data-active]):not([data-crl-keep])>button svg,html:not(.crl-nav-off) [data-layout-item=\"mobile-nav\"] li[data-title]:not([data-active]):not([data-crl-keep])>button svg{rotate:none!important;transform:none!important}"}],"page":{"pagePath":"docs/v26.1/connection-pooling","slug":"/docs/v26.1/connection-pooling","pageMetadata":{"title":"Connection Pooling","old_description":"How to plan, configure, and use connection pools when using drivers or frameworks with CockroachDB.","canonical":"https://docs.cockroachlabs.com/docs/stable/connection-pooling","description":null,"href":"/docs/v26.1/connection-pooling"},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note,Tab,Tabs}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`This page has information on planning, configuring, and using connection pools when using drivers or frameworks with CockroachDB.`}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`In our sizing and production guidance, 1 vCPU is considered equivalent to 1 core in the underlying hardware platform.`})}),`\n`,_jsx(Heading,{level:`2`,id:`about-connection-pools`,children:`About connection pools`}),`\n`,_jsx(_components.p,{children:`A typical database operation consists of several steps.`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`The driver uses a configuration to start a connection to the database server.`}),`\n`,_jsx(_components.li,{children:`A network socket is opened on the client that connects to the database server.`}),`\n`,_jsx(_components.li,{children:`Data is read or written through the network socket.`}),`\n`,_jsx(_components.li,{children:`The connection is closed down.`}),`\n`,_jsx(_components.li,{children:`The network socket is closed down and its resources are freed.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`For simple database operations, these steps are not expensive, but as an application scales up, the performance of the application will suffer as each connection is created and destroyed. One pattern for improving performance is a connection pool, a group of already configured and established network connections between the client and database that can be reused for data operations within an application.`}),`\n`,_jsx(_components.p,{children:`Each time an application reads or writes data, it will request one of the connections in the pool. After the data operation completes, the connection is returned to the pool so other operations can use it.`}),`\n`,_jsx(_components.p,{children:`Connection pooling can be a enabled as a feature of the driver, a separate library used in conjunction with a driver, a feature of an application server, or a proxy server that acts as a gateway to the database server.`}),`\n`,_jsx(_components.p,{children:`Sizing a connection pool is critical to maximizing application performance. Too few connections and the application will be blocked, waiting for the connection pool to establish a new connection, or for an existing connection to become available. Conversely, a connection pool with too many connections actively executing a query at the same time can also result in high latency as the cluster cycles through every connection concurrently, decreasing efficiency as the cluster incurs a cost every time it context-switches through every query. For example, the time it takes for many threads to complete many queries in parallel is typically higher than that for a smaller number of threads scaled to the number of available vCPUs or IOPs.`}),`\n`,_jsxs(_components.p,{children:[`To read more about connection pooling, see our `,_jsx(_components.a,{href:`https://www.cockroachlabs.com/blog/what-is-connection-pooling`,children:`What is Connection Pooling, and Why Should You\nCare`}),` blog post.`]}),`\n`,_jsx(Heading,{level:`2`,id:`recommended-settings-for-connection-pools`,children:`Recommended settings for connection pools`}),`\n`,_jsx(_components.p,{children:`These are Cockroach Labs recommendations for settings common to most connection pooling software. If your application has multiple workers, each worker should be configured based on the kinds of queries required for its workload.`}),`\n`,_jsx(Heading,{level:`3`,id:`set-the-maximum-lifetime-of-connections`,children:`Set the maximum lifetime of connections`}),`\n`,_jsx(_components.p,{children:`The maximum lifetime of a connection should be set to between 5 and 30 minutes. CockroachDB Cloud clusters support 30 minutes as the maximum connection lifetime. When a node is shut down or restarted, client connections can be reset after 30 minutes, causing a disruption to applications.`}),`\n`,_jsxs(_components.p,{children:[`Cockroach Labs recommends starting with a 5 minute maximum connection lifetime and increasing the connection lifetime if there is an impact on tail latency, normally seen when there are large numbers of connections to a cluster. Setting the connection lifetime below 5 minutes is possible, but there is little benefit, and comes at a cost of increased CPU usage for clients and servers. The maximum connection lifetime changes the `,_jsx(_components.a,{href:`#monitor-new-connections`,children:`rate of new connections per second`}),` (i.e., average new connections per second = total connections / maximum connection age).`]}),`\n`,_jsxs(_components.p,{children:[`Configure your connection pooling with `,_jsx(_components.a,{href:`#avoid-spikes-in-new-connections`,children:`connection jitter`}),` to prevent connection storms.`]}),`\n`,_jsx(Heading,{level:`3`,id:`set-the-maximum-lifetime-of-idle-connections`,children:`Set the maximum lifetime of idle connections`}),`\n`,_jsxs(_components.p,{children:[`Set the maximum lifetime of idle connections to the same value as the `,_jsx(_components.a,{href:`#set-the-maximum-lifetime-of-connections`,children:`maximum lifetime of connections`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`set-the-maximum-number-of-open-connections`,children:`Set the maximum number of open connections`}),`\n`,_jsx(_components.p,{children:`The maximum number of open connections should be set to a value that is greater than the maximum number of concurrent queries that your application worker expects to make. Doing so minimizes the need to establish new connections.`}),`\n`,_jsx(Heading,{level:`3`,id:`set-the-maximum-number-of-idle-connections`,children:`Set the maximum number of idle connections`}),`\n`,_jsxs(_components.p,{children:[`Set the maximum number of idle connections to the same value as the `,_jsx(_components.a,{href:`#set-the-maximum-number-of-open-connections`,children:`maximum number of open connections`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`optimize-your-connection-pool`,children:`Optimize your connection pool`}),`\n`,_jsx(_components.p,{children:`Follow these additional recommendations optimize the performance of your connection pool software.`}),`\n`,_jsx(Heading,{level:`3`,id:`avoid-spikes-in-new-connections`,children:`Avoid spikes in new connections`}),`\n`,_jsx(_components.p,{children:`If possible configure your connection pool to avoid periodic spikes in new connections, also known as “thundering herds” or “connection storms.” Most connection pools offer the ability to stagger their connection age through the use of a connection lifetime “jitter,” where the wait time between new connections is randomized. Using a connection jitter of 10% of the maximum connection lifetime smooths out the rate of new connections to a cluster. For example, for a maximum connection lifetime of 1800 seconds (30 minutes), set the connection jitter to 500 seconds (3 minutes).`}),`\n`,_jsx(Heading,{level:`3`,id:`validate-connections-in-a-pool`,children:`Validate connections in a pool`}),`\n`,_jsx(_components.p,{children:`After a connection pool initializes connections to CockroachDB clusters, those connections can occasionally break. This could be due to changes in the cluster topology, or rolling upgrades and restarts, or network disruptions.`}),`\n`,_jsxs(_components.p,{children:[`Validating connections is typically handled automatically by the connection pool. For example, in HikariCP the connection is validated whenever you request a connection from the pool, and the `,_jsxs(_components.a,{href:`https://github.com/brettwooldridge/HikariCP#frequently-used`,children:[_jsx(_components.code,{children:`keepaliveTime`}),` property`]}),` allows you to configure an interval to periodically check if the connections in the pool are valid. Whatever connection pool you use, make sure connection validation is enabled when running your application.`]}),`\n`,_jsx(Heading,{level:`2`,id:`size-connection-pools`,children:`Size connection pools`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Basic/Standard`,id:`basic%2Fstandard`,children:[_jsx(_components.p,{children:`If your connection pool is properly configured, the total number of open connections to your cluster will typically be at least 100 times larger than the number of new connections per second to your cluster.`}),_jsx(_components.p,{children:`Idle connections in CockroachDB do not consume many resources compared to PostgreSQL. Unlike PostgreSQL, which has a hard limit of 5000 connections, CockroachDB can safely support tens of thousands of connections.`}),_jsxs(_components.p,{children:[`The `,_jsxs(_components.a,{href:`/docs/cockroachcloud/metrics-sql#sql-connections`,children:[_jsx(_components.strong,{children:`SQL Connection`}),` graph`]}),` shows how many new connections are being created each second. The `,_jsxs(_components.a,{href:`/docs/cockroachcloud/metrics-sql#open-sql-sessions`,children:[_jsx(_components.strong,{children:`Open SQL Sessions`}),` graph`]}),` shows the total number of SQL client connections across the cluster. To determine if your connection pool is correctly configured use the metrics from these graphs in the following formula:`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`SQL Connection Attempts \u003c SQL Open Sessions/100`})}),_jsx(_components.p,{children:`That is, divide the number of open SQL sessions by 100. This result should be less than the number of new SQL connections per second.`}),_jsx(_components.p,{children:`Configure the minimum number of connections to equal to the maximum number of connections, creating a fixed pool size.`}),_jsx(_components.p,{children:`Configure the maximum connection lifetime to 30 minutes.`}),_jsx(_components.p,{children:`Multi-region Basic and Standard clusters have the same recommendations as single-region clusters.`}),_jsx(_components.p,{children:`Cockroach Labs strongly recommends that your application instance run in the same region as your CockroachDB cluster.`})]}),_jsxs(Tab,{title:`Advanced`,id:`advanced`,children:[_jsx(_components.p,{children:`If your connection pool is properly configured, the total number of open connections to your cluster will typically be at least 100 times larger than the number of new connections per second to your cluster.`}),_jsx(_components.p,{children:`Idle connections in CockroachDB do not consume many resources compared to PostgreSQL. Unlike PostgreSQL, which has a hard limit of 5000 connections, CockroachDB can safely support tens of thousands of connections.`}),_jsx(_components.p,{children:`Use the following formula as a starting point to size the connection pool:`}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`active connections = (number of cores * 4)`})}),_jsxs(_components.p,{children:[`If you have a large number of services connecting to the same cluster, make sure the number of `,_jsx(_components.a,{href:`#monitor-active-connections`,children:`concurrent active connections`}),` across all the services does not exceed this recommendation. If each service has its own connection pool, ensure the total number of concurrent active connections across all services stays within this limit.`]}),_jsxs(_components.p,{children:[`For multi-region clusters, create a connection pool per region, and apply the same active connection limits for each region in your cluster. For example, if you have 3 regions in your cluster, and each region has 12 vCPUs, the concurrent active connection limit `,_jsx(_components.strong,{children:`per region`}),` is 48 (12 [processor cores] * 4).`]}),_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.a,{href:`#set-the-maximum-number-of-open-connections`,children:`Connection pool sizes`}),` can be much larger than the active connections limit, since most connections will be idle and have almost no overhead.`]})}),_jsxs(_components.p,{children:[`To control the maximum number of non-superuser (`,_jsx(_components.a,{href:`/docs/v26.1/security-reference/authorization#root-user`,children:_jsx(_components.code,{children:`root`})}),` user or other `,_jsxs(_components.a,{href:`/docs/v26.1/security-reference/authorization#admin-role`,children:[_jsx(_components.code,{children:`admin`}),` role`]}),`) connections a `,_jsx(_components.a,{href:`/docs/v26.1/architecture/sql-layer`,children:`gateway node`}),` can have open at one time, use the `,_jsx(_components.code,{children:`server.max_connections_per_gateway`}),` `,_jsx(_components.a,{href:`/docs/v26.1/cluster-settings`,children:`cluster setting`}),`. If a new non-superuser connection would exceed this limit, the error message `,_jsx(_components.code,{children:`\"sorry, too many clients already\"`}),` is returned, along with error code `,_jsx(_components.code,{children:`53300`}),`.`]}),_jsx(_components.p,{children:`Cockroach Labs strongly recommends that your application instance run in the same region as your CockroachDB cluster.`})]}),_jsxs(Tab,{title:`self-hosted`,id:`self-hosted`,children:[_jsx(_components.p,{children:`If your connection pool is properly configured, the total number of open connections to your cluster will typically be at least 100 times larger than the number of new connections per second to your cluster.`}),_jsx(_components.p,{children:`Idle connections in CockroachDB do not consume many resources compared to PostgreSQL. Unlike PostgreSQL, which has a hard limit of 5000 connections, CockroachDB can safely support tens of thousands of connections.`}),_jsx(_components.p,{children:`Use the following formula as a starting point to size the connection pool:`}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`active connections = (number of cores * 4)`})}),_jsxs(_components.p,{children:[`If you have a large number of services connecting to the same cluster, make sure the number of `,_jsx(_components.a,{href:`#monitor-active-connections`,children:`concurrent active connections`}),` across all the services does not exceed this recommendation. If each service has its own connection pool, ensure the total number of concurrent active connections across all services stays within this limit.`]}),_jsxs(_components.p,{children:[`For multi-region clusters, create a connection pool per region, and apply the same active connection limits for each region in your cluster. For example, if you have 3 regions in your cluster, and each region has 12 vCPUs, the concurrent active connection limit `,_jsx(_components.strong,{children:`per region`}),` is 48 (12 [processor cores] * 4).`]}),_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.a,{href:`#set-the-maximum-number-of-open-connections`,children:`Connection pool sizes`}),` can be much larger than the active connections limit, since most connections will be idle and have almost no overhead.`]})}),_jsxs(_components.p,{children:[`To control the maximum number of non-superuser (`,_jsx(_components.a,{href:`/docs/v26.1/security-reference/authorization#root-user`,children:_jsx(_components.code,{children:`root`})}),` user or other `,_jsxs(_components.a,{href:`/docs/v26.1/security-reference/authorization#admin-role`,children:[_jsx(_components.code,{children:`admin`}),` role`]}),`) connections a `,_jsx(_components.a,{href:`/docs/v26.1/architecture/sql-layer`,children:`gateway node`}),` can have open at one time, use the `,_jsx(_components.code,{children:`server.max_connections_per_gateway`}),` `,_jsx(_components.a,{href:`/docs/v26.1/cluster-settings`,children:`cluster setting`}),`. If a new non-superuser connection would exceed this limit, the error message `,_jsx(_components.code,{children:`\"sorry, too many clients already\"`}),` is returned, along with error code `,_jsx(_components.code,{children:`53300`}),`.`]}),_jsx(_components.p,{children:`Cockroach Labs strongly recommends that your application instance run in the same region as your CockroachDB cluster.`})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`monitor-sql-connections`,children:`Monitor SQL connections`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Basic/Standard`,id:`basic%2Fstandard-2`,\"data-child-heading-ids\":`[\"monitor-new-connections\",\"monitor-active-connections\"]`,children:[_jsx(_components.p,{children:`To validate that your connection pool is correctly configured, monitor the SQL connection metrics and graphs on your cluster.`}),_jsx(Heading,{level:`3`,id:`monitor-new-connections`,children:`Monitor new connections`}),_jsxs(_components.p,{children:[`The `,_jsxs(_components.a,{href:`/docs/cockroachcloud/metrics-sql#sql-connections`,children:[_jsx(_components.strong,{children:`SQL Connections`}),` graph`]}),` shows the number of new SQL connections per second.`]}),_jsx(_components.p,{children:`A misconfigured connection pool will result in most database operations requiring a new connection to be established, which will increase query latency.`}),_jsx(Heading,{level:`3`,id:`monitor-active-connections`,children:`Monitor active connections`}),_jsxs(_components.p,{children:[`The `,_jsxs(_components.a,{href:`/docs/cockroachcloud/metrics-sql#open-sql-sessions`,children:[_jsx(_components.strong,{children:`Open SQL Sessions`}),` graph`]}),` shows the number of open connections on your cluster.`]}),_jsx(_components.p,{children:`If your connection pool is properly configured, the total number of open connections to your cluster should be at least 100 times larger than the number of new connections per second to your cluster.`})]}),_jsxs(Tab,{title:`Advanced`,id:`advanced-2`,\"data-child-heading-ids\":`[\"monitor-new-connections-2\",\"monitor-active-connections-2\"]`,children:[_jsx(_components.p,{children:`To validate that your connection pool is correctly configured, monitor the SQL connection metrics and graphs on your cluster.`}),_jsx(Heading,{level:`3`,id:`monitor-new-connections-2`,children:`Monitor new connections`}),_jsxs(_components.p,{children:[`The `,_jsxs(_components.a,{href:`/docs/v26.1/metrics#available-metrics`,children:[_jsx(_components.code,{children:`sql.new_conns`}),` metric`]}),` and `,_jsxs(_components.a,{href:`/docs/v26.1/ui-sql-dashboard#sql-connection-rate`,children:[_jsx(_components.strong,{children:`SQL Connection Rate`}),` graph`]}),` expose the number of new SQL connections per second.`]}),_jsx(_components.p,{children:`A misconfigured connection pool will result in most database operations requiring a new connection to be established, which will increase query latency.`}),_jsx(Heading,{level:`3`,id:`monitor-active-connections-2`,children:`Monitor active connections`}),_jsxs(_components.p,{children:[`The `,_jsxs(_components.a,{href:`/docs/v26.1/metrics#available-metrics`,children:[_jsx(_components.code,{children:`sql.conns`}),` metric`]}),` and `,_jsxs(_components.a,{href:`/docs/v26.1/ui-sql-dashboard#open-sql-sessions`,children:[_jsx(_components.strong,{children:`Open SQL Sessions`}),` graph`]}),` show the number of open connections on your cluster or node.`]}),_jsxs(_components.p,{children:[`The `,_jsxs(_components.a,{href:`/docs/v26.1/metrics#available-metrics`,children:[_jsx(_components.code,{children:`sql.statements.active`}),` metric`]}),` and `,_jsxs(_components.a,{href:`/docs/v26.1/ui-sql-dashboard#active-sql-statements`,children:[_jsx(_components.strong,{children:`Active SQL Statements`}),` graph`]}),` show the number of `,_jsx(_components.strong,{children:`active`}),` connections on your cluster or node. A connection is “active” when it is actively executing a query.`]}),_jsx(_components.p,{children:`Using the following formula:`}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`active connections = (number of cores * 4)`})}),_jsx(_components.p,{children:`If the number of concurrent active connections exceeds 4 times the number of cores in your cluster, your application is likely not achieving maximum throughput. You should reduce the concurrent workload across your applications, or scale the cluster by adding more nodes or cores per node. Reducing the number of active connections may increase overall throughput, possibly at the expense of increased tail latency for your queries.`}),_jsx(_components.p,{children:`If your connection pool is properly configured, the total number of open connections to your cluster should be at least 100 times larger than the number of new connections per second to your cluster.`})]}),_jsxs(Tab,{title:`self-hosted`,id:`self-hosted-2`,\"data-child-heading-ids\":`[\"monitor-new-connections-3\",\"monitor-active-connections-3\"]`,children:[_jsx(_components.p,{children:`To validate that your connection pool is correctly configured, monitor the SQL connection metrics and graphs on your cluster.`}),_jsx(Heading,{level:`3`,id:`monitor-new-connections-3`,children:`Monitor new connections`}),_jsxs(_components.p,{children:[`The `,_jsxs(_components.a,{href:`/docs/v26.1/metrics#available-metrics`,children:[_jsx(_components.code,{children:`sql.new_conns`}),` metric`]}),` and `,_jsxs(_components.a,{href:`/docs/v26.1/ui-sql-dashboard#sql-connection-rate`,children:[_jsx(_components.strong,{children:`SQL Connection Rate`}),` graph`]}),` expose the number of new SQL connections per second.`]}),_jsx(_components.p,{children:`A misconfigured connection pool will result in most database operations requiring a new connection to be established, which will increase query latency.`}),_jsx(Heading,{level:`3`,id:`monitor-active-connections-3`,children:`Monitor active connections`}),_jsxs(_components.p,{children:[`The `,_jsxs(_components.a,{href:`/docs/v26.1/metrics#available-metrics`,children:[_jsx(_components.code,{children:`sql.conns`}),` metric`]}),` and `,_jsxs(_components.a,{href:`/docs/v26.1/ui-sql-dashboard#open-sql-sessions`,children:[_jsx(_components.strong,{children:`Open SQL Sessions`}),` graph`]}),` show the number of open connections on your cluster or node.`]}),_jsxs(_components.p,{children:[`The `,_jsxs(_components.a,{href:`/docs/v26.1/metrics#available-metrics`,children:[_jsx(_components.code,{children:`sql.statements.active`}),` metric`]}),` and `,_jsxs(_components.a,{href:`/docs/v26.1/ui-sql-dashboard#active-sql-statements`,children:[_jsx(_components.strong,{children:`Active SQL Statements`}),` graph`]}),` show the number of `,_jsx(_components.strong,{children:`active`}),` connections on your cluster or node. A connection is “active” when it is actively executing a query.`]}),_jsx(_components.p,{children:`Using the following formula:`}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`active connections = (number of cores * 4)`})}),_jsx(_components.p,{children:`If the number of concurrent active connections exceeds 4 times the number of cores in your cluster, your application is likely not achieving maximum throughput. You should reduce the concurrent workload across your applications, or scale the cluster by adding more nodes or cores per node. Reducing the number of active connections may increase overall throughput, possibly at the expense of increased tail latency for your queries.`}),_jsx(_components.p,{children:`If your connection pool is properly configured, the total number of open connections to your cluster should be at least 100 times larger than the number of new connections per second to your cluster.`})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`serverless-functions`,children:`Serverless functions`}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`“Serverless” refers to stateless, programmatic functions deployed in a cloud environment that provides an execution\nframework to provision resources dynamically, such as Amazon Lambda functions.`})}),`\n`,_jsx(_components.p,{children:`If your application uses serverless functions to connect to CockroachDB, use a connection pool if you plan to invoke functions frequently. To ensure that the connection pool is reused across invocations of the same function instance, initialize the connection pool variable outside the scope of the serverless function definition. Set the maximum connection pool size to 1, unless your function is multi-threaded and establishes multiple concurrent requests to your database within a single function instance.`}),`\n`,_jsx(Heading,{level:`2`,id:`example`,children:`Example`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Java (Hikari/JDBC)`,id:`java-hikari%2Fjdbc`,children:[_jsxs(_components.p,{children:[`In this example, a Java application similar to the `,_jsx(_components.a,{href:`/docs/v26.1/build-a-java-app-with-cockroachdb`,children:`basic JDBC example`}),` uses the `,_jsx(`a`,{href:`https://jdbc.postgresql.org/`,children:`PostgreSQL JDBC driver`}),` and `,_jsx(`a`,{href:`https://github.com/brettwooldridge/HikariCP`,children:`HikariCP`}),` as the connection pool layer to connect to a CockroachDB cluster. The database is being run on 10 cores across the cluster.`]}),_jsx(_components.p,{children:`Using the connection pool formula above:`}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`connections = (10 [processor cores] * 4)`})}),_jsx(_components.p,{children:`The connection pool size should be 40.`}),_jsx(_components.p,{children:`The maximum lifetime of a connection is set to 300000 milliseconds, or 5 minutes.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`15`,language:`java`,children:_jsx(_components.pre,{className:`shiki shiki-themes catppuccin-mocha catppuccin-mocha`,style:{backgroundColor:`#1e1e2e`,\"--shiki-dark-bg\":`#1e1e2e`,color:`#cdd6f4`,\"--shiki-dark\":`#cdd6f4`},language:`java`,children:_jsxs(_components.code,{language:`java`,numberOfLines:`15`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CBA6F7`,\"--shiki-dark\":`#CBA6F7`},children:`HikariConfig`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:` config `}),_jsx(_components.span,{style:{color:`#94E2D5`,\"--shiki-dark\":`#94E2D5`},children:`=`}),_jsx(_components.span,{style:{color:`#CBA6F7`,\"--shiki-dark\":`#CBA6F7`},children:` new`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:` HikariConfig`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`();`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`config`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`setJdbcUrl`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(`}),_jsx(_components.span,{style:{color:`#A6E3A1`,\"--shiki-dark\":`#A6E3A1`},children:`\"jdbc:postgresql://localhost:26257/bank\"`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`config`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`setUsername`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(`}),_jsx(_components.span,{style:{color:`#A6E3A1`,\"--shiki-dark\":`#A6E3A1`},children:`\"maxroach\"`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`config`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`setPassword`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(`}),_jsx(_components.span,{style:{color:`#A6E3A1`,\"--shiki-dark\":`#A6E3A1`},children:`\"password\"`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`config`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`addDataSourceProperty`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(`}),_jsx(_components.span,{style:{color:`#A6E3A1`,\"--shiki-dark\":`#A6E3A1`},children:`\"ssl\"`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`,`}),_jsx(_components.span,{style:{color:`#A6E3A1`,\"--shiki-dark\":`#A6E3A1`},children:` \"true\"`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`config`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`addDataSourceProperty`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(`}),_jsx(_components.span,{style:{color:`#A6E3A1`,\"--shiki-dark\":`#A6E3A1`},children:`\"sslmode\"`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`,`}),_jsx(_components.span,{style:{color:`#A6E3A1`,\"--shiki-dark\":`#A6E3A1`},children:` \"require\"`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`config`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`addDataSourceProperty`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(`}),_jsx(_components.span,{style:{color:`#A6E3A1`,\"--shiki-dark\":`#A6E3A1`},children:`\"reWriteBatchedInserts\"`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`,`}),_jsx(_components.span,{style:{color:`#A6E3A1`,\"--shiki-dark\":`#A6E3A1`},children:` \"true\"`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`config`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`setAutoCommit`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(`}),_jsx(_components.span,{style:{color:`#F38BA8`,\"--shiki-dark\":`#F38BA8`},children:`false`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`config`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`setMaximumPoolSize`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(`}),_jsx(_components.span,{style:{color:`#FAB387`,\"--shiki-dark\":`#FAB387`},children:`40`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`config`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`setMaxLifetime`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(`}),_jsx(_components.span,{style:{color:`#FAB387`,\"--shiki-dark\":`#FAB387`},children:`300000`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`config`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`setKeepaliveTime`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(`}),_jsx(_components.span,{style:{color:`#FAB387`,\"--shiki-dark\":`#FAB387`},children:`150000`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CBA6F7`,\"--shiki-dark\":`#CBA6F7`},children:`HikariDataSource`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:` ds `}),_jsx(_components.span,{style:{color:`#94E2D5`,\"--shiki-dark\":`#94E2D5`},children:`=`}),_jsx(_components.span,{style:{color:`#CBA6F7`,\"--shiki-dark\":`#CBA6F7`},children:` new`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:` HikariDataSource`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`config`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CBA6F7`,\"--shiki-dark\":`#CBA6F7`},children:`Connection`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:` conn `}),_jsx(_components.span,{style:{color:`#94E2D5`,\"--shiki-dark\":`#94E2D5`},children:`=`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:` ds`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`getConnection`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`();`})]}),`\n`]})})})]}),_jsxs(Tab,{title:`Go (pgxpool)`,id:`go-pgxpool`,children:[_jsxs(_components.p,{children:[`In this example, a Go application similar to the `,_jsx(_components.a,{href:`/docs/v26.1/build-a-go-app-with-cockroachdb`,children:`basic pgx example`}),` uses the `,_jsx(`a`,{href:`https://pkg.go.dev/github.com/jackc/pgx/v5/pgxpool`,children:`pgxpool library`}),` to create a connection pool on a CockroachDB cluster. The database is being run on 10 cores across the cluster.`]}),_jsx(_components.p,{children:`Using the connection pool formula above:`}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`connections = (10 [processor cores] * 4)`})}),_jsxs(_components.p,{children:[`The connection pool size should be 40, and is set using the `,_jsx(_components.code,{children:`pool_max_conns`}),` query parameter.`]}),_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`pool_max_conn_lifetime`}),` query parameter sets the maximum age of a connection to 300 seconds, or 5 minutes.`]}),_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`pool_max_conn_lifetime_jitter`}),` query parameter sets the connection jitter to 30 seconds, or 10% of the maximum connection age.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`12`,language:`go`,children:_jsx(_components.pre,{className:`shiki shiki-themes catppuccin-mocha catppuccin-mocha`,style:{backgroundColor:`#1e1e2e`,\"--shiki-dark-bg\":`#1e1e2e`,color:`#cdd6f4`,\"--shiki-dark\":`#cdd6f4`},language:`go`,children:_jsxs(_components.code,{language:`go`,numberOfLines:`12`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#9399B2`,\"--shiki-dark-font-style\":`italic`},children:`// Set connection pool configuration, with maximum connection pool size.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`config`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`,`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:` err `}),_jsx(_components.span,{style:{color:`#94E2D5`,\"--shiki-dark\":`#94E2D5`},children:`:=`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:` pgxpool`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`ParseConfig`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(`}),_jsx(_components.span,{style:{color:`#A6E3A1`,\"--shiki-dark\":`#A6E3A1`},children:`\"postgres://max:roach@127.0.0.1:26257/bank?sslmode=require\u0026pool_max_conns=40\u0026pool_max_conn_lifetime=300s\u0026pool_max_conn_lifetime_jitter=30s\"`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CBA6F7`,\"--shiki-dark\":`#CBA6F7`},children:`\tif`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:` err `}),_jsx(_components.span,{style:{color:`#94E2D5`,\"--shiki-dark\":`#94E2D5`},children:`!=`}),_jsx(_components.span,{style:{color:`#F38BA8`,\"--shiki-dark\":`#F38BA8`},children:` nil`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`\t\tlog`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`Fatal`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(`}),_jsx(_components.span,{style:{color:`#A6E3A1`,\"--shiki-dark\":`#A6E3A1`},children:`\"error configuring the database: \"`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`,`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:` err`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`\t}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#9399B2`,\"--shiki-dark-font-style\":`italic`},children:`// Create a connection pool to the \"bank\" database.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`dbpool`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`,`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:` err `}),_jsx(_components.span,{style:{color:`#94E2D5`,\"--shiki-dark\":`#94E2D5`},children:`:=`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:` pgxpool`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`ConnectConfig`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`context`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`Background`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(),`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:` config`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CBA6F7`,\"--shiki-dark\":`#CBA6F7`},children:`if`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:` err `}),_jsx(_components.span,{style:{color:`#94E2D5`,\"--shiki-dark\":`#94E2D5`},children:`!=`}),_jsx(_components.span,{style:{color:`#F38BA8`,\"--shiki-dark\":`#F38BA8`},children:` nil`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:`\tlog`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`Fatal`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`(`}),_jsx(_components.span,{style:{color:`#A6E3A1`,\"--shiki-dark\":`#A6E3A1`},children:`\"error connecting to the database: \"`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`,`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:` err`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`}`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CBA6F7`,\"--shiki-dark\":`#CBA6F7`},children:`defer`}),_jsx(_components.span,{style:{color:`#CDD6F4`,\"--shiki-dark\":`#CDD6F4`},children:` dbpool`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`.`}),_jsx(_components.span,{style:{color:`#89B4FA`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`Close`}),_jsx(_components.span,{style:{color:`#9399B2`,\"--shiki-dark\":`#9399B2`},children:`()`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`For a full list of connection pool configuration parameters for pgxpool, see `,_jsx(`a`,{href:`https://pkg.go.dev/github.com/jackc/pgx/v5/pgxpool#Config`,children:`the pgxpool documentation`}),`.`]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`known-limitations`,children:`Known limitations`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`When a node has both a high number of client connections and running queries, the node may crash due to memory exhaustion. This is due to CockroachDB not accurately limiting the number of clients and queries based on the amount of available RAM on the node. To prevent memory exhaustion, monitor each node’s memory usage and ensure there is some margin between maximum CockroachDB memory usage and available system RAM. For more details about memory usage in CockroachDB, see `,_jsx(_components.a,{href:`https://www.cockroachlabs.com/blog/memory-usage-cockroachdb`,children:`this blog post`}),`.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":{"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}},"config":{},"pageMetadata":{"title":"Connection Pooling","old_description":"How to plan, configure, and use connection pools when using drivers or frameworks with CockroachDB.","canonical":"https://docs.cockroachlabs.com/docs/stable/connection-pooling","description":null,"href":"/docs/v26.1/connection-pooling"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"About connection pools","slug":"about-connection-pools","depth":2,"children":[]},{"title":"Recommended settings for connection pools","slug":"recommended-settings-for-connection-pools","depth":2,"children":[{"title":"Set the maximum lifetime of connections","slug":"set-the-maximum-lifetime-of-connections","depth":3,"children":[]},{"title":"Set the maximum lifetime of idle connections","slug":"set-the-maximum-lifetime-of-idle-connections","depth":3,"children":[]},{"title":"Set the maximum number of open connections","slug":"set-the-maximum-number-of-open-connections","depth":3,"children":[]},{"title":"Set the maximum number of idle connections","slug":"set-the-maximum-number-of-idle-connections","depth":3,"children":[]}]},{"title":"Optimize your connection pool","slug":"optimize-your-connection-pool","depth":2,"children":[{"title":"Avoid spikes in new connections","slug":"avoid-spikes-in-new-connections","depth":3,"children":[]},{"title":"Validate connections in a pool","slug":"validate-connections-in-a-pool","depth":3,"children":[]}]},{"title":"Size connection pools","slug":"size-connection-pools","depth":2,"children":[]},{"title":"Monitor SQL connections","slug":"monitor-sql-connections","depth":2,"children":[{"title":"Monitor new connections","slug":"monitor-new-connections","depth":3,"children":[],"tabId":"basic%2Fstandard-2"},{"title":"Monitor active connections","slug":"monitor-active-connections","depth":3,"children":[],"tabId":"basic%2Fstandard-2"},{"title":"Monitor new connections","slug":"monitor-new-connections-2","depth":3,"children":[],"tabId":"advanced-2"},{"title":"Monitor active connections","slug":"monitor-active-connections-2","depth":3,"children":[],"tabId":"advanced-2"},{"title":"Monitor new connections","slug":"monitor-new-connections-3","depth":3,"children":[],"tabId":"self-hosted-2"},{"title":"Monitor active connections","slug":"monitor-active-connections-3","depth":3,"children":[],"tabId":"self-hosted-2"}]},{"title":"Serverless functions","slug":"serverless-functions","depth":2,"children":[]},{"title":"Example","slug":"example","depth":2,"children":[]},{"title":"Known limitations","slug":"known-limitations","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/cockroachlabs/4695317e415d4eba/kapa.js","/_mintlify/custom/cockroachlabs/40fb45a3cfe42c92/copy-code-prompt.js","/_mintlify/custom/cockroachlabs/3f343c9e8c40397a/collapse-nav.js"],"subdomain":"cockroachlabs","siteName":"CockroachDB","title":"Connection Pooling - CockroachDB","navMaps":{"firstHrefInVersion":{"v26.4":{"href":"/docs/stable/connection-pooling","matchLevel":1},"v26.3":{"href":"/docs/v26.3/connection-pooling","matchLevel":1,"canonicalOverride":true},"v26.2":{"href":"/docs/v26.2/connection-pooling","matchLevel":1,"canonicalOverride":true},"v26.1":{"href":"/docs/v26.1/connection-pooling","matchLevel":0},"v25.4":{"href":"/docs/v25.4/connection-pooling","matchLevel":1,"canonicalOverride":true},"v25.3":{"href":"/docs/v25.3/connection-pooling","matchLevel":1,"canonicalOverride":true},"v25.2":{"href":"/docs/v25.2/connection-pooling","matchLevel":1,"canonicalOverride":true},"v25.1":{"href":"/docs/v25.1/connection-pooling","matchLevel":1,"canonicalOverride":true},"v24.3":{"href":"/docs/v24.3/connection-pooling","matchLevel":1,"canonicalOverride":true},"v24.1":{"href":"/docs/v24.1/connection-pooling","matchLevel":1,"canonicalOverride":true},"v23.2":{"href":"/docs/v23.2/connection-pooling","matchLevel":1,"canonicalOverride":true},"v23.1":{"href":"/docs/v23.1/connection-pooling","matchLevel":1,"canonicalOverride":true}},"firstHrefInLanguage":{}},"lastModified":"2026-11-11T19:18:36.227Z","originalFileLocation":"docs/v26.1/connection-pooling.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"application-name\" content=\"CockroachDB\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/cockroachlabs/c9BlkJ0WBi2Ma7w-/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/cockroachlabs/c9BlkJ0WBi2Ma7w-/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/cockroachlabs/c9BlkJ0WBi2Ma7w-/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/cockroachlabs/c9BlkJ0WBi2Ma7w-/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/cockroachlabs/c9BlkJ0WBi2Ma7w-/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/cockroachlabs/c9BlkJ0WBi2Ma7w-/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/cockroachlabs/c9BlkJ0WBi2Ma7w-/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/cockroachlabs/c9BlkJ0WBi2Ma7w-/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/cockroachlabs/c9BlkJ0WBi2Ma7w-/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Connection Pooling - CockroachDB\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"CockroachDB\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.cockroachlabs.com/docs/stable/connection-pooling\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://cockroachlabs.mintlify.site/_mintlify/api/og/v2?division=Connect+to+an+Application\u0026amp;title=Connection+Pooling\u0026amp;theme=4aeed7318cb28bd50868adb3\u0026amp;signature=26d5cf5be74e94df87837f39a32d812979c9d74024cdb25f11da21092e884ead\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Connection Pooling - CockroachDB\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://cockroachlabs.mintlify.site/_mintlify/api/og/v2?division=Connect+to+an+Application\u0026amp;title=Connection+Pooling\u0026amp;theme=4aeed7318cb28bd50868adb3\u0026amp;signature=26d5cf5be74e94df87837f39a32d812979c9d74024cdb25f11da21092e884ead\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/cockroachlabs/c9BlkJ0WBi2Ma7w-/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"CockroachDB\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#9059FF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.cockroachlabs.com/docs/stable/connection-pooling\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/v26.1/connection-pooling.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.cockroachlabs.com/#organization\",\"name\":\"CockroachDB\",\"url\":\"https://docs.cockroachlabs.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/cockroachlabs/4WvUnbVuGZfqM4kW/images/CockroachLabs_Wordmark_Black.png?fit=max\u0026auto=format\u0026n=4WvUnbVuGZfqM4kW\u0026q=85\u0026s=54ccae625c9986bf1df8ddc7b2c571f0\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.cockroachlabs.com#website\",\"name\":\"CockroachDB\",\"url\":\"https://docs.cockroachlabs.com\",\"publisher\":{\"@id\":\"https://docs.cockroachlabs.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.cockroachlabs.com/docs/stable/connection-pooling#webpage\",\"url\":\"https://docs.cockroachlabs.com/docs/stable/connection-pooling\",\"name\":\"Connection Pooling\",\"dateModified\":\"2026-11-11T19:18:36.227Z\",\"isPartOf\":{\"@id\":\"https://docs.cockroachlabs.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.cockroachlabs.com/docs/stable/connection-pooling#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.cockroachlabs.com/docs/stable/connection-pooling#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Connect to an Application\",\"item\":\"https://docs.cockroachlabs.com/docs/v26.1/install-client-drivers\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Connection Pooling\",\"item\":\"https://docs.cockroachlabs.com/docs/stable/connection-pooling\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.cockroachlabs.com/docs/stable/connection-pooling#article\",\"headline\":\"Connection Pooling\",\"name\":\"Connection Pooling\",\"url\":\"https://docs.cockroachlabs.com/docs/stable/connection-pooling\",\"mainEntityOfPage\":{\"@id\":\"https://docs.cockroachlabs.com/docs/stable/connection-pooling#webpage\"},\"dateModified\":\"2026-11-11T19:18:36.227Z\",\"publisher\":{\"@id\":\"https://docs.cockroachlabs.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.cockroachlabs.com#website\"}}]}\u003c/script>","agentPointerHref":"/docs/v26.1/connection-pooling.md","siteName":"CockroachDB","nav":{"global":{"anchors":[{"anchor":"University","icon":"graduation-cap","href":"https://learn.cockroachlabs.com/"}]},"products":[{"product":"Cockroach Continuum Cloud","icon":"https://mintlify.s3.us-west-1.amazonaws.com/cockroachlabs/images/continuum/cockroachlabs-symbol.svg","description":"The agentic database cloud","pages":[{"title":"Cockroach Continuum Cloud","href":"/docs/continuum"}]},{"product":"CockroachDB","icon":"database","description":"Distributed SQL database","versions":[{"version":"v26.4","default":true,"tag":"Stable","pages":[{"title":"v26.4","href":"/docs/stable/connection-pooling"}]},{"version":"v26.3","pages":[{"title":"v26.3","href":"/docs/v26.3/connection-pooling"}]},{"version":"v26.2","pages":[{"title":"v26.2","href":"/docs/v26.2/connection-pooling"}]},{"version":"v26.1","tabs":[{"tab":"Docs","icon":"book-open","pages":[{"title":"CockroachDB Docs","sidebarTitle":"Docs Home","href":"/docs/v26.1"},{"group":"Get Started","pages":[{"group":"Install CockroachDB","pages":[{"title":"Install CockroachDB on Mac","href":"/docs/v26.1/install-cockroachdb-mac"},{"title":"Install CockroachDB on Linux","href":"/docs/v26.1/install-cockroachdb-linux"},{"title":"Install a FIPS-ready CockroachDB Runtime","href":"/docs/v26.1/fips"},{"title":"Install CockroachDB on Windows","href":"/docs/v26.1/install-cockroachdb-windows"}]},{"group":"Develop with CockroachDB","pages":[{"title":"Developer Basics","href":"/docs/v26.1/developer-basics"},{"group":"JavaScript/TypeScript","pages":[{"title":"Build a Simple CRUD Node.js App with CockroachDB and the node-postgres Driver","href":"/docs/v26.1/build-a-nodejs-app-with-cockroachdb"},{"title":"Build a Node.js App with CockroachDB and Sequelize","href":"/docs/v26.1/build-a-nodejs-app-with-cockroachdb-sequelize"},{"title":"Build a Simple CRUD Node.js App with CockroachDB and Knex.js","href":"/docs/v26.1/build-a-nodejs-app-with-cockroachdb-knexjs"},{"title":"Build a Simple CRUD Node.js App with CockroachDB and Prisma","href":"/docs/v26.1/build-a-nodejs-app-with-cockroachdb-prisma"},{"title":"Build a TypeScript App with CockroachDB and TypeORM","href":"/docs/v26.1/build-a-typescript-app-with-cockroachdb"}]},{"group":"Python","pages":[{"title":"Build a Python App with CockroachDB and Psycopg 3","href":"/docs/v26.1/build-a-python-app-with-cockroachdb-psycopg3"},{"title":"Build a Python App with CockroachDB and psycopg2","href":"/docs/v26.1/build-a-python-app-with-cockroachdb"},{"title":"Build a Simple CRUD Python App with CockroachDB and SQLAlchemy","href":"/docs/v26.1/build-a-python-app-with-cockroachdb-sqlalchemy"},{"title":"Build a Python App with CockroachDB and Django","href":"/docs/v26.1/build-a-python-app-with-cockroachdb-django"},{"title":"Build a Python App with CockroachDB and asyncpg","href":"/docs/v26.1/build-a-python-app-with-cockroachdb-asyncpg"}]},{"group":"Golang","pages":[{"title":"Build a Simple CRUD Go App with CockroachDB and the Go pgx Driver","href":"/docs/v26.1/build-a-go-app-with-cockroachdb"},{"title":"Build a Go App with CockroachDB and GORM","href":"/docs/v26.1/build-a-go-app-with-cockroachdb-gorm"},{"title":"Build a Go App with CockroachDB the Go pq Driver","href":"/docs/v26.1/build-a-go-app-with-cockroachdb-pq"},{"title":"Build a Go App with CockroachDB and upper/db","href":"/docs/v26.1/build-a-go-app-with-cockroachdb-upperdb"}]},{"group":"Java","pages":[{"title":"Build a Simple CRUD Java App with CockroachDB and JDBC","href":"/docs/v26.1/build-a-java-app-with-cockroachdb"},{"title":"Build a Java App with CockroachDB and Hibernate","href":"/docs/v26.1/build-a-java-app-with-cockroachdb-hibernate"},{"title":"Build a Java App with CockroachDB and jOOQ","href":"/docs/v26.1/build-a-java-app-with-cockroachdb-jooq"},{"title":"Build a Spring App with CockroachDB and MyBatis","href":"/docs/v26.1/build-a-spring-app-with-cockroachdb-mybatis"}]},{"group":"Ruby","pages":[{"title":"Build a Ruby App with CockroachDB and the Ruby pg Driver","href":"/docs/v26.1/build-a-ruby-app-with-cockroachdb"},{"title":"Build a Ruby App with CockroachDB and Active Record","href":"/docs/v26.1/build-a-ruby-app-with-cockroachdb-activerecord"}]},{"title":"Build a C# App with CockroachDB and the .NET Npgsql Driver","sidebarTitle":"C# (.NET)","href":"/docs/v26.1/build-a-csharp-app-with-cockroachdb"},{"title":"Build a Rust App with CockroachDB and the Rust-Postgres Driver","sidebarTitle":"Rust","href":"/docs/v26.1/build-a-rust-app-with-cockroachdb"},{"title":"Build a GraphQL Application Using Hasura","sidebarTitle":"Hasura (GraphQL)","href":"/docs/v26.1/hasura-getting-started"}]},{"group":"Standard Examples","pages":[{"title":"Create and Deploy an AWS Lambda Function Built on CockroachDB","sidebarTitle":"AWS Lambda","href":"/docs/v26.1/deploy-lambda-function"},{"title":"Deploy a CockroachDB Cloud Application with Google Cloud Run","sidebarTitle":"Google Cloud Run","href":"/docs/v26.1/deploy-app-gcr"},{"title":"Deploy a Netlify App Built on CockroachDB","sidebarTitle":"Netlify","href":"/docs/v26.1/deploy-app-netlify"},{"title":"Deploy a Web App Built on CockroachDB with Vercel","sidebarTitle":"Vercel","href":"/docs/v26.1/deploy-app-vercel"},{"title":"Serverless Function Best Practices","href":"/docs/v26.1/serverless-function-best-practices"}]},{"title":"MovR","href":"/docs/v26.1/movr"}]},{"group":"CockroachDB and AI","pages":[{"title":"CockroachDB and AI","sidebarTitle":"Overview","href":"/docs/v26.1/cockroachdb-and-ai"},{"title":"Agent Skills for CockroachDB","href":"/docs/v26.1/agent-skills"},{"group":"CockroachDB MCP Server","pages":[{"title":"CockroachDB MCP Server","sidebarTitle":"Overview","href":"/docs/v26.1/cockroachdb-mcp-server"},{"title":"Install, Configure, and Connect to the CockroachDB MCP Server","sidebarTitle":"Install, Configure, and Connect","href":"/docs/v26.1/install-cockroachdb-mcp-server"},{"title":"CockroachDB MCP Server Reference","sidebarTitle":"Self-hosted MCP Server Reference","href":"/docs/v26.1/cockroachdb-mcp-server-reference"}]},{"title":"CockroachDB Docs MCP Server","sidebarTitle":"Docs MCP Server","href":"/docs/v26.1/docs-mcp-integration"}]},{"group":"Feature Overview","pages":[{"group":"CockroachDB Basics","pages":[{"title":"Why CockroachDB?","href":"/docs/v26.1/why-cockroachdb"},{"title":"Replication and Rebalancing","sidebarTitle":"Replication \u0026 Rebalancing","href":"/docs/v26.1/demo-replication-and-rebalancing"},{"title":"CockroachDB Resilience Demo","sidebarTitle":"CockroachDB Resilience","href":"/docs/v26.1/demo-cockroachdb-resilience"},{"title":"Serializable Transactions","href":"/docs/v26.1/demo-serializable"},{"title":"Multi-Active Availability","href":"/docs/v26.1/multi-active-availability"}]},{"group":"CockroachDB SQL","pages":[{"title":"PostgreSQL Compatibility","href":"/docs/v26.1/postgresql-compatibility"},{"title":"SQL Feature Support in CockroachDB","sidebarTitle":"SQL Features","href":"/docs/v26.1/sql-feature-support"},{"title":"SQL FAQs","href":"/docs/v26.1/sql-faqs"}]}]},{"group":"Data Resilience","pages":[{"title":"Data Resilience","sidebarTitle":"Overview","href":"/docs/v26.1/data-resilience"},{"title":"Disaster Recovery Overview","sidebarTitle":"Disaster Recovery","href":"/docs/v26.1/disaster-recovery-overview"}]},{"group":"Connect to an Application","pages":[{"title":"Install a Driver or ORM Framework","href":"/docs/v26.1/install-client-drivers"},{"title":"Connect to a CockroachDB Cluster","sidebarTitle":"Connect to a Cluster","href":"/docs/v26.1/connect-to-the-database"},{"title":"Client Connection Parameters","description":null,"href":"/docs/v26.1/connection-parameters"},{"title":"Connection Pooling","href":"/docs/v26.1/connection-pooling"}]},{"group":"Self-Hosted Deployments","pages":[{"title":"Production Checklist","description":null,"href":"/docs/v26.1/recommended-production-settings"},{"title":"Deployment \u0026 Operations Skills Taxonomy","sidebarTitle":"Deployment and Operations Skills Taxonomy","href":"/docs/v26.1/deployment-operations-skills-taxonomy"},{"group":"Deploy Locally","pages":[{"group":"Deploy from Binary","pages":[{"title":"Deploy a Local Cluster from Binary (Secure)","href":"/docs/v26.1/secure-a-cluster"},{"title":"Deploy a Local Cluster from Binary (Insecure)","href":"/docs/v26.1/start-a-local-cluster"}]},{"title":"Deploy a Local Cluster in Docker (Insecure)","href":"/docs/v26.1/start-a-local-cluster-in-docker"},{"title":"Simulate a Multi-Region Cluster on localhost (Insecure)","sidebarTitle":"Simulate a Multi-Region Cluster Locally","href":"/docs/v26.1/simulate-a-multi-region-cluster-on-localhost"}]},{"group":"Deploy Manually","pages":[{"title":"Manual Deployment","sidebarTitle":"Overview","href":"/docs/v26.1/manual-deployment"},{"title":"Deploy CockroachDB On-Premises","sidebarTitle":"Deploy On-Premises","href":"/docs/v26.1/deploy-cockroachdb-on-premises"},{"title":"Deploy CockroachDB on AWS EC2","sidebarTitle":"Deploy on AWS","href":"/docs/v26.1/deploy-cockroachdb-on-aws"},{"title":"Deploy CockroachDB on Microsoft Azure","sidebarTitle":"Deploy on Azure","href":"/docs/v26.1/deploy-cockroachdb-on-microsoft-azure"},{"title":"Deploy CockroachDB on Google Cloud Platform GCE","sidebarTitle":"Deploy on Google Cloud Platform GCE","href":"/docs/v26.1/deploy-cockroachdb-on-google-cloud-platform"},{"title":"Deploy CockroachDB on Digital Ocean","sidebarTitle":"Deploy on Digital Ocean","href":"/docs/v26.1/deploy-cockroachdb-on-digital-ocean"}]},{"group":"Deploy in Kubernetes with CockroachDB Operator","pages":[{"title":"CockroachDB Operator Overview","sidebarTitle":"Overview","href":"/docs/v26.1/cockroachdb-operator-overview"},{"title":"Deploy CockroachDB with the CockroachDB Operator","sidebarTitle":"CockroachDB Operator Deployment Guide","href":"/docs/v26.1/deploy-cockroachdb-with-cockroachdb-operator"},{"group":"Migrate from Other Kubernetes Deployments","pages":[{"title":"Migrate from Helm StatefulSet","href":"/docs/v26.1/migrate-cockroachdb-kubernetes-helm"},{"title":"Migrate from the Public Operator","sidebarTitle":"Migrate from Public operator","href":"/docs/v26.1/migrate-cockroachdb-kubernetes-operator"}]},{"group":"Operate CockroachDB with Kubernetes","pages":[{"title":"Pod Scheduling with the CockroachDB Operator","sidebarTitle":"Pod Scheduling","href":"/docs/v26.1/schedule-cockroachdb-operator"},{"title":"Resource Management with the CockroachDB Operator","sidebarTitle":"Resource Management","href":"/docs/v26.1/configure-cockroachdb-operator"},{"title":"Certificate Management with the CockroachDB Operator","sidebarTitle":"Certificate Management","href":"/docs/v26.1/secure-cockroachdb-operator"},{"title":"Cluster Scaling with the CockroachDB Operator","sidebarTitle":"Cluster Scaling","href":"/docs/v26.1/scale-cockroachdb-operator"},{"title":"Cluster Monitoring with the CockroachDB Operator","sidebarTitle":"Cluster Monitoring","href":"/docs/v26.1/monitor-cockroachdb-operator"},{"title":"Upgrade a cluster in Kubernetes with the CockroachDB Operator","sidebarTitle":"Cluster Upgrades","href":"/docs/v26.1/upgrade-cockroachdb-operator"},{"title":"Override Deployment Templates with the CockroachDB Operator","sidebarTitle":"Override Templates","href":"/docs/v26.1/override-templates-cockroachdb-operator"},{"title":"Performance with the CockroachDB Operator","sidebarTitle":"Kubernetes Performance","href":"/docs/v26.1/cockroachdb-operator-performance"}]}]},{"group":"Deploy on Kubernetes with Legacy Technologies","pages":[{"title":"Kubernetes Overview","sidebarTitle":"Overview","href":"/docs/v26.1/kubernetes-overview"},{"title":"Legacy Kubernetes Deployment Deprecation Notice","sidebarTitle":"Legacy Kubernetes Deployment Deprecation Notice","href":"/docs/v26.1/kubernetes-deprecation-notice"},{"title":"Deploy CockroachDB in a Single Kubernetes Cluster","href":"/docs/v26.1/deploy-cockroachdb-with-kubernetes"},{"title":"Deploy CockroachDB in a Single Kubernetes Cluster (Insecure)","href":"/docs/v26.1/deploy-cockroachdb-with-kubernetes-insecure"},{"title":"Deploy CockroachDB on Red Hat OpenShift","sidebarTitle":"OpenShift Deployment","href":"/docs/v26.1/deploy-cockroachdb-with-kubernetes-openshift"},{"title":"Orchestrate CockroachDB Across Multiple Kubernetes Clusters","sidebarTitle":"Multi-Cluster Deployment","href":"/docs/v26.1/orchestrate-cockroachdb-with-kubernetes-multi-cluster"},{"group":"Operate on Kubernetes","pages":[{"title":"Pod Scheduling","href":"/docs/v26.1/schedule-cockroachdb-kubernetes"},{"title":"Resource Management","href":"/docs/v26.1/configure-cockroachdb-kubernetes"},{"title":"Certificate Management","href":"/docs/v26.1/secure-cockroachdb-kubernetes"},{"title":"Cluster Scaling","href":"/docs/v26.1/scale-cockroachdb-kubernetes"},{"title":"Cluster Monitoring","href":"/docs/v26.1/monitor-cockroachdb-kubernetes"},{"title":"Upgrade a cluster in Kubernetes","sidebarTitle":"Cluster Upgrades","href":"/docs/v26.1/upgrade-cockroachdb-kubernetes"},{"title":"CockroachDB Performance on Kubernetes","sidebarTitle":"Kubernetes Performance","href":"/docs/v26.1/kubernetes-performance"}]}]},{"group":"Multi-Region for Self-Hosted Deployments","pages":[{"title":"Topology Patterns Overview","href":"/docs/v26.1/topology-patterns"},{"title":"Basic Production Topology","href":"/docs/v26.1/topology-basic-production"},{"title":"Follower Reads Topology","href":"/docs/v26.1/topology-follower-reads"},{"title":"Follow-the-Workload Topology","href":"/docs/v26.1/topology-follow-the-workload"},{"title":"Regional Tables","href":"/docs/v26.1/regional-tables"},{"title":"Global Tables","href":"/docs/v26.1/global-tables"}]},{"group":"Security","pages":[{"group":"Certificates","pages":[{"title":"Use the CockroachDB CLI to provision a development cluster","href":"/docs/v26.1/manage-certs-cli"},{"title":"Manage PKI certificates with HashiCorp Vault","href":"/docs/v26.1/manage-certs-vault"},{"title":"Create Security Certificates using OpenSSL","href":"/docs/v26.1/create-security-certificates-openssl"},{"title":"Advanced Public Key Infrastructure (PKI) Certificate Scenarios","href":"/docs/v26.1/create-security-certificates-custom-ca"},{"title":"Using Online Certificate Status Protocol (OCSP) with CockroachDB","sidebarTitle":"Use Online Certificate Status Protocol (OCSP)","href":"/docs/v26.1/manage-certs-revoke-ocsp"},{"title":"Certificate-based authentication using multiple values from the X.509 Subject field","sidebarTitle":"Certificate-based authentication using multiple values from the X.509 SUBJECT field","href":"/docs/v26.1/certificate-based-authentication-using-the-x509-subject-field"}]},{"title":"Authenticate to CockroachDB Self-Hosted Clusters","sidebarTitle":"Authentication","href":"/docs/v26.1/authentication"},{"title":"Manage Encryption for CockroachDB Self-Hosted Clusters","sidebarTitle":"Encryption","href":"/docs/v26.1/encryption"},{"title":"Manage Cluster User Authorization","sidebarTitle":"Authorization","href":"/docs/v26.1/authorization"},{"title":"Table-based SQL Audit Logging","href":"/docs/v26.1/sql-audit-logging"},{"title":"Role-based SQL Audit Logging","href":"/docs/v26.1/role-based-audit-logging"},{"title":"Configure LDAP Authentication","sidebarTitle":"LDAP Authentication","href":"/docs/v26.1/ldap-authentication"},{"title":"Configure LDAP Authorization","sidebarTitle":"LDAP Authorization","href":"/docs/v26.1/ldap-authorization"},{"title":"GSSAPI Authentication (Enterprise)","sidebarTitle":"GSSAPI Authentication","href":"/docs/v26.1/gssapi_authentication"},{"title":"Cluster Single Sign-on (SSO) using JSON Web Tokens (JWTs)","sidebarTitle":"Cluster SSO using JWT","href":"/docs/v26.1/sso-sql"},{"title":"Configure JWT Authorization","sidebarTitle":"JWT Authorization","href":"/docs/v26.1/jwt-authorization"},{"title":"Single Sign-on (SSO) for DB Console","sidebarTitle":"DB Console SSO","href":"/docs/v26.1/sso-db-console"},{"title":"Configure OIDC Authorization for DB Console","sidebarTitle":"OIDC Authorization","href":"/docs/v26.1/oidc-authorization"},{"title":"Rotate Security Certificates","href":"/docs/v26.1/rotate-certificates"},{"title":"Use HashiCorp Vault's Dynamic Secrets","sidebarTitle":"Use Hashicorp Vault's Dynamic Secrets","href":"/docs/v26.1/vault-db-secrets-tutorial"}]},{"group":"Monitoring and Alerting","pages":[{"title":"Monitoring and Alerting","sidebarTitle":"Overview","href":"/docs/v26.1/monitoring-and-alerting"},{"title":"Common Issues to Monitor","href":"/docs/v26.1/common-issues-to-monitor"},{"title":"Enable the Node Map","href":"/docs/v26.1/enable-node-map"},{"title":"Prometheus Endpoint","href":"/docs/v26.1/prometheus-endpoint"},{"title":"Monitor CockroachDB with Prometheus","sidebarTitle":"Use Prometheus and Alertmanager","href":"/docs/v26.1/monitor-cockroachdb-with-prometheus"},{"title":"Essential Metrics for CockroachDB Self-Hosted Deployments","sidebarTitle":"Essential Metrics for CockroachDB self-hosted Deployments","href":"/docs/v26.1/essential-metrics-self-hosted"},{"title":"Essential Alerts for CockroachDB Self-Hosted Deployments","sidebarTitle":"Essential Alerts for CockroachDB self-hosted Deployments","href":"/docs/v26.1/essential-alerts-self-hosted"}]},{"group":"Administration","pages":[{"title":"DB Console Overview","href":"/docs/v26.1/ui-overview"},{"title":"Cluster Overview Page","href":"/docs/v26.1/ui-cluster-overview-page"},{"group":"Metrics Dashboards","pages":[{"title":"Overview Dashboard","sidebarTitle":"Overview","href":"/docs/v26.1/ui-overview-dashboard"},{"title":"Hardware Dashboard","sidebarTitle":"Hardware","href":"/docs/v26.1/ui-hardware-dashboard"},{"title":"Runtime Dashboard","sidebarTitle":"Runtime","href":"/docs/v26.1/ui-runtime-dashboard"},{"title":"Networking Dashboard","sidebarTitle":"Networking","href":"/docs/v26.1/ui-networking-dashboard"},{"title":"SQL Dashboard","sidebarTitle":"SQL","href":"/docs/v26.1/ui-sql-dashboard"},{"title":"Storage Dashboard","sidebarTitle":"Storage","href":"/docs/v26.1/ui-storage-dashboard"},{"title":"Replication Dashboard","sidebarTitle":"Replication","href":"/docs/v26.1/ui-replication-dashboard"},{"title":"Distributed Dashboard","sidebarTitle":"Distributed","href":"/docs/v26.1/ui-distributed-dashboard"},{"title":"Queues Dashboard","sidebarTitle":"Queues","href":"/docs/v26.1/ui-queues-dashboard"},{"title":"Slow Requests Dashboard","sidebarTitle":"Slow Requests","href":"/docs/v26.1/ui-slow-requests-dashboard"},{"title":"Changefeeds Dashboard","sidebarTitle":"Changefeeds","href":"/docs/v26.1/ui-cdc-dashboard"},{"title":"Overload Dashboard","sidebarTitle":"Overload","href":"/docs/v26.1/ui-overload-dashboard"},{"title":"TTL Dashboard","sidebarTitle":"TTL","href":"/docs/v26.1/ui-ttl-dashboard"},{"title":"Physical Cluster Replication Dashboard","sidebarTitle":"Physical Cluster Replication","href":"/docs/v26.1/ui-physical-cluster-replication-dashboard"},{"title":"Logical Data Replication Dashboard","sidebarTitle":"Logical Data Replication","href":"/docs/v26.1/ui-logical-data-replication-dashboard"},{"title":"Custom Chart Debug Page","href":"/docs/v26.1/ui-custom-chart-debug-page"}]},{"title":"Databases Page","href":"/docs/v26.1/ui-databases-page"},{"title":"Sessions Page","href":"/docs/v26.1/ui-sessions-page"},{"title":"Statements Page","href":"/docs/v26.1/ui-statements-page"},{"title":"Transactions Page","href":"/docs/v26.1/ui-transactions-page"},{"title":"Insights Page","href":"/docs/v26.1/ui-insights-page"},{"title":"Network Page","href":"/docs/v26.1/ui-network-latency-page"},{"title":"Top Ranges Page","href":"/docs/v26.1/ui-top-ranges-page"},{"title":"Jobs Page","href":"/docs/v26.1/ui-jobs-page"},{"title":"Schedules Page","href":"/docs/v26.1/ui-schedules-page"},{"title":"Advanced Debug Page","href":"/docs/v26.1/ui-debug-pages"},{"title":"Key Visualizer","href":"/docs/v26.1/ui-key-visualizer"},{"title":"WAL Failover","href":"/docs/v26.1/wal-failover"}]},{"group":"Backups and Restores","pages":[{"title":"Backup and Restore Overview","sidebarTitle":"Overview","href":"/docs/v26.1/backup-and-restore-overview"},{"title":"Take Full and Incremental Backups","sidebarTitle":"Full and Incremental Backups","href":"/docs/v26.1/take-full-and-incremental-backups"},{"title":"Take Backups with Revision History and Restore from a Point-in-time","sidebarTitle":"Backups with Revision History and Point-in-time Restore","href":"/docs/v26.1/take-backups-with-revision-history-and-restore-from-a-point-in-time"},{"title":"Take and Restore Encrypted Backups","sidebarTitle":"Encrypted Backup and Restore","href":"/docs/v26.1/take-and-restore-encrypted-backups"},{"title":"Take Locality-restricted Backups","sidebarTitle":"Locality-restricted Backup Execution","href":"/docs/v26.1/take-locality-restricted-backups"},{"title":"Take and Restore Locality-aware Backups","sidebarTitle":"Locality-aware Backup and Restore","href":"/docs/v26.1/take-and-restore-locality-aware-backups"},{"title":"Manage a Backup Schedule","sidebarTitle":"Scheduled Backups","href":"/docs/v26.1/manage-a-backup-schedule"},{"title":"Backup Validation","href":"/docs/v26.1/backup-validation"},{"title":"Expire Past Backups","href":"/docs/v26.1/expire-past-backups"},{"title":"Backup and Restore Monitoring","href":"/docs/v26.1/backup-and-restore-monitoring"}]},{"group":"File Storage","pages":[{"title":"Use Cloud Storage","sidebarTitle":"Cloud Storage","href":"/docs/v26.1/use-cloud-storage"},{"title":"Cloud Storage Authentication","href":"/docs/v26.1/cloud-storage-authentication"},{"title":"Use Userfile Storage","sidebarTitle":"Userfile Storage","href":"/docs/v26.1/use-userfile-storage"},{"title":"Use a Local File Server","sidebarTitle":"Local File Server","href":"/docs/v26.1/use-a-local-file-server"}]},{"group":"Cluster Maintenance","pages":[{"title":"Upgrade CockroachDB self-hosted","sidebarTitle":"Upgrade CockroachDB","href":"/docs/v26.1/upgrade-cockroach-version"},{"title":"Disaster Recovery Planning","href":"/docs/v26.1/disaster-recovery-planning"},{"title":"Restoring Backups Across Versions","href":"/docs/v26.1/restoring-backups-across-versions"},{"title":"Manage Long-Running Queries","href":"/docs/v26.1/manage-long-running-queries"},{"title":"Node Shutdown","href":"/docs/v26.1/node-shutdown"}]},{"group":"Logs","pages":[{"title":"Logging Overview","sidebarTitle":"Overview","href":"/docs/v26.1/logging-overview"},{"title":"Configure Logs","href":"/docs/v26.1/configure-logs"},{"title":"Logging Use Cases","href":"/docs/v26.1/logging-use-cases"},{"title":"Log SQL Activity to Datadog","href":"/docs/v26.1/log-sql-activity-to-datadog"},{"title":"Logging Best Practices","href":"/docs/v26.1/logging-best-practices"},{"title":"Critical Log Messages","href":"/docs/v26.1/critical-log-messages"}]},{"title":"Cluster API v2.0","sidebarTitle":"Cluster API","href":"/docs/v26.1/cluster-api"}]},{"group":"Schema Design","pages":[{"title":"Database Schemas","href":"/docs/v26.1/schema-design-overview"},{"title":"Computed Columns","href":"/docs/v26.1/computed-columns"},{"title":"Column Families","href":"/docs/v26.1/column-families"},{"title":"Scale to Multiple Regions","href":"/docs/v26.1/multiregion-scale-application"},{"group":"Indexes","pages":[{"title":"Secondary Indexes","href":"/docs/v26.1/schema-design-indexes"},{"title":"Index a Subset of Rows with Partial Indexes","sidebarTitle":"Partial Indexes","href":"/docs/v26.1/partial-indexes"},{"title":"Index Sequential Keys with Hash-sharded Indexes","sidebarTitle":"Hash-sharded Indexes","href":"/docs/v26.1/hash-sharded-indexes"},{"title":"Generalized Inverted Indexes","href":"/docs/v26.1/inverted-indexes"},{"title":"Full-Text Search","href":"/docs/v26.1/full-text-search"},{"title":"Trigram Indexes","href":"/docs/v26.1/trigram-indexes"},{"title":"Expression Indexes","href":"/docs/v26.1/expression-indexes"},{"title":"Spatial Indexes","href":"/docs/v26.1/spatial-indexes"},{"title":"Vector Indexes","href":"/docs/v26.1/vector-indexes"}]},{"group":"Update a Database Schema","pages":[{"title":"Online Schema Changes","href":"/docs/v26.1/online-schema-changes"},{"title":"Migrate CockroachDB Schemas with Alembic","sidebarTitle":"Use Alembic","href":"/docs/v26.1/alembic"},{"title":"Migrate CockroachDB Schemas with Flyway","sidebarTitle":"Use Flyway","href":"/docs/v26.1/flyway"},{"title":"Migrate CockroachDB Schemas with Liquibase","sidebarTitle":"Use Liquibase","href":"/docs/v26.1/liquibase"}]}]},{"group":"Reads and Writes","pages":[{"title":"Reads and Writes in CockroachDB","sidebarTitle":"Overview","href":"/docs/v26.1/architecture/reads-and-writes-overview"},{"group":"Read Data","pages":[{"title":"Reusable Views","href":"/docs/v26.1/views"},{"title":"Subqueries","href":"/docs/v26.1/subqueries"},{"title":"Temporary Tables","href":"/docs/v26.1/temporary-tables"},{"title":"Paginate Results","href":"/docs/v26.1/pagination"},{"title":"Follower Reads","href":"/docs/v26.1/follower-reads"},{"title":"AS OF SYSTEM TIME","sidebarTitle":"AS OF SYSTEM TIME","href":"/docs/v26.1/as-of-system-time"},{"title":"Query Spatial Data","href":"/docs/v26.1/query-spatial-data"}]},{"group":"Write Data","pages":[{"title":"Bulk-update Data","href":"/docs/v26.1/bulk-update-data"},{"title":"Bulk-delete Data","href":"/docs/v26.1/bulk-delete-data"},{"title":"Batch Delete Expired Data with Row-Level TTL","href":"/docs/v26.1/row-level-ttl"}]},{"group":"Transactions","pages":[{"title":"Transactions","sidebarTitle":"Overview","href":"/docs/v26.1/transactions"},{"title":"Advanced Client-side Transaction Retries","href":"/docs/v26.1/advanced-client-side-transaction-retries"},{"title":"Life of a Distributed Transaction","href":"/docs/v26.1/architecture/life-of-a-distributed-transaction"},{"title":"Read Committed Transactions","href":"/docs/v26.1/read-committed"}]},{"title":"Test Your Application Locally","href":"/docs/v26.1/local-testing"},{"url":"https://www.cockroachlabs.com/docs/tutorials/sql-playground","title":"SQL Playground","href":"/links/tutorials/sql-playground"},{"group":"Database Management Tools","pages":[{"title":"Visualize CockroachDB Schemas with DBeaver","sidebarTitle":"DBeaver GUI","href":"/docs/v26.1/dbeaver"},{"title":"Use IntelliJ IDEA with CockroachDB","sidebarTitle":"IntelliJ IDEA","href":"/docs/v26.1/intellij-idea"}]}]},{"group":"Stream Data","pages":[{"title":"Change Data Capture Overview","href":"/docs/v26.1/change-data-capture-overview"},{"group":"Get Started with Changefeeds","pages":[{"title":"Create and Configure Changefeeds","href":"/docs/v26.1/create-and-configure-changefeeds"},{"title":"Changefeed Best Practices","href":"/docs/v26.1/changefeed-best-practices"},{"group":"Changefeed Messages","pages":[{"title":"Changefeed Messages","sidebarTitle":"Overview","href":"/docs/v26.1/changefeed-messages"},{"title":"Changefeed Message Envelope","sidebarTitle":"Message Envelope","href":"/docs/v26.1/changefeed-message-envelopes"}]},{"title":"Changefeed Sinks","href":"/docs/v26.1/changefeed-sinks"},{"title":"Changefeed Examples","href":"/docs/v26.1/changefeed-examples"}]},{"group":"Monitor Changefeeds","pages":[{"title":"Monitor and Debug Changefeeds","sidebarTitle":"Overview","href":"/docs/v26.1/monitor-and-debug-changefeeds"},{"title":"Changefeed Monitoring Guide","sidebarTitle":"Monitoring Guide","href":"/docs/v26.1/changefeed-monitoring-guide"},{"title":"Protect Changefeed Data from Garbage Collection","sidebarTitle":"Protect Changefeed Data","href":"/docs/v26.1/protect-changefeed-data"}]},{"group":"Optimize Changefeeds","pages":[{"title":"Change Data Capture Queries","href":"/docs/v26.1/cdc-queries"},{"title":"Changefeeds on Tables with Column Families","href":"/docs/v26.1/changefeeds-on-tables-with-column-families"},{"title":"Export Data with Changefeeds","href":"/docs/v26.1/export-data-with-changefeeds"},{"title":"Changefeeds in Multi-Region Deployments","href":"/docs/v26.1/changefeeds-in-multi-region-deployments"}]},{"group":"Changefeed Tutorials","pages":[{"group":"Stream a Changefeed to an Amazon MSK Cluster","pages":[{"title":"Stream a Changefeed to Amazon MSK","sidebarTitle":"Amazon MSK","href":"/docs/v26.1/stream-a-changefeed-to-amazon-msk"},{"title":"Stream a Changefeed to Amazon MSK Serverless","sidebarTitle":"Amazon MSK Serverless","href":"/docs/v26.1/stream-a-changefeed-to-amazon-msk-serverless"}]},{"title":"Connect to a Changefeed Kafka Sink with OAuth Using Okta","href":"/docs/v26.1/connect-to-a-changefeed-kafka-sink-with-oauth-using-okta"},{"title":"Stream a Changefeed to a Confluent Cloud Kafka Cluster","href":"/docs/v26.1/stream-a-changefeed-to-a-confluent-cloud-kafka-cluster"}]},{"group":"Technical Overview","pages":[{"title":"How Does a Changefeed Work?","href":"/docs/v26.1/how-does-a-changefeed-work"}]},{"title":"Advanced Changefeed Configuration","href":"/docs/v26.1/advanced-changefeed-configuration"}]},{"group":"Cross-Cluster Replication","pages":[{"group":"Logical Data Replication","pages":[{"title":"Logical Data Replication","sidebarTitle":"Overview","href":"/docs/v26.1/logical-data-replication-overview"},{"title":"Set Up Logical Data Replication","href":"/docs/v26.1/set-up-logical-data-replication"},{"title":"Manage Logical Data Replication","href":"/docs/v26.1/manage-logical-data-replication"},{"title":"Logical Data Replication Monitoring","sidebarTitle":"Monitor Logical Data Replication","href":"/docs/v26.1/logical-data-replication-monitoring"}]},{"group":"Physical Cluster Replication","pages":[{"title":"Physical Cluster Replication","sidebarTitle":"Overview","href":"/docs/v26.1/physical-cluster-replication-overview"},{"title":"Set Up Physical Cluster Replication","href":"/docs/v26.1/set-up-physical-cluster-replication"},{"title":"Upgrade a Cluster Running PCR","href":"/docs/v26.1/upgrade-with-pcr"},{"title":"Fail Over from a Primary Cluster to a Standby Cluster","sidebarTitle":"Fail Over from a Primary to a Standby Cluster","href":"/docs/v26.1/failover-replication"},{"title":"Physical Cluster Replication Monitoring","sidebarTitle":"Monitor a Replication Stream","href":"/docs/v26.1/physical-cluster-replication-monitoring"},{"title":"Read from Standby","sidebarTitle":"Read From Standby","href":"/docs/v26.1/read-from-standby"},{"title":"Physical Cluster Replication Technical Overview","sidebarTitle":"Technical Overview","href":"/docs/v26.1/physical-cluster-replication-technical-overview"},{"group":"Cluster Virtualization","pages":[{"title":"Cluster Virtualization Overview","sidebarTitle":"Overview","href":"/docs/v26.1/cluster-virtualization-overview"},{"title":"Work with virtual clusters","sidebarTitle":"Work with Virtual Clusters","href":"/docs/v26.1/work-with-virtual-clusters"},{"title":"Cluster Setting Scopes with Cluster Virtualization enabled","sidebarTitle":"Setting Scopes","href":"/docs/v26.1/cluster-virtualization-setting-scopes"},{"title":"Cluster Metric Scopes with Cluster Virtualization enabled","sidebarTitle":"Metric Scopes","href":"/docs/v26.1/cluster-virtualization-metric-scopes"}]}]}]},{"group":"Multi-Region Capabilities","pages":[{"title":"Multi-Region Capabilities Overview","sidebarTitle":"Overview","href":"/docs/v26.1/multiregion-overview"},{"title":"Multi-Region Survival Goals","sidebarTitle":"Survival Goals","href":"/docs/v26.1/multiregion-survival-goals"},{"group":"Data Domiciling and Performance","pages":[{"title":"Table Localities","href":"/docs/v26.1/table-localities"},{"title":"Table Partitioning","href":"/docs/v26.1/partitioning"},{"title":"Data Domiciling with CockroachDB","sidebarTitle":"Data Domiciling with CockroachDB Tutorial","href":"/docs/v26.1/data-domiciling"}]},{"title":"How to Choose a Multi-Region Configuration","href":"/docs/v26.1/choosing-a-multi-region-configuration"},{"title":"Multi-Region Zone Config Extensions","href":"/docs/v26.1/zone-config-extensions"}]},{"group":"Optimize Performance","pages":[{"title":"Optimize Statement Performance Overview","sidebarTitle":"Overview","href":"/docs/v26.1/make-queries-fast"},{"title":"SQL Performance Best Practices","href":"/docs/v26.1/performance-best-practices-overview"},{"title":"Indexes","href":"/docs/v26.1/indexes"},{"title":"Map SQL Activity using an Application Name","href":"/docs/v26.1/map-sql-activity-to-app"},{"title":"Cost-Based Optimizer","href":"/docs/v26.1/cost-based-optimizer"},{"title":"Vectorized Query Execution","sidebarTitle":"Vectorized Execution Engine","href":"/docs/v26.1/vectorized-execution"},{"title":"Load-Based Splitting","href":"/docs/v26.1/load-based-splitting"},{"title":"Replication Controls","href":"/docs/v26.1/configure-replication-zones"},{"title":"Admission Control","href":"/docs/v26.1/admission-control"},{"title":"Monitor and Analyze Transaction Contention","href":"/docs/v26.1/monitor-and-analyze-transaction-contention"},{"title":"Performance Tuning Recipes","href":"/docs/v26.1/performance-recipes"},{"group":"Performance Tuning Tutorials","pages":[{"title":"Statement Tuning with EXPLAIN","sidebarTitle":"Statement Tuning with EXPLAIN","href":"/docs/v26.1/sql-tuning-with-explain"},{"title":"Apply SQL Statement Performance Rules","href":"/docs/v26.1/apply-statement-performance-rules"},{"title":"Troubleshoot Lock Contention","href":"/docs/v26.1/troubleshoot-lock-contention"}]}]},{"group":"Integrate","pages":[{"group":"Ory","pages":[{"title":"Ory Overview","href":"/docs/v26.1/ory-overview"},{"title":"Integrate CockroachDB with Ory","sidebarTitle":"Integrate with Ory","href":"/docs/v26.1/ory-integration-guide"}]},{"title":"Integrate CockroachDB with Satori","sidebarTitle":"Integrate with Satori","href":"/docs/v26.1/satori-integration"}]}]},{"tab":"Migrate","icon":"arrow-right-arrow-left","pages":[{"title":"Migrate","href":"/docs/molt/migration-overview"}]},{"tab":"SQL","icon":"code","pages":[{"title":"SQL","href":"/docs/v26.1/sql-statements"}]},{"tab":"Reference","icon":"book","pages":[{"title":"Reference","href":"/docs/v26.1/architecture/glossary"}]},{"tab":"Cluster API","icon":"rocket","pages":[{"title":"Cluster API","href":"/docs/api/cluster"}]},{"tab":"Troubleshoot","icon":"bug","pages":[{"title":"Troubleshoot","href":"/docs/v26.1/troubleshooting-overview"}]}]},{"version":"v25.4","tag":"LTS","pages":[{"title":"v25.4","href":"/docs/v25.4/connection-pooling"}]},{"version":"v25.3","tag":"Unsupported","pages":[{"title":"v25.3","href":"/docs/v25.3/connection-pooling"}]},{"version":"v25.2","tag":"LTS","pages":[{"title":"v25.2","href":"/docs/v25.2/connection-pooling"}]},{"version":"v25.1","tag":"Unsupported","pages":[{"title":"v25.1","href":"/docs/v25.1/connection-pooling"}]},{"version":"v24.3","tag":"LTS","pages":[{"title":"v24.3","href":"/docs/v24.3/connection-pooling"}]},{"version":"v24.1","tag":"LTS","pages":[{"title":"v24.1","href":"/docs/v24.1/connection-pooling"}]},{"version":"v23.2","tag":"LTS","pages":[{"title":"v23.2","href":"/docs/v23.2/connection-pooling"}]},{"version":"v23.1","tag":"Unsupported","pages":[{"title":"v23.1","href":"/docs/v23.1/connection-pooling"}]}]},{"product":"Cloud Deployments","icon":"cloud","description":"Fully managed CockroachDB","pages":[{"title":"Cloud Deployments","href":"/docs/cockroachcloud"}]},{"product":"Releases","icon":"list","description":"Version history, support policy \u0026 advisories","pages":[{"title":"Releases","href":"/docs/releases"}]}]},"basePath":"","title":"Connection Pooling - CockroachDB","buildId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","deploymentId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","dynamics":[],"chunks":[]}