blob: d47d05b1e3fed52185fa7014ed3edf3fd53af735 [file] [log] [blame]
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Java Driver for Apache Cassandra® Documentation">
<link rel="canonical" href="https://apache.github.io/cassandra-java-driver/core/performance/">
<link rel="prev" href="../tracing/">
<link rel="next" href="../metadata/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.17">
<title>Performance - Java Driver for Apache Cassandra</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.7e37652d.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="blue">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#performance" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="Java Driver for Apache Cassandra" class="md-header__button md-logo" aria-label="Java Driver for Apache Cassandra" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Java Driver for Apache Cassandra
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Performance
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="blue" aria-hidden="true" type="radio" name="__palette" id="__palette_0">
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/apache/cassandra-java-driver" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
apache/cassandra-java-driver
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../HOME-README/" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../.." class="md-tabs__link">
Manual
</a>
</li>
<li class="md-tabs__item">
<a href="../../api/" class="md-tabs__link">
API References
</a>
</li>
<li class="md-tabs__item">
<a href="../../faq-README/" class="md-tabs__link">
FAQ
</a>
</li>
<li class="md-tabs__item">
<a href="../../changelog-README/" class="md-tabs__link">
Changelog
</a>
</li>
<li class="md-tabs__item">
<a href="../../upgrade-README/" class="md-tabs__link">
Upgrade Guide
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="Java Driver for Apache Cassandra" class="md-nav__button md-logo" aria-label="Java Driver for Apache Cassandra" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
Java Driver for Apache Cassandra
</label>
<div class="md-nav__source">
<a href="https://github.com/apache/cassandra-java-driver" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
apache/cassandra-java-driver
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../HOME-README/" class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-ellipsis">
Manual
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Manual
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../api_conventions/" class="md-nav__link">
<span class="md-ellipsis">
API Conventions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../case_sensitivity/" class="md-nav__link">
<span class="md-ellipsis">
Case Sensitivity
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../cloud/" class="md-nav__link">
<span class="md-ellipsis">
Cloud
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5" checked>
<label class="md-nav__link" for="__nav_2_5" id="__nav_2_5_label" tabindex="">
<span class="md-ellipsis">
Core
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_5_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_2_5">
<span class="md-nav__icon md-icon"></span>
Core
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../integration/" class="md-nav__link">
<span class="md-ellipsis">
Integration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../configuration/" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../authentication/" class="md-nav__link">
<span class="md-ellipsis">
Authentication
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ssl/" class="md-nav__link">
<span class="md-ellipsis">
SSL
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../load_balancing/" class="md-nav__link">
<span class="md-ellipsis">
Load Balancing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../pooling/" class="md-nav__link">
<span class="md-ellipsis">
Pooling
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../reconnection/" class="md-nav__link">
<span class="md-ellipsis">
Reconnection
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../retries/" class="md-nav__link">
<span class="md-ellipsis">
Retries
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../speculative_execution/" class="md-nav__link">
<span class="md-ellipsis">
Speculative Execution
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../metrics/" class="md-nav__link">
<span class="md-ellipsis">
Metrics
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../logging/" class="md-nav__link">
<span class="md-ellipsis">
Logging
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_13" >
<label class="md-nav__link" for="__nav_2_5_13" id="__nav_2_5_13_label" tabindex="0">
<span class="md-ellipsis">
Statements
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_5_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5_13">
<span class="md-nav__icon md-icon"></span>
Statements
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../statements/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../statements/batch/" class="md-nav__link">
<span class="md-ellipsis">
Batch
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../statements/per_query_keyspace/" class="md-nav__link">
<span class="md-ellipsis">
Per Query Keyspace
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../statements/prepared/" class="md-nav__link">
<span class="md-ellipsis">
Prepared
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../statements/simple/" class="md-nav__link">
<span class="md-ellipsis">
Simple
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../paging/" class="md-nav__link">
<span class="md-ellipsis">
Paging
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../async/" class="md-nav__link">
<span class="md-ellipsis">
Async Programming
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../reactive/" class="md-nav__link">
<span class="md-ellipsis">
Reactive Streams
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../custom_codecs/" class="md-nav__link">
<span class="md-ellipsis">
Custom Codecs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../temporal_types/" class="md-nav__link">
<span class="md-ellipsis">
Temporal Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../tuples/" class="md-nav__link">
<span class="md-ellipsis">
Tuples
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../udts/" class="md-nav__link">
<span class="md-ellipsis">
UDTs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../compression/" class="md-nav__link">
<span class="md-ellipsis">
Compression
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../address_resolution/" class="md-nav__link">
<span class="md-ellipsis">
Address Resolution
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../request_tracker/" class="md-nav__link">
<span class="md-ellipsis">
Request Tracker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../throttling/" class="md-nav__link">
<span class="md-ellipsis">
Throttling
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../tracing/" class="md-nav__link">
<span class="md-ellipsis">
Tracing
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Performance
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Performance
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#performance" class="md-nav__link">
<span class="md-ellipsis">
Performance
</span>
</a>
<nav class="md-nav" aria-label="Performance">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#statements" class="md-nav__link">
<span class="md-ellipsis">
Statements
</span>
</a>
<nav class="md-nav" aria-label="Statements">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#immutability-and-builders" class="md-nav__link">
<span class="md-ellipsis">
Immutability and builders
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#prepared-statements" class="md-nav__link">
<span class="md-ellipsis">
Prepared statements
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#request-execution" class="md-nav__link">
<span class="md-ellipsis">
Request execution
</span>
</a>
<nav class="md-nav" aria-label="Request execution">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#connection-pooling" class="md-nav__link">
<span class="md-ellipsis">
Connection pooling
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#compression" class="md-nav__link">
<span class="md-ellipsis">
Compression
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#timestamp-generation" class="md-nav__link">
<span class="md-ellipsis">
Timestamp generation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#tracing" class="md-nav__link">
<span class="md-ellipsis">
Tracing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#request-trackers" class="md-nav__link">
<span class="md-ellipsis">
Request trackers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#metrics" class="md-nav__link">
<span class="md-ellipsis">
Metrics
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#throttling" class="md-nav__link">
<span class="md-ellipsis">
Throttling
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#caching-reusable-objects" class="md-nav__link">
<span class="md-ellipsis">
Caching reusable objects
</span>
</a>
<nav class="md-nav" aria-label="Caching reusable objects">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#identifiers" class="md-nav__link">
<span class="md-ellipsis">
Identifiers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#type-tokens" class="md-nav__link">
<span class="md-ellipsis">
Type tokens
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#built-queries" class="md-nav__link">
<span class="md-ellipsis">
Built queries
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#derived-configuration-profiles" class="md-nav__link">
<span class="md-ellipsis">
Derived configuration profiles
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#metadata" class="md-nav__link">
<span class="md-ellipsis">
Metadata
</span>
</a>
<nav class="md-nav" aria-label="Metadata">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#filtering" class="md-nav__link">
<span class="md-ellipsis">
Filtering
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#debouncing" class="md-nav__link">
<span class="md-ellipsis">
Debouncing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#schema-updates" class="md-nav__link">
<span class="md-ellipsis">
Schema updates
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#thread-pooling" class="md-nav__link">
<span class="md-ellipsis">
Thread pooling
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_27" >
<label class="md-nav__link" for="__nav_2_5_27" id="__nav_2_5_27_label" tabindex="0">
<span class="md-ellipsis">
Metadata
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_5_27_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5_27">
<span class="md-nav__icon md-icon"></span>
Metadata
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../metadata/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../metadata/node/" class="md-nav__link">
<span class="md-ellipsis">
Node
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../metadata/schema/" class="md-nav__link">
<span class="md-ellipsis">
Schema
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../metadata/token/" class="md-nav__link">
<span class="md-ellipsis">
Token
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../control_connection/" class="md-nav__link">
<span class="md-ellipsis">
Control Connection
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../native_protocol/" class="md-nav__link">
<span class="md-ellipsis">
Native Protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../non_blocking/" class="md-nav__link">
<span class="md-ellipsis">
Non-blocking
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../query_timestamps/" class="md-nav__link">
<span class="md-ellipsis">
Query Timestamps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../idempotence/" class="md-nav__link">
<span class="md-ellipsis">
Idempotence
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../detachable_types/" class="md-nav__link">
<span class="md-ellipsis">
Detachable Types
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_34" >
<label class="md-nav__link" for="__nav_2_5_34" id="__nav_2_5_34_label" tabindex="0">
<span class="md-ellipsis">
DSE
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_5_34_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5_34">
<span class="md-nav__icon md-icon"></span>
DSE
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../dse/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dse/geotypes/" class="md-nav__link">
<span class="md-ellipsis">
Geotypes
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_34_3" >
<label class="md-nav__link" for="__nav_2_5_34_3" id="__nav_2_5_34_3_label" tabindex="0">
<span class="md-ellipsis">
Graph
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="4" aria-labelledby="__nav_2_5_34_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5_34_3">
<span class="md-nav__icon md-icon"></span>
Graph
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../dse/graph/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_34_3_2" >
<label class="md-nav__link" for="__nav_2_5_34_3_2" id="__nav_2_5_34_3_2_label" tabindex="0">
<span class="md-ellipsis">
Fluent
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="5" aria-labelledby="__nav_2_5_34_3_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5_34_3_2">
<span class="md-nav__icon md-icon"></span>
Fluent
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../dse/graph/fluent/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dse/graph/fluent/explicit/" class="md-nav__link">
<span class="md-ellipsis">
Explicit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dse/graph/fluent/implicit/" class="md-nav__link">
<span class="md-ellipsis">
Implicit
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../dse/graph/options/" class="md-nav__link">
<span class="md-ellipsis">
Options
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dse/graph/results/" class="md-nav__link">
<span class="md-ellipsis">
Results
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dse/graph/script/" class="md-nav__link">
<span class="md-ellipsis">
Script
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../graalvm/" class="md-nav__link">
<span class="md-ellipsis">
GraalVM
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../shaded_jar/" class="md-nav__link">
<span class="md-ellipsis">
Shaded JAR
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../bom/" class="md-nav__link">
<span class="md-ellipsis">
BOM
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_6" >
<label class="md-nav__link" for="__nav_2_6" id="__nav_2_6_label" tabindex="">
<span class="md-ellipsis">
Query Builder
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_6">
<span class="md-nav__icon md-icon"></span>
Query Builder
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../query_builder/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/select/" class="md-nav__link">
<span class="md-ellipsis">
Select
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/insert/" class="md-nav__link">
<span class="md-ellipsis">
Insert
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/update/" class="md-nav__link">
<span class="md-ellipsis">
Update
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/delete/" class="md-nav__link">
<span class="md-ellipsis">
Delete
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_6_6" >
<label class="md-nav__link" for="__nav_2_6_6" id="__nav_2_6_6_label" tabindex="0">
<span class="md-ellipsis">
Schema
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_6_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_6_6">
<span class="md-nav__icon md-icon"></span>
Schema
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../query_builder/schema/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/schema/aggregate/" class="md-nav__link">
<span class="md-ellipsis">
Aggregate
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/schema/function/" class="md-nav__link">
<span class="md-ellipsis">
Function
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/schema/index/" class="md-nav__link">
<span class="md-ellipsis">
Index
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/schema/keyspace/" class="md-nav__link">
<span class="md-ellipsis">
Keyspace
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/schema/materialized_view/" class="md-nav__link">
<span class="md-ellipsis">
Materialized View
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/schema/table/" class="md-nav__link">
<span class="md-ellipsis">
Table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/schema/type/" class="md-nav__link">
<span class="md-ellipsis">
Type
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../query_builder/truncate/" class="md-nav__link">
<span class="md-ellipsis">
Truncate
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/condition/" class="md-nav__link">
<span class="md-ellipsis">
Condition
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/relation/" class="md-nav__link">
<span class="md-ellipsis">
Relation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/term/" class="md-nav__link">
<span class="md-ellipsis">
Term
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/idempotence/" class="md-nav__link">
<span class="md-ellipsis">
Idempotence
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_7" >
<label class="md-nav__link" for="__nav_2_7" id="__nav_2_7_label" tabindex="">
<span class="md-ellipsis">
Mapper
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_7">
<span class="md-nav__icon md-icon"></span>
Mapper
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../mapper/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/entities/" class="md-nav__link">
<span class="md-ellipsis">
Entities
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_7_3" >
<label class="md-nav__link" for="__nav_2_7_3" id="__nav_2_7_3_label" tabindex="0">
<span class="md-ellipsis">
DAOs
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_7_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_7_3">
<span class="md-nav__icon md-icon"></span>
DAOs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../mapper/daos/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/custom_types/" class="md-nav__link">
<span class="md-ellipsis">
Custom Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/delete/" class="md-nav__link">
<span class="md-ellipsis">
Delete
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/getentity/" class="md-nav__link">
<span class="md-ellipsis">
Get Entity
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/increment/" class="md-nav__link">
<span class="md-ellipsis">
Increment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/insert/" class="md-nav__link">
<span class="md-ellipsis">
Insert
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/null_saving/" class="md-nav__link">
<span class="md-ellipsis">
Null Saving
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/query/" class="md-nav__link">
<span class="md-ellipsis">
Query
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/queryprovider/" class="md-nav__link">
<span class="md-ellipsis">
Query Provider
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/select/" class="md-nav__link">
<span class="md-ellipsis">
Select
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/setentity/" class="md-nav__link">
<span class="md-ellipsis">
Set Entity
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/statement_attributes/" class="md-nav__link">
<span class="md-ellipsis">
Statement Attributes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/update/" class="md-nav__link">
<span class="md-ellipsis">
Update
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../mapper/mapper/" class="md-nav__link">
<span class="md-ellipsis">
Mapper
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_7_5" >
<label class="md-nav__link" for="__nav_2_7_5" id="__nav_2_7_5_label" tabindex="0">
<span class="md-ellipsis">
Configuration
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_7_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_7_5">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../mapper/config/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/config/kotlin/" class="md-nav__link">
<span class="md-ellipsis">
Kotlin
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/config/lombok/" class="md-nav__link">
<span class="md-ellipsis">
Lombok
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/config/record/" class="md-nav__link">
<span class="md-ellipsis">
Record
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/config/scala/" class="md-nav__link">
<span class="md-ellipsis">
Scala
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8" >
<label class="md-nav__link" for="__nav_2_8" id="__nav_2_8_label" tabindex="">
<span class="md-ellipsis">
Developer
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_8">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../developer/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_2" >
<label class="md-nav__link" for="__nav_2_8_2" id="__nav_2_8_2_label" tabindex="0">
<span class="md-ellipsis">
Common
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_8_2">
<span class="md-nav__icon md-icon"></span>
Common
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../developer/common/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../developer/common/concurrency/" class="md-nav__link">
<span class="md-ellipsis">
Concurrency
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../developer/common/context/" class="md-nav__link">
<span class="md-ellipsis">
Context
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../developer/common/event_bus/" class="md-nav__link">
<span class="md-ellipsis">
Event Bus
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../developer/native_protocol/" class="md-nav__link">
<span class="md-ellipsis">
Native Protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../developer/netty_pipeline/" class="md-nav__link">
<span class="md-ellipsis">
Netty Pipeline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../developer/request_execution/" class="md-nav__link">
<span class="md-ellipsis">
Request Execution
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../developer/admin/" class="md-nav__link">
<span class="md-ellipsis">
Admin
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../osgi/" class="md-nav__link">
<span class="md-ellipsis">
OSGi
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../api/" class="md-nav__link">
<span class="md-ellipsis">
API References
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../faq-README/" class="md-nav__link">
<span class="md-ellipsis">
FAQ
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../changelog-README/" class="md-nav__link">
<span class="md-ellipsis">
Changelog
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../upgrade-README/" class="md-nav__link">
<span class="md-ellipsis">
Upgrade Guide
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#performance" class="md-nav__link">
<span class="md-ellipsis">
Performance
</span>
</a>
<nav class="md-nav" aria-label="Performance">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#statements" class="md-nav__link">
<span class="md-ellipsis">
Statements
</span>
</a>
<nav class="md-nav" aria-label="Statements">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#immutability-and-builders" class="md-nav__link">
<span class="md-ellipsis">
Immutability and builders
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#prepared-statements" class="md-nav__link">
<span class="md-ellipsis">
Prepared statements
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#request-execution" class="md-nav__link">
<span class="md-ellipsis">
Request execution
</span>
</a>
<nav class="md-nav" aria-label="Request execution">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#connection-pooling" class="md-nav__link">
<span class="md-ellipsis">
Connection pooling
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#compression" class="md-nav__link">
<span class="md-ellipsis">
Compression
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#timestamp-generation" class="md-nav__link">
<span class="md-ellipsis">
Timestamp generation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#tracing" class="md-nav__link">
<span class="md-ellipsis">
Tracing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#request-trackers" class="md-nav__link">
<span class="md-ellipsis">
Request trackers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#metrics" class="md-nav__link">
<span class="md-ellipsis">
Metrics
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#throttling" class="md-nav__link">
<span class="md-ellipsis">
Throttling
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#caching-reusable-objects" class="md-nav__link">
<span class="md-ellipsis">
Caching reusable objects
</span>
</a>
<nav class="md-nav" aria-label="Caching reusable objects">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#identifiers" class="md-nav__link">
<span class="md-ellipsis">
Identifiers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#type-tokens" class="md-nav__link">
<span class="md-ellipsis">
Type tokens
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#built-queries" class="md-nav__link">
<span class="md-ellipsis">
Built queries
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#derived-configuration-profiles" class="md-nav__link">
<span class="md-ellipsis">
Derived configuration profiles
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#metadata" class="md-nav__link">
<span class="md-ellipsis">
Metadata
</span>
</a>
<nav class="md-nav" aria-label="Metadata">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#filtering" class="md-nav__link">
<span class="md-ellipsis">
Filtering
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#debouncing" class="md-nav__link">
<span class="md-ellipsis">
Debouncing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#schema-updates" class="md-nav__link">
<span class="md-ellipsis">
Schema updates
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#thread-pooling" class="md-nav__link">
<span class="md-ellipsis">
Thread pooling
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1>Performance</h1>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<h2 id="performance">Performance<a class="headerlink" href="#performance" title="Permanent link">&para;</a></h2>
<p>This page is intended as a checklist for everything related to driver performance. Most of the
information is already available in other sections of the manual, but it's linked here for
easy reference if you're benchmarking your application or diagnosing performance issues.</p>
<h3 id="statements">Statements<a class="headerlink" href="#statements" title="Permanent link">&para;</a></h3>
<p><a href="../statements/">Statements</a> are some of the driver types you'll use the most. Every request needs
one -- even <code>session.execute(String)</code> creates a <code>SimpleStatement</code> under the hood.</p>
<h4 id="immutability-and-builders">Immutability and builders<a class="headerlink" href="#immutability-and-builders" title="Permanent link">&para;</a></h4>
<p>Statements are by default implemented with immutable classes: every call to a setter method creates
an intermediary copy. If you have multiple attributes to set, use a builder instead:</p>
<div class="highlight"><pre><span></span><code><span class="n">SimpleStatement</span><span class="w"> </span><span class="n">statement</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SimpleStatement</span><span class="p">.</span><span class="na">builder</span><span class="p">(</span><span class="s">&quot;SELECT * FROM foo&quot;</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">setPageSize</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">setConsistencyLevel</span><span class="p">(</span><span class="n">DefaultConsistencyLevel</span><span class="p">.</span><span class="na">QUORUM</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">setIdempotence</span><span class="p">(</span><span class="kc">true</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">build</span><span class="p">();</span>
</code></pre></div>
<p>Also, note that you don't need a driver <code>Session</code> to create simple statements: they can be
initialized statically and stored as constants.</p>
<h4 id="prepared-statements">Prepared statements<a class="headerlink" href="#prepared-statements" title="Permanent link">&para;</a></h4>
<p><a href="../statements/prepared">Prepared statements</a> allow Cassandra to cache parsed query strings
server-side, but that's not their only benefit for performance:</p>
<ul>
<li>the driver also caches the response metadata, which can then be skipped in subsequent responses.
This saves bandwidth, as well as the CPU and memory resources required to parse it.</li>
<li>in some cases, prepared statements set routing information automatically, which allows the driver
to target the most appropriate replicas.</li>
</ul>
<p>You should use prepared statements for all recurring requests in your application. Simple statements
should only be used for one-off queries, for example some initialization that will be done only once
at startup.</p>
<p>The driver caches prepared statements -- see <a href="https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/CqlSession.html#prepare-com.datastax.oss.driver.api.core.cql.SimpleStatement-">CqlSession.prepare(SimpleStatement)</a> for the fine
print. However, if the query is static, it's still a good practice to cache your <code>PreparedStatement</code>
instances to avoid calling <code>prepare()</code> every time. One common pattern is to use some sort of DAO
component:</p>
<div class="highlight"><pre><span></span><code><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">class</span> <span class="nc">UserDao</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">CqlSession</span><span class="w"> </span><span class="n">session</span><span class="p">;</span>
<span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">PreparedStatement</span><span class="w"> </span><span class="n">preparedFindById</span><span class="p">;</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="nf">UserDao</span><span class="p">(</span><span class="n">CqlSession</span><span class="w"> </span><span class="n">session</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="na">session</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">session</span><span class="p">;</span>
<span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="na">preparedFindById</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">session</span><span class="p">.</span><span class="na">prepare</span><span class="p">(</span><span class="s">&quot;SELECT * FROM user WHERE id = ?&quot;</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="n">User</span><span class="w"> </span><span class="nf">findById</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">id</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Row</span><span class="w"> </span><span class="n">row</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">session</span><span class="p">.</span><span class="na">execute</span><span class="p">(</span><span class="n">preparedFindById</span><span class="p">.</span><span class="na">bind</span><span class="p">(</span><span class="n">id</span><span class="p">)).</span><span class="na">one</span><span class="p">();</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">User</span><span class="p">(</span><span class="n">row</span><span class="p">.</span><span class="na">getInt</span><span class="p">(</span><span class="n">id</span><span class="p">),</span><span class="w"> </span><span class="n">row</span><span class="p">.</span><span class="na">getString</span><span class="p">(</span><span class="s">&quot;first_name&quot;</span><span class="p">),</span><span class="w"> </span><span class="n">row</span><span class="p">.</span><span class="na">getString</span><span class="p">(</span><span class="s">&quot;last_name&quot;</span><span class="p">));</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div>
<h3 id="request-execution">Request execution<a class="headerlink" href="#request-execution" title="Permanent link">&para;</a></h3>
<h4 id="connection-pooling">Connection pooling<a class="headerlink" href="#connection-pooling" title="Permanent link">&para;</a></h4>
<p>By default, the driver opens 1 connection per node, and allows 1024 concurrent requests on each
connection. In our experience this is enough for most scenarios. </p>
<p>If your application generates a very high throughput (hundreds of thousands of requests per second),
you might want to experiment with different settings. See the <a href="../pooling/#tuning">tuning</a> section
in the connection pooling page.</p>
<h4 id="compression">Compression<a class="headerlink" href="#compression" title="Permanent link">&para;</a></h4>
<p>Consider <a href="../compression/">compression</a> if your queries return large payloads; it might help to
reduce network traffic.</p>
<h4 id="timestamp-generation">Timestamp generation<a class="headerlink" href="#timestamp-generation" title="Permanent link">&para;</a></h4>
<p>Each query is assigned a <a href="../query_timestamps/">timestamp</a> to order them relative to each other.</p>
<p>By default, this is done driver-side with
<a href="../query_timestamps/#atomic-timestamp-generator">AtomicTimestampGenerator</a>. This is a very simple
operation so unlikely to be a bottleneck, but note that there are other options, such as a
<a href="../query_timestamps/#thread-local-timestamp-generator">thread-local</a> variant that creates slightly
less contention, writing your own implementation or letting the server assign timestamps.</p>
<h4 id="tracing">Tracing<a class="headerlink" href="#tracing" title="Permanent link">&para;</a></h4>
<p><a href="../tracing/">Tracing</a> should be used for only a small percentage of your queries. It consumes
additional resources on the server, and fetching each trace requires background requests.</p>
<p>Do not enable tracing for every request; it's a sure way to bring your performance down.</p>
<h4 id="request-trackers">Request trackers<a class="headerlink" href="#request-trackers" title="Permanent link">&para;</a></h4>
<p><a href="../request_tracker/">Request trackers</a> are on the hot path (that is, invoked on I/O threads, each
time a request is executed), and users can plug custom implementations.</p>
<p>If you experience throughput issues, check if any trackers are configured, and what they are doing.
They should avoid blocking calls, as well as any CPU-intensive computations.</p>
<h4 id="metrics">Metrics<a class="headerlink" href="#metrics" title="Permanent link">&para;</a></h4>
<p>Similarly, some of the driver's <a href="../metrics/">metrics</a> are updated for every request (if the metric
is enabled).</p>
<p>By default, the driver ships with all metrics disabled. Enable them conservatively, and if you're
investigating a performance issue, try disabling them temporarily to check that they are not the
cause.</p>
<h4 id="throttling">Throttling<a class="headerlink" href="#throttling" title="Permanent link">&para;</a></h4>
<p><a href="../throttling/">Throttling</a> can help establish more predictable server performance, by controlling
how much load each driver instance is allowed to put on the cluster. The throttling algorithm itself
incurs a bit of overhead in the driver, but that shouldn't be a problem since the goal is to stay
under reasonable rates in the first place.</p>
<p>If you're debugging an unfamiliar application and experience a throughput plateau, make sure that
it's not caused by a throttler.</p>
<h3 id="caching-reusable-objects">Caching reusable objects<a class="headerlink" href="#caching-reusable-objects" title="Permanent link">&para;</a></h3>
<p>Many driver objects are immutable. If you reuse the same values often, consider caching them in
private fields or constants to alleviate GC pressure.</p>
<h4 id="identifiers">Identifiers<a class="headerlink" href="#identifiers" title="Permanent link">&para;</a></h4>
<p>The driver uses <a href="https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/CqlIdentifier.html">CqlIdentifier</a> to deal with <a href="../../case_sensitivity">case sensitivity</a>. When you
call methods that take raw strings, the driver generally wraps them under the hood:</p>
<div class="highlight"><pre><span></span><code><span class="n">session</span><span class="p">.</span><span class="na">getMetadata</span><span class="p">().</span><span class="na">getKeyspace</span><span class="p">(</span><span class="s">&quot;inventory&quot;</span><span class="p">);</span><span class="w"> </span><span class="c1">// shortcut for getKeyspace(CqlIdentifier.fromCql(&quot;inventory&quot;)</span>
<span class="c1">// Caching the identifier:</span>
<span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">INVENTORY_ID</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;inventory&quot;</span><span class="p">;</span>
<span class="n">session</span><span class="p">.</span><span class="na">getMetadata</span><span class="p">().</span><span class="na">getKeyspace</span><span class="p">(</span><span class="n">INVENTORY_ID</span><span class="p">);</span>
</code></pre></div>
<p>This also applies to built queries, although it's less important because generally the whole query
can be cached (see below).</p>
<p>Note however that row getters and bound statement setters do <strong>not</strong> wrap their argument: because
those methods are used very often, they handle raw strings with an optimized algorithm that does not
require creating an identifier (the rules are detailed <a href="https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/data/AccessibleByName.html">here</a>).</p>
<div class="highlight"><pre><span></span><code><span class="c1">// No need to extract a CqlIdentifier, raw strings are handled efficiently:</span>
<span class="n">Row</span><span class="w"> </span><span class="n">row</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">session</span><span class="p">.</span><span class="na">execute</span><span class="p">(</span><span class="s">&quot;SELECT * FROM user WHERE id = 1&quot;</span><span class="p">).</span><span class="na">one</span><span class="p">();</span>
<span class="n">row</span><span class="p">.</span><span class="na">getInt</span><span class="p">(</span><span class="s">&quot;age&quot;</span><span class="p">);</span>
<span class="n">PreparedStatement</span><span class="w"> </span><span class="n">pst</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">session</span><span class="p">.</span><span class="na">prepare</span><span class="p">(</span><span class="s">&quot;UPDATE user SET name=:name WHERE id=:id&quot;</span><span class="p">);</span>
<span class="n">pst</span><span class="p">.</span><span class="na">bind</span><span class="p">().</span><span class="na">setInt</span><span class="p">(</span><span class="s">&quot;age&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">25</span><span class="p">);</span>
</code></pre></div>
<h4 id="type-tokens">Type tokens<a class="headerlink" href="#type-tokens" title="Permanent link">&para;</a></h4>
<p><a href="https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/type/reflect/GenericType.html">GenericType</a> is used to express complex generic types -- such as
<a href="../#collection-types">nested collections</a> -- in getters and setters. These objects are immutable
and stateless, so they are good candidates for constants:</p>
<div class="highlight"><pre><span></span><code><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">GenericType</span><span class="o">&lt;</span><span class="n">Set</span><span class="o">&lt;</span><span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;&gt;&gt;</span><span class="w"> </span><span class="n">SET_OF_LIST_OF_STRING</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">GenericType</span><span class="o">&lt;</span><span class="n">Set</span><span class="o">&lt;</span><span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;&gt;&gt;</span><span class="p">()</span><span class="w"> </span><span class="p">{};</span>
<span class="n">Set</span><span class="o">&lt;</span><span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">teams</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">row</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="s">&quot;teams&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">SET_OF_LIST_OF_STRING</span><span class="p">);</span>
</code></pre></div>
<p><code>GenericType</code> itself already exposes a few of those constants. You can create your own utility class
to store yours.</p>
<h4 id="built-queries">Built queries<a class="headerlink" href="#built-queries" title="Permanent link">&para;</a></h4>
<p>Similarly, <a href="../../query_builder/">built queries</a> are immutable and don't need a reference to a live
driver instance. If you create them statically, they can be stored as constants:</p>
<div class="highlight"><pre><span></span><code><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">BuildableQuery</span><span class="w"> </span><span class="n">SELECT_SERVER_VERSION</span><span class="w"> </span><span class="o">=</span>
<span class="w"> </span><span class="n">selectFrom</span><span class="p">(</span><span class="s">&quot;system&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;local&quot;</span><span class="p">).</span><span class="na">column</span><span class="p">(</span><span class="s">&quot;release_version&quot;</span><span class="p">);</span>
</code></pre></div>
<p>Note that you don't necessarily need to extract <code>CqlIdentifier</code> constants since the construction
already happens at initialization time.</p>
<h4 id="derived-configuration-profiles">Derived configuration profiles<a class="headerlink" href="#derived-configuration-profiles" title="Permanent link">&para;</a></h4>
<p>The configuration API allows you to build <a href="../configuration/#derived-profiles">derived profiles</a> at
runtime.</p>
<div class="highlight"><pre><span></span><code><span class="n">DriverExecutionProfile</span><span class="w"> </span><span class="n">dynamicProfile</span><span class="w"> </span><span class="o">=</span>
<span class="w"> </span><span class="n">defaultProfile</span><span class="p">.</span><span class="na">withString</span><span class="p">(</span>
<span class="w"> </span><span class="n">DefaultDriverOption</span><span class="p">.</span><span class="na">REQUEST_CONSISTENCY</span><span class="p">,</span><span class="w"> </span><span class="n">DefaultConsistencyLevel</span><span class="p">.</span><span class="na">EACH_QUORUM</span><span class="p">.</span><span class="na">name</span><span class="p">());</span>
</code></pre></div>
<p>Their use is generally discouraged (you should define profiles statically in the configuration file
as much as possible), but if there's no other way and you reuse them over time, store them instead
of recreating them each time. </p>
<h3 id="metadata">Metadata<a class="headerlink" href="#metadata" title="Permanent link">&para;</a></h3>
<p>The driver maintains <a href="../metadata/">metadata</a> about the state of the Cassandra cluster. This work is
done on dedicated "admin" threads (see the <a href="#thread-pooling">thread pooling</a> section below), so it's
not in direct competition with regular requests. </p>
<h4 id="filtering">Filtering<a class="headerlink" href="#filtering" title="Permanent link">&para;</a></h4>
<p>You can disable entire parts of the metadata with those configuration options: </p>
<div class="highlight"><pre><span></span><code>datastax-java-driver.advanced.metadata {
schema.enabled = true
token-map.enabled = true
}
</code></pre></div>
<p>This will save CPU and memory resources, but you lose some driver features:</p>
<ul>
<li>if schema is disabled, <code>session.getMetadata().getKeyspaces()</code> will always be empty: your
application won't be able to inspect the database schema dynamically.</li>
<li>if the token map is disabled, <code>session.getMetadata().getTokenMap()</code> will always be empty, and you
lose the ability to use <a href="../load_balancing/#token-aware">token-aware routing</a>.</li>
</ul>
<p>Note that disabling the schema implicitly disables the token map (because computing the token map
requires the keyspace replication settings).</p>
<p>Perhaps more interestingly, metadata can be <a href="../metadata/schema/#filtering">filtered</a> to a specific
subset of keyspaces. This is handy if you connect to a shared cluster that holds data for multiple
applications:</p>
<div class="highlight"><pre><span></span><code>datastax-java-driver.advanced.metadata {
schema.refreshed-keyspaces = [ &quot;users&quot;, &quot;inventory&quot; ]
}
</code></pre></div>
<p>To get a sense of the time spent on metadata refreshes, enable <a href="../logging/">debug logs</a> and look
for entries like this:</p>
<div class="highlight"><pre><span></span><code>[s0-io-0] DEBUG c.d.o.d.i.c.m.s.q.CassandraSchemaQueries - [s0] Schema queries took 88 ms
[s0-admin-0] DEBUG c.d.o.d.i.c.m.s.p.CassandraSchemaParser - [s0] Schema parsing took 71 ms
[s0-admin-0] DEBUG c.d.o.d.i.c.metadata.DefaultMetadata - [s0] Refreshing token map (only schema has changed)
[s0-admin-0] DEBUG c.d.o.d.i.c.m.token.DefaultTokenMap - [s0] Computing keyspace-level data for {system_auth={class=org.apache.cassandra.locator.SimpleStrategy, replication_factor=1}, system_schema={class=org.apache.cassandra.locator.LocalStrategy}, system_distributed={class=org.apache.cassandra.locator.SimpleStrategy, replication_factor=3}, system={class=org.apache.cassandra.locator.LocalStrategy}, system_traces={class=org.apache.cassandra.locator.SimpleStrategy, replication_factor=2}}
[s0-admin-0] DEBUG c.d.o.d.i.c.m.token.DefaultTokenMap - [s0] Computing new keyspace-level data for {class=org.apache.cassandra.locator.SimpleStrategy, replication_factor=1}
[s0-admin-0] DEBUG c.d.o.d.i.c.m.token.KeyspaceTokenMap - [s0] Computing keyspace-level data for {class=org.apache.cassandra.locator.SimpleStrategy, replication_factor=1} took 12 ms
[s0-admin-0] DEBUG c.d.o.d.i.c.m.token.DefaultTokenMap - [s0] Computing new keyspace-level data for {class=org.apache.cassandra.locator.LocalStrategy}
[s0-admin-0] DEBUG c.d.o.d.i.c.m.token.KeyspaceTokenMap - [s0] Computing keyspace-level data for {class=org.apache.cassandra.locator.LocalStrategy} took 1 ms
[s0-admin-0] DEBUG c.d.o.d.i.c.m.token.DefaultTokenMap - [s0] Computing new keyspace-level data for {class=org.apache.cassandra.locator.SimpleStrategy, replication_factor=3}
[s0-admin-0] DEBUG c.d.o.d.i.c.m.token.KeyspaceTokenMap - [s0] Computing keyspace-level data for {class=org.apache.cassandra.locator.SimpleStrategy, replication_factor=3} took 54 us
[s0-admin-0] DEBUG c.d.o.d.i.c.m.token.DefaultTokenMap - [s0] Computing new keyspace-level data for {class=org.apache.cassandra.locator.SimpleStrategy, replication_factor=2}
[s0-admin-0] DEBUG c.d.o.d.i.c.m.token.KeyspaceTokenMap - [s0] Computing keyspace-level data for {class=org.apache.cassandra.locator.SimpleStrategy, replication_factor=2} took 98 us
[s0-admin-0] DEBUG c.d.o.d.i.c.metadata.DefaultMetadata - [s0] Rebuilding token map took 32 ms
[s0-admin-0] DEBUG c.d.o.d.i.c.metadata.MetadataManager - [s0] Applying schema refresh took 34 ms
</code></pre></div>
<h4 id="debouncing">Debouncing<a class="headerlink" href="#debouncing" title="Permanent link">&para;</a></h4>
<p>The driver receives push notifications of schema and topology changes from the Cassandra cluster.
These signals are <em>debounced</em>, meaning that rapid series of events will be amortized, for example:</p>
<ul>
<li>if multiple schema objects are created or modified, only perform a single schema refresh at the
end.</li>
<li>if a node's status oscillates rapidly between UP and DOWN, wait for gossip to stabilize and only
apply the last state.</li>
</ul>
<p>Debouncing is controlled by these configuration options (shown here with their defaults):</p>
<div class="highlight"><pre><span></span><code>datastax-java-driver.advanced.metadata {
topology-event-debouncer {
# How long the driver waits to propagate an event. If another event is received within that
# time, the window is reset and a batch of accumulated events will be delivered.
window = 1 second
# The maximum number of events that can accumulate. If this count is reached, the events are
# delivered immediately and the time window is reset.
max-events = 20
}
schema.debouncer {
window = 1 second
max-events = 20
}
}
</code></pre></div>
<p>You may adjust those settings depending on your application's needs: higher values mean less impact
on performance, but the driver will be slower to react to changes. </p>
<h4 id="schema-updates">Schema updates<a class="headerlink" href="#schema-updates" title="Permanent link">&para;</a></h4>
<p>You should group your schema changes as much as possible.</p>
<p>Every change made from a client will be pushed to all other clients, causing them to refresh their
metadata. If you have multiple client instances, it might be a good idea to
<a href="../metadata/schema/#enabling-disabling">deactivate the metadata</a> on all clients while you apply the
updates, and reactivate it at the end (reactivating will trigger an immediate refresh, so you might
want to ramp up clients to avoid a "thundering herd" effect).</p>
<p>Schema changes have to replicate to all nodes in the cluster. To minimize the chance of schema
disagreement errors:</p>
<ul>
<li>apply your changes serially. The driver handles this automatically by checking for
<a href="../metadata/schema/#schema-agreement">schema agreement</a> after each DDL query. Run them from the
same application thread, and, if you use the asynchronous API, chain the futures properly.</li>
<li>send all the changes to the same coordinator. This is one of the rare cases where we recommend
using <a href="https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/cql/Statement.html#setNode-com.datastax.oss.driver.api.core.metadata.Node-">Statement.setNode()</a>. </li>
</ul>
<h3 id="thread-pooling">Thread pooling<a class="headerlink" href="#thread-pooling" title="Permanent link">&para;</a></h3>
<p>The driver architecture is designed around two code paths:</p>
<ul>
<li>the <strong>hot path</strong> is everything directly related to the execution of requests: encoding/decoding
driver types to/from low-level binary payloads, and network I/O. This is where the driver spends
most of its cycles in a typical application: when we have to make design tradeoffs, performance is
always the priority. Hot code runs on 3 categories of threads:<ul>
<li>your application's thread for the construction of statements;</li>
<li>the driver's "I/O" event loop group for encoding/decoding and network I/O. You can configure
it with the options in <code>datastax-java-driver.advanced.netty.io-group</code>.</li>
<li>the driver's "timer" thread for request timeouts and speculative executions. See
<code>datastax-java-driver.advanced.netty.timer</code>.</li>
</ul>
</li>
<li>the <strong>cold path</strong> is for all administrative tasks: managing the
<a href="../control_connection">control connection</a>, parsing <a href="../metadata/">metadata</a>, reacting to cluster
events (node going up/down, getting added/removed, etc), and scheduling periodic events
(reconnections, reloading the configuration). Comparatively, these tasks happen less often, and
are less critical (for example, stale schema metadata is not a blocker for request execution).
They are scheduled on a separate "admin" event loop group, controlled by the options in
<code>datastax-java-driver.advanced.netty.admin-group</code>.</li>
</ul>
<p>By default, the number of I/O threads is set to <code>Runtime.getRuntime().availableProcessors() * 2</code>,
and the number of admin threads to 2. It's hard to give one-size-fits-all recommendations because
every case is different, but you might want to try lowering I/O threads, especially if your
application already creates a lot of threads on its side. </p>
<p>Note that you can gain more fine-grained control over thread pools via the
<a href="../../api_conventions">internal</a> API (look at the <code>NettyOptions</code> interface). In particular, it is
possible to reuse the same event loop group for I/O, admin tasks, and even your application code
(the driver's internal code is fully asynchronous so it will never block any thread). The timer is
the only one that will have to stay on a separate thread.</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.tabs", "navigation.sections", "navigation.top", "search.highlight", "search.share"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.92b07e13.min.js"></script>
</body>
</html>