<!-- CANARY: REQ=REQ-SEC-AUDIT-LOG-001; FEATURE="Security"; ASPECT=AuditLog; STATUS=TESTED; OWNER=security; UPDATED=2026-01-16 -->
<h3 id="overview" class="position-relative d-flex align-items-center group">
<span>Overview</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="overview"
aria-haspopup="dialog"
aria-label="Share link: Overview">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
<div class="hsm-dialog" role="document">
<div class="hsm-header">
<h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2>
<button type="button" class="hsm-close" aria-label="Close">
<i class="fa-solid fa-xmark"></i>
</button>
</div>
<div class="hsm-body">
<label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label>
<div class="input-group mb-4 hsm-url-group">
<input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" />
<button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
<i class="fa-duotone fa-clipboard" aria-hidden="true"></i>
</button>
</div>
<div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div>
<div class="hsm-share-grid">
<a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-twitter me-2"></i>Twitter
</a>
<a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-linkedin me-2"></i>LinkedIn
</a>
<a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-facebook me-2"></i>Facebook
</a>
</div>
</div>
</div>
</div>
<style>
.heading-share-modal {
position: fixed;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.6);
z-index: 1050;
padding: 1rem;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.heading-share-modal[hidden] { display: none !important; }
.hsm-dialog {
max-width: 420px;
width: 100%;
background: var(--bs-body-bg, #fff);
color: var(--bs-body-color, #212529);
border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
border-radius: 1rem;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
overflow: hidden;
animation: hsm-fade-in 0.2s ease-out;
}
@keyframes hsm-fade-in {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
[data-bs-theme="dark"] .hsm-dialog {
background: #1e293b;
border-color: rgba(255,255,255,0.1);
color: #f8f9fa;
}
.hsm-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
background: rgba(0,0,0,0.02);
}
[data-bs-theme="dark"] .hsm-header {
background: rgba(255,255,255,0.02);
border-color: rgba(255,255,255,0.1);
}
.hsm-close {
background: transparent;
border: none;
color: inherit;
opacity: 0.5;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-size: 1.2rem;
line-height: 1;
transition: opacity 0.2s;
}
.hsm-close:hover {
opacity: 1;
}
.hsm-body {
padding: 1.5rem;
}
.hsm-url-group {
display: flex !important;
align-items: stretch;
}
.hsm-url-group .form-control {
flex: 1;
min-width: 0;
margin: 0;
background: var(--bs-secondary-bg, #f8f9fa);
border-color: var(--bs-border-color, #dee2e6);
border-top-right-radius: 0;
border-bottom-right-radius: 0;
height: 42px;
}
.hsm-url-group .btn {
flex: 0 0 auto;
margin: 0;
margin-left: -1px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 1.25rem;
z-index: 2;
}
[data-bs-theme="dark"] .hsm-url-group .form-control {
background: #0f172a;
border-color: #334155;
color: #e2e8f0;
}
.hsm-share-grid {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.hsm-share-grid .btn {
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
padding: 0.6rem;
border-color: var(--bs-border-color);
width: 100%;
}
[data-bs-theme="dark"] .hsm-share-grid .btn {
color: #e2e8f0;
border-color: #475569;
}
[data-bs-theme="dark"] .hsm-share-grid .btn:hover {
background: #334155;
border-color: #cbd5e1;
}
</style>
<script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest && e.target.closest('.h-share');
if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
</script><p>Geode provides comprehensive session management features for maintaining stateful connections to the database. Sessions enable parameter storage, transaction management, connection pooling, and timeout configuration.</p>
<h4 id="what-youll-learn" class="position-relative d-flex align-items-center group">
<span>What You&rsquo;ll Learn</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="what-youll-learn"
aria-haspopup="dialog"
aria-label="Share link: What Youll Learn">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ul>
<li>How to use session parameters (GRAPH, VALUE, BINDING TABLE)</li>
<li>Connection pooling configuration and best practices</li>
<li>Session lifecycle and timeout management</li>
<li>Session state persistence and restoration</li>
<li>Advanced session patterns for multi-tenant applications</li>
</ul>
<h4 id="prerequisites" class="position-relative d-flex align-items-center group">
<span>Prerequisites</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="prerequisites"
aria-haspopup="dialog"
aria-label="Share link: Prerequisites">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ul>
<li>Geode installed (see <a
href="/guides/installation/"
>Installation Guide</a>
)</li>
<li>Basic understanding of database sessions</li>
<li>Familiarity with GQL query syntax</li>
</ul>
<h3 id="session-parameters" class="position-relative d-flex align-items-center group">
<span>Session Parameters</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="session-parameters"
aria-haspopup="dialog"
aria-label="Share link: Session Parameters">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Session parameters allow you to store named values that persist across queries within a session. Geode supports three types of session parameters according to ISO/IEC 39075:2024.</p>
<h4 id="1-graph-parameters" class="position-relative d-flex align-items-center group">
<span>1. Graph Parameters</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="1-graph-parameters"
aria-haspopup="dialog"
aria-label="Share link: 1. Graph Parameters">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Graph parameters store references to graphs for use in graph pattern queries.</p>
<p><strong>Syntax</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">GRAPH</span><span class="w"> </span><span class="p">[</span><span class="nv">$param_name</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err"><</span><span class="py">graph_expression</span><span class="err">></span><span class="w"> </span><span class="p">[</span><span class="py">IF</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">EXISTS</span><span class="p">]</span><span class="w">
</span></span></span></code></pre></div><p><strong>Examples</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Set</span><span class="w"> </span><span class="py">current</span><span class="w"> </span><span class="py">graph</span><span class="w"> </span><span class="py">as</span><span class="w"> </span><span class="py">parameter</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">GRAPH</span><span class="w"> </span><span class="nv">$my_graph</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">CURRENT_GRAPH</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Set</span><span class="w"> </span><span class="py">specific</span><span class="w"> </span><span class="py">graph</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">GRAPH</span><span class="w"> </span><span class="nv">$social</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">social_network</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Conditional</span><span class="w"> </span><span class="py">set</span><span class="w"> </span><span class="p">(</span><span class="kd">on</span><span class="py">ly</span><span class="w"> </span><span class="py">if</span><span class="w"> </span><span class="py">doesn</span><span class="err">'</span><span class="py">t</span><span class="w"> </span><span class="py">exist</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">GRAPH</span><span class="w"> </span><span class="py">IF</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">EXISTS</span><span class="w"> </span><span class="nv">$default_graph</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">main_graph</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Reference</span><span class="w"> </span><span class="py">graph</span><span class="w"> </span><span class="py">parameter</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">queries</span><span class="w"> </span><span class="p">(</span><span class="py">planned</span><span class="w"> </span><span class="py">feature</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USE</span><span class="w"> </span><span class="py">GRAPH</span><span class="w"> </span><span class="nv">$my_graph</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">n</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w"> </span><span class="py">RETURN</span><span class="w"> </span><span class="py">n</span><span class="w">
</span></span></span></code></pre></div><p><strong>Use Cases</strong>:</p>
<ul>
<li>Multi-graph applications</li>
<li>Dynamic graph selection</li>
<li>Graph isolation for testing</li>
<li>Multi-tenant graph separation</li>
</ul>
<h4 id="2-value-parameters" class="position-relative d-flex align-items-center group">
<span>2. Value Parameters</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="2-value-parameters"
aria-haspopup="dialog"
aria-label="Share link: 2. Value Parameters">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Value parameters store scalar values (integers, strings, booleans, etc.) for use in queries.</p>
<p><strong>Syntax</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="p">[</span><span class="nv">$param_name</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err"><</span><span class="py">expression</span><span class="err">></span><span class="w"> </span><span class="p">[</span><span class="py">IF</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">EXISTS</span><span class="p">]</span><span class="w">
</span></span></span></code></pre></div><p><strong>Examples</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Set</span><span class="w"> </span><span class="py">integer</span><span class="w"> </span><span class="py">value</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$counter</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">42</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Set</span><span class="w"> </span><span class="py">string</span><span class="w"> </span><span class="py">value</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$username</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">alice</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Set</span><span class="w"> </span><span class="py">boolean</span><span class="w"> </span><span class="py">value</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$enabled</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Set</span><span class="w"> </span><span class="py">computed</span><span class="w"> </span><span class="py">value</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$max_age</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">18</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">5</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">90</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Conditional</span><span class="w"> </span><span class="py">set</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="py">IF</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">EXISTS</span><span class="w"> </span><span class="nv">$default_limit</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">100</span><span class="w">
</span></span></span></code></pre></div><p><strong>Using in Queries</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Set</span><span class="w"> </span><span class="py">parameter</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$min_age</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">25</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Use</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="kd">query</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">></span><span class="p">=</span><span class="w"> </span><span class="nv">$min_age</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="py">DESC</span><span class="w">
</span></span></span></code></pre></div><p><strong>Use Cases</strong>:</p>
<ul>
<li>Query parameterization</li>
<li>Default value configuration</li>
<li>User preferences</li>
<li>Application state</li>
</ul>
<h4 id="3-binding-table-parameters" class="position-relative d-flex align-items-center group">
<span>3. Binding Table Parameters</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="3-binding-table-parameters"
aria-haspopup="dialog"
aria-label="Share link: 3. Binding Table Parameters">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Binding table parameters store references to binding tables (result sets) for use in queries.</p>
<p><strong>Syntax</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="p">[</span><span class="py">BINDING</span><span class="p">]</span><span class="w"> </span><span class="py">TABLE</span><span class="w"> </span><span class="p">[</span><span class="nv">$param_name</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err"><</span><span class="py">binding_table_ref</span><span class="err">></span><span class="w"> </span><span class="p">[</span><span class="py">IF</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">EXISTS</span><span class="p">]</span><span class="w">
</span></span></span></code></pre></div><p><strong>Examples</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Set</span><span class="w"> </span><span class="py">binding</span><span class="w"> </span><span class="py">table</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">BINDING</span><span class="w"> </span><span class="py">TABLE</span><span class="w"> </span><span class="nv">$my_table</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">user_bindings</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Shorthand</span><span class="w"> </span><span class="py">syntax</span><span class="w"> </span><span class="p">(</span><span class="py">BINDING</span><span class="w"> </span><span class="py">is</span><span class="w"> </span><span class="py">optional</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">TABLE</span><span class="w"> </span><span class="nv">$results</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="kd">query</span><span class="nc">_results</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Store</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span><span class="nc">results</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">TABLE</span><span class="w"> </span><span class="nv">$active_users</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">active</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">id</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Reference</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">subsequent</span><span class="w"> </span><span class="py">queries</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">id</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="nv">$active_users</span><span class="err">.</span><span class="py">id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="w">
</span></span></span></code></pre></div><p><strong>Use Cases</strong>:</p>
<ul>
<li>Temporary result storage</li>
<li>Query composition</li>
<li>Performance optimization (avoiding repeated queries)</li>
<li>Complex multi-step analytics</li>
</ul>
<h3 id="session-reset" class="position-relative d-flex align-items-center group">
<span>Session Reset</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="session-reset"
aria-haspopup="dialog"
aria-label="Share link: Session Reset">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>The <code>SESSION RESET</code> command clears session state, including parameters.</p>
<p><strong>Syntax</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">SESSION</span><span class="w"> </span><span class="py">RESET</span><span class="w"> </span><span class="p">[</span><span class="py">ALL</span><span class="p">]</span><span class="w"> </span><span class="py">PARAMETERS</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Reset</span><span class="w"> </span><span class="py">all</span><span class="w"> </span><span class="py">parameters</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">RESET</span><span class="w"> </span><span class="py">PARAMETERS</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Same</span><span class="w"> </span><span class="py">as</span><span class="w"> </span><span class="py">ALL</span><span class="w"> </span><span class="py">PARAMETERS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">RESET</span><span class="w"> </span><span class="py">PARAMETER</span><span class="w"> </span><span class="nv">$name</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Reset</span><span class="w"> </span><span class="py">specific</span><span class="w"> </span><span class="py">parameter</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">RESET</span><span class="w"> </span><span class="py">GRAPH</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Reset</span><span class="w"> </span><span class="py">current</span><span class="w"> </span><span class="py">graph</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">RESET</span><span class="w"> </span><span class="py">TIME</span><span class="w"> </span><span class="py">ZONE</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Reset</span><span class="w"> </span><span class="py">time</span><span class="w"> </span><span class="py">zone</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">RESET</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Reset</span><span class="w"> </span><span class="py">all</span><span class="w"> </span><span class="py">session</span><span class="w"> </span><span class="py">state</span><span class="w">
</span></span></span></code></pre></div><p><strong>Examples</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Reset</span><span class="w"> </span><span class="py">all</span><span class="w"> </span><span class="py">parameters</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">RESET</span><span class="w"> </span><span class="py">ALL</span><span class="w"> </span><span class="py">PARAMETERS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Reset</span><span class="w"> </span><span class="py">specific</span><span class="w"> </span><span class="py">parameter</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$temp</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">123</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">RESET</span><span class="w"> </span><span class="py">PARAMETER</span><span class="w"> </span><span class="nv">$temp</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Reset</span><span class="w"> </span><span class="py">graph</span><span class="w"> </span><span class="py">setting</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">GRAPH</span><span class="w"> </span><span class="nv">$g</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">my_graph</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">RESET</span><span class="w"> </span><span class="py">GRAPH</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Reset</span><span class="w"> </span><span class="py">time</span><span class="w"> </span><span class="py">zone</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">TIME</span><span class="w"> </span><span class="py">ZONE</span><span class="w"> </span><span class="err">'</span><span class="py">America</span><span class="err">/</span><span class="py">New_York</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">RESET</span><span class="w"> </span><span class="py">TIME</span><span class="w"> </span><span class="py">ZONE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Reset</span><span class="w"> </span><span class="py">everything</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">RESET</span><span class="w">
</span></span></span></code></pre></div><p><strong>What Gets Reset</strong>:</p>
<ul>
<li>All session parameters (GRAPH, VALUE, TABLE)</li>
<li>Current graph selection</li>
<li>Time zone setting</li>
<li>Transaction state (if applicable)</li>
<li>Custom session variables</li>
</ul>
<h3 id="connection-pooling" class="position-relative d-flex align-items-center group">
<span>Connection Pooling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="connection-pooling"
aria-haspopup="dialog"
aria-label="Share link: Connection Pooling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="client-side-pooling" class="position-relative d-flex align-items-center group">
<span>Client-Side Pooling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="client-side-pooling"
aria-haspopup="dialog"
aria-label="Share link: Client-Side Pooling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>All Geode clients support connection pooling for optimal resource utilization and performance.</p>
<h5 id="go-client-pooling" class="position-relative d-flex align-items-center group">
<span>Go Client Pooling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="go-client-pooling"
aria-haspopup="dialog"
aria-label="Share link: Go Client Pooling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">"geodedb.com/geode"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Create connection pool
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">pool</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">geode</span><span class="p">.</span><span class="nf">NewConnectionPool</span><span class="p">(</span><span class="o">&</span><span class="nx">geode</span><span class="p">.</span><span class="nx">PoolConfig</span><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Address</span><span class="p">:</span> <span class="s">"localhost:3141"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">MinConnections</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">MaxConnections</span><span class="p">:</span> <span class="mi">50</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">IdleTimeout</span><span class="p">:</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Minute</span> <span class="o">*</span> <span class="mi">10</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">ConnectTimeout</span><span class="p">:</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Second</span> <span class="o">*</span> <span class="mi">30</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">MaxLifetime</span><span class="p">:</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Hour</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">})</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="k">defer</span> <span class="nx">pool</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Execute queries (automatically uses pooled connections)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">result</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">pool</span><span class="p">.</span><span class="nf">Query</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="s">"MATCH (n:Person) RETURN n LIMIT 10"</span><span class="p">)</span>
</span></span></code></pre></div><p><strong>Configuration</strong>:</p>
<ul>
<li><code>MinConnections</code>: Minimum pool size (default: 5)</li>
<li><code>MaxConnections</code>: Maximum pool size (default: 100)</li>
<li><code>IdleTimeout</code>: Close idle connections after this duration</li>
<li><code>ConnectTimeout</code>: Connection establishment timeout</li>
<li><code>MaxLifetime</code>: Maximum connection lifetime</li>
</ul>
<h5 id="python-client-pooling" class="position-relative d-flex align-items-center group">
<span>Python Client Pooling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="python-client-pooling"
aria-haspopup="dialog"
aria-label="Share link: Python Client Pooling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">geode_client</span> <span class="kn">import</span> <span class="n">ConnectionPool</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Create connection pool (async)</span>
</span></span><span class="line"><span class="cl"><span class="n">pool</span> <span class="o">=</span> <span class="k">await</span> <span class="n">ConnectionPool</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">host</span><span class="o">=</span><span class="s1">'localhost'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">min_connections</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">max_connections</span><span class="o">=</span><span class="mi">50</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">idle_timeout</span><span class="o">=</span><span class="mi">600</span><span class="p">,</span> <span class="c1"># 10 minutes</span>
</span></span><span class="line"><span class="cl"> <span class="n">max_lifetime</span><span class="o">=</span><span class="mi">3600</span><span class="p">,</span> <span class="c1"># 1 hour</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Execute queries (async)</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">with</span> <span class="n">pool</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"MATCH (n:Person) RETURN n LIMIT 10"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Cleanup</span>
</span></span><span class="line"><span class="cl"><span class="k">await</span> <span class="n">pool</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span></code></pre></div><p><strong>Performance</strong>: Throughput depends on workload, network, and server limits; pooling reduces connection overhead</p>
<h5 id="rust-client-pooling" class="position-relative d-flex align-items-center group">
<span>Rust Client Pooling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="rust-client-pooling"
aria-haspopup="dialog"
aria-label="Share link: Rust Client Pooling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">use</span><span class="w"> </span><span class="n">geode_client</span>::<span class="n">ConnectionPool</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">let</span><span class="w"> </span><span class="n">pool</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ConnectionPool</span>::<span class="n">new</span><span class="p">(</span><span class="s">"localhost"</span><span class="p">,</span><span class="w"> </span><span class="mi">3141</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p">).</span><span class="n">skip_verify</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">conn</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pool</span><span class="p">.</span><span class="n">acquire</span><span class="p">().</span><span class="k">await</span><span class="o">?</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">let</span><span class="w"> </span><span class="p">(</span><span class="n">page</span><span class="p">,</span><span class="w"> </span><span class="n">_</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">query</span><span class="p">(</span><span class="s">"MATCH (n:Person) RETURN n LIMIT 10"</span><span class="p">).</span><span class="k">await</span><span class="o">?</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Performance</strong>: Throughput depends on workload, network, and server limits; pooling reduces connection overhead</p>
<h5 id="zig-client-pooling" class="position-relative d-flex align-items-center group">
<span>Zig Client Pooling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="zig-client-pooling"
aria-haspopup="dialog"
aria-label="Share link: Zig Client Pooling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><p>The Zig client exposes low-level protocol primitives. Build pooling at the application layer or wrap <code>GeodeClient</code> with your own pool implementation.</p>
<h4 id="server-side-configuration" class="position-relative d-flex align-items-center group">
<span>Server-Side Configuration</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="server-side-configuration"
aria-haspopup="dialog"
aria-label="Share link: Server-Side Configuration">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Configure server-side connection limits:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># geode.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">network</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max_connections</span><span class="p">:</span><span class="w"> </span><span class="m">5000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">connection_timeout</span><span class="p">:</span><span class="w"> </span><span class="l">60s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">idle_timeout</span><span class="p">:</span><span class="w"> </span><span class="l">300s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">performance</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">worker_threads</span><span class="p">:</span><span class="w"> </span><span class="m">16</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max_concurrent_queries</span><span class="p">:</span><span class="w"> </span><span class="m">1000</span><span class="w">
</span></span></span></code></pre></div><p><strong>Command-Line</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">geode serve <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --max-connections <span class="m">5000</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --connection-timeout 60s <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --idle-timeout 300s <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --worker-threads <span class="m">16</span>
</span></span></code></pre></div><p><strong>Environment Variables</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GEODE_MAX_CONNECTIONS</span><span class="o">=</span><span class="m">5000</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GEODE_CONNECTION_TIMEOUT</span><span class="o">=</span>60s
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GEODE_IDLE_TIMEOUT</span><span class="o">=</span>300s
</span></span></code></pre></div>
<h3 id="timeout-configuration" class="position-relative d-flex align-items-center group">
<span>Timeout Configuration</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="timeout-configuration"
aria-haspopup="dialog"
aria-label="Share link: Timeout Configuration">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="connection-timeout" class="position-relative d-flex align-items-center group">
<span>Connection Timeout</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="connection-timeout"
aria-haspopup="dialog"
aria-label="Share link: Connection Timeout">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Time limit for establishing a connection:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Server configuration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">network</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">connection_timeout</span><span class="p">:</span><span class="w"> </span><span class="l">30s</span><span class="w">
</span></span></span></code></pre></div><p><strong>Client Configuration</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Go
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">config</span> <span class="o">:=</span> <span class="o">&</span><span class="nx">geode</span><span class="p">.</span><span class="nx">Config</span><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">ConnectTimeout</span><span class="p">:</span> <span class="mi">30</span> <span class="o">*</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Python</span>
</span></span><span class="line"><span class="cl"><span class="n">config</span> <span class="o">=</span> <span class="n">ConnectionConfig</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">connect_timeout</span><span class="o">=</span><span class="mf">30.0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div>
<h4 id="query-timeout" class="position-relative d-flex align-items-center group">
<span>Query Timeout</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="query-timeout"
aria-haspopup="dialog"
aria-label="Share link: Query Timeout">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Time limit for query execution:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Server configuration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">performance</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">query_timeout</span><span class="p">:</span><span class="w"> </span><span class="l">300s </span><span class="w"> </span><span class="c"># 5 minutes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default_timeout</span><span class="p">:</span><span class="w"> </span><span class="l">60s</span><span class="w"> </span><span class="c"># Default for queries without explicit timeout</span><span class="w">
</span></span></span></code></pre></div><p><strong>Client-Side Timeout</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Go: Context-based timeout
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">ctx</span><span class="p">,</span> <span class="nx">cancel</span> <span class="o">:=</span> <span class="nx">context</span><span class="p">.</span><span class="nf">WithTimeout</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nf">Background</span><span class="p">(),</span> <span class="mi">60</span><span class="o">*</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">defer</span> <span class="nf">cancel</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">result</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">conn</span><span class="p">.</span><span class="nf">Query</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="s">"MATCH (n) RETURN count(n)"</span><span class="p">)</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Python: asyncio timeout</span>
</span></span><span class="line"><span class="cl"><span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">wait_for</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"MATCH (n) RETURN count(n)"</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="n">timeout</span><span class="o">=</span><span class="mf">60.0</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div>
<h4 id="idle-timeout" class="position-relative d-flex align-items-center group">
<span>Idle Timeout</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="idle-timeout"
aria-haspopup="dialog"
aria-label="Share link: Idle Timeout">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Close connections idle for this duration:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Server configuration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">network</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">idle_timeout</span><span class="p">:</span><span class="w"> </span><span class="l">600s </span><span class="w"> </span><span class="c"># 10 minutes</span><span class="w">
</span></span></span></code></pre></div><p><strong>Behavior</strong>:</p>
<ul>
<li>Server monitors idle connections</li>
<li>Connections inactive for <code>idle_timeout</code> are closed</li>
<li>Client pools automatically reconnect as needed</li>
<li>Prevents resource exhaustion from abandoned connections</li>
</ul>
<h4 id="transaction-timeout" class="position-relative d-flex align-items-center group">
<span>Transaction Timeout</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="transaction-timeout"
aria-haspopup="dialog"
aria-label="Share link: Transaction Timeout">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Time limit for transaction duration:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Server configuration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">transactions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="l">3600s </span><span class="w"> </span><span class="c"># 1 hour</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">idle_timeout</span><span class="p">:</span><span class="w"> </span><span class="l">300s </span><span class="w"> </span><span class="c"># 5 minutes</span><span class="w">
</span></span></span></code></pre></div><p><strong>Example</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Begin</span><span class="w"> </span><span class="py">transaction</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">BEGIN</span><span class="w"> </span><span class="py">TRANSACTION</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Long</span><span class="err">-</span><span class="py">running</span><span class="w"> </span><span class="py">operations</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">n</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">n</span><span class="err">.</span><span class="py">processed</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Must</span><span class="w"> </span><span class="py">complete</span><span class="w"> </span><span class="py">within</span><span class="w"> </span><span class="py">transaction_timeout</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">COMMIT</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="session-lifecycle" class="position-relative d-flex align-items-center group">
<span>Session Lifecycle</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="session-lifecycle"
aria-haspopup="dialog"
aria-label="Share link: Session Lifecycle">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="session-creation" class="position-relative d-flex align-items-center group">
<span>Session Creation</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="session-creation"
aria-haspopup="dialog"
aria-label="Share link: Session Creation">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Sessions are created automatically on first connection:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Go: database/sql creates sessions on first use
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">db</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">sql</span><span class="p">.</span><span class="nf">Open</span><span class="p">(</span><span class="s">"geode"</span><span class="p">,</span> <span class="s">"localhost:3141"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nx">_</span> <span class="p">=</span> <span class="nx">db</span><span class="p">.</span><span class="nf">Ping</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Session ID assigned automatically
</span></span></span></code></pre></div><p><strong>Session ID Format</strong>: UUID v4 (e.g., <code>550e8400-e29b-41d4-a716-446655440000</code>)</p>
<h4 id="session-state" class="position-relative d-flex align-items-center group">
<span>Session State</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="session-state"
aria-haspopup="dialog"
aria-label="Share link: Session State">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Each session maintains:</p>
<ol>
<li><strong>Parameters</strong>: User-defined variables ($param_name)</li>
<li><strong>Transaction State</strong>: Active transaction (if any)</li>
<li><strong>Current Graph</strong>: Selected graph context</li>
<li><strong>Time Zone</strong>: Session time zone setting</li>
<li><strong>Connection Metadata</strong>: Client info, connection time</li>
</ol>
<h4 id="session-persistence" class="position-relative d-flex align-items-center group">
<span>Session Persistence</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="session-persistence"
aria-haspopup="dialog"
aria-label="Share link: Session Persistence">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Session state persists until:</p>
<ul>
<li>Explicit <code>SESSION RESET</code> command</li>
<li>Connection closed</li>
<li>Session timeout (server-side)</li>
<li>Server restart (sessions not persisted across restarts)</li>
</ul>
<h4 id="session-cleanup" class="position-relative d-flex align-items-center group">
<span>Session Cleanup</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="session-cleanup"
aria-haspopup="dialog"
aria-label="Share link: Session Cleanup">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Graceful Cleanup</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Go: Explicit cleanup
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">defer</span> <span class="nx">db</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Python: Context manager</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">with</span> <span class="n">pool</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Session automatically cleaned up on exit</span>
</span></span><span class="line"><span class="cl"> <span class="k">pass</span>
</span></span></code></pre></div><p><strong>Server-Side Cleanup</strong>:</p>
<ul>
<li>Idle sessions cleaned up after <code>idle_timeout</code></li>
<li>Abandoned transactions rolled back after <code>transaction_timeout</code></li>
<li>Resources released (memory, file handles)</li>
</ul>
<h3 id="advanced-session-patterns" class="position-relative d-flex align-items-center group">
<span>Advanced Session Patterns</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="advanced-session-patterns"
aria-haspopup="dialog"
aria-label="Share link: Advanced Session Patterns">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="multi-tenant-sessions" class="position-relative d-flex align-items-center group">
<span>Multi-Tenant Sessions</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="multi-tenant-sessions"
aria-haspopup="dialog"
aria-label="Share link: Multi-Tenant Sessions">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Isolate tenants using session parameters:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Set</span><span class="w"> </span><span class="py">tenant</span><span class="w"> </span><span class="py">context</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$tenant_id</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">acme</span><span class="err">-</span><span class="py">corp</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Automatically</span><span class="w"> </span><span class="py">filter</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">tenant</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">n</span><span class="p">:</span><span class="nc">Customer</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">n</span><span class="err">.</span><span class="py">tenant_id</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nv">$tenant_id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">n</span><span class="w">
</span></span></span></code></pre></div><p><strong>Enforcement with Row-Level Security</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Policy</span><span class="w"> </span><span class="py">automatically</span><span class="w"> </span><span class="py">applied</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">POLICY</span><span class="w"> </span><span class="py">tenant_isolation</span><span class="w"> </span><span class="py">FOR</span><span class="w"> </span><span class="py">Customer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USING</span><span class="w"> </span><span class="p">(</span><span class="py">tenant_id</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">session_parameter</span><span class="p">(</span><span class="err">'</span><span class="py">tenant_id</span><span class="err">'</span><span class="p">))</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="session-based-caching" class="position-relative d-flex align-items-center group">
<span>Session-Based Caching</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="session-based-caching"
aria-haspopup="dialog"
aria-label="Share link: Session-Based Caching">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Cache query results in session:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">First</span><span class="w"> </span><span class="kd">query</span><span class="p">:</span><span class="w"> </span><span class="nc">expensive</span><span class="w"> </span><span class="nc">computation</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">TABLE</span><span class="w"> </span><span class="nv">$recent_orders</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">o</span><span class="p">:</span><span class="nc">Order</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHERE</span><span class="w"> </span><span class="py">o</span><span class="err">.</span><span class="py">timestamp</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">datetime</span><span class="p">()</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">duration</span><span class="p">(</span><span class="err">'</span><span class="py">P7D</span><span class="err">'</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">RETURN</span><span class="w"> </span><span class="py">o</span><span class="err">.</span><span class="py">id</span><span class="p">,</span><span class="w"> </span><span class="py">o</span><span class="err">.</span><span class="py">customer_id</span><span class="p">,</span><span class="w"> </span><span class="py">o</span><span class="err">.</span><span class="py">total</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Subsequent</span><span class="w"> </span><span class="py">queries</span><span class="p">:</span><span class="w"> </span><span class="nc">use</span><span class="w"> </span><span class="py">cached</span><span class="w"> </span><span class="py">results</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">c</span><span class="p">:</span><span class="nc">Customer</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">c</span><span class="err">.</span><span class="py">id</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="nv">$recent_orders</span><span class="err">.</span><span class="py">customer_id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">c</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">sum</span><span class="p">(</span><span class="nv">$recent_orders</span><span class="err">.</span><span class="py">total</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">total_spent</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="session-state-snapshots" class="position-relative d-flex align-items-center group">
<span>Session State Snapshots</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="session-state-snapshots"
aria-haspopup="dialog"
aria-label="Share link: Session State Snapshots">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Save and restore session state:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Save</span><span class="w"> </span><span class="py">current</span><span class="w"> </span><span class="py">state</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$saved_graph</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">CURRENT_GRAPH</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$saved_tz</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">CURRENT_TIMEZONE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Make</span><span class="w"> </span><span class="py">temporary</span><span class="w"> </span><span class="py">changes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USE</span><span class="w"> </span><span class="py">GRAPH</span><span class="w"> </span><span class="py">temp_graph</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">TIME</span><span class="w"> </span><span class="py">ZONE</span><span class="w"> </span><span class="err">'</span><span class="py">UTC</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Restore</span><span class="w"> </span><span class="py">state</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USE</span><span class="w"> </span><span class="py">GRAPH</span><span class="w"> </span><span class="nv">$saved_graph</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">TIME</span><span class="w"> </span><span class="py">ZONE</span><span class="w"> </span><span class="nv">$saved_tz</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="stateful-workflows" class="position-relative d-flex align-items-center group">
<span>Stateful Workflows</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="stateful-workflows"
aria-haspopup="dialog"
aria-label="Share link: Stateful Workflows">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Implement multi-step workflows:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Step</span><span class="w"> </span><span class="py">1</span><span class="p">:</span><span class="w"> </span><span class="nc">Initialize</span><span class="w"> </span><span class="py">workflow</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$workflow_id</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">uuid</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$step</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Step</span><span class="w"> </span><span class="py">2</span><span class="p">:</span><span class="w"> </span><span class="nc">Process</span><span class="w"> </span><span class="py">data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">n</span><span class="p">:</span><span class="nc">RawData</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">n</span><span class="err">.</span><span class="py">workflow_id</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nv">$workflow_id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">ProcessedData</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">uuid</span><span class="p">(),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">workflow_id</span><span class="p">:</span><span class="w"> </span><span class="nv">$workflow_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">step</span><span class="p">:</span><span class="w"> </span><span class="nv">$step</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">data</span><span class="p">:</span><span class="w"> </span><span class="nc">n</span><span class="err">.</span><span class="py">data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$step</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nv">$step</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Step</span><span class="w"> </span><span class="py">3</span><span class="p">:</span><span class="w"> </span><span class="nc">Validate</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">ProcessedData</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">workflow_id</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nv">$workflow_id</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">step</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nv">$step</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Validation</span><span class="w"> </span><span class="py">logic</span><span class="kd">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Step</span><span class="w"> </span><span class="py">4</span><span class="p">:</span><span class="w"> </span><span class="nc">Finalize</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">RESET</span><span class="w"> </span><span class="py">PARAMETERS</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="session-security" class="position-relative d-flex align-items-center group">
<span>Session Security</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="session-security"
aria-haspopup="dialog"
aria-label="Share link: Session Security">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="parameter-validation" class="position-relative d-flex align-items-center group">
<span>Parameter Validation</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="parameter-validation"
aria-haspopup="dialog"
aria-label="Share link: Parameter Validation">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Always validate session parameters:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="err">❌</span><span class="w"> </span><span class="py">Unsafe</span><span class="p">:</span><span class="w"> </span><span class="nc">No</span><span class="w"> </span><span class="py">validation</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$user_input</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nv">$raw_input</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="err">✅</span><span class="w"> </span><span class="py">Safe</span><span class="p">:</span><span class="w"> </span><span class="nc">Validate</span><span class="w"> </span><span class="py">before</span><span class="w"> </span><span class="py">setting</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$validated_age</span><span class="w"> </span><span class="p">=</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="nv">$user_input</span><span class="w"> </span><span class="err">></span><span class="p">=</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="nv">$user_input</span><span class="w"> </span><span class="err"><</span><span class="p">=</span><span class="w"> </span><span class="py">150</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="nv">$user_input</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="session-hijacking-prevention" class="position-relative d-flex align-items-center group">
<span>Session Hijacking Prevention</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="session-hijacking-prevention"
aria-haspopup="dialog"
aria-label="Share link: Session Hijacking Prevention">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Server-Side Protection</strong>:</p>
<ul>
<li>TLS 1.3 required (encrypted transport)</li>
<li>Session IDs cryptographically random</li>
<li>Session binding to client IP (optional)</li>
<li>Session timeout enforcement</li>
</ul>
<p><strong>Client-Side Best Practices</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Go: Secure configuration
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">config</span> <span class="o">:=</span> <span class="o">&</span><span class="nx">geode</span><span class="p">.</span><span class="nx">Config</span><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">TLS</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">VerifyCertificate</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">SessionTimeout</span><span class="p">:</span> <span class="mi">3600</span><span class="p">,</span> <span class="c1">// 1 hour
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span></code></pre></div>
<h4 id="sensitive-data-handling" class="position-relative d-flex align-items-center group">
<span>Sensitive Data Handling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="sensitive-data-handling"
aria-haspopup="dialog"
aria-label="Share link: Sensitive Data Handling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Avoid storing sensitive data in session parameters:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="err">❌</span><span class="w"> </span><span class="py">Unsafe</span><span class="p">:</span><span class="w"> </span><span class="nc">Password</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">session</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$password</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">secret123</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="err">✅</span><span class="w"> </span><span class="py">Safe</span><span class="p">:</span><span class="w"> </span><span class="nc">Use</span><span class="w"> </span><span class="py">secure</span><span class="w"> </span><span class="py">parameter</span><span class="w"> </span><span class="py">passing</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">username</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nv">$username</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">verify_password</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">password_hash</span><span class="p">,</span><span class="w"> </span><span class="nv">$password</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="nv">$password</span><span class="w"> </span><span class="py">passed</span><span class="w"> </span><span class="py">via</span><span class="w"> </span><span class="py">prepared</span><span class="w"> </span><span class="py">statement</span><span class="p">,</span><span class="w"> </span><span class="py">not</span><span class="w"> </span><span class="py">stored</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="monitoring-and-debugging" class="position-relative d-flex align-items-center group">
<span>Monitoring and Debugging</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="monitoring-and-debugging"
aria-haspopup="dialog"
aria-label="Share link: Monitoring and Debugging">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="session-inspection" class="position-relative d-flex align-items-center group">
<span>Session Inspection</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="session-inspection"
aria-haspopup="dialog"
aria-label="Share link: Session Inspection">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Query current session state:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Show</span><span class="w"> </span><span class="py">current</span><span class="w"> </span><span class="py">session</span><span class="w"> </span><span class="py">parameters</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SHOW</span><span class="w"> </span><span class="py">SESSION</span><span class="w"> </span><span class="py">PARAMETERS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Show</span><span class="w"> </span><span class="py">current</span><span class="w"> </span><span class="py">graph</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SHOW</span><span class="w"> </span><span class="py">CURRENT_GRAPH</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Show</span><span class="w"> </span><span class="py">time</span><span class="w"> </span><span class="py">zone</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SHOW</span><span class="w"> </span><span class="py">TIME</span><span class="w"> </span><span class="py">ZONE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Show</span><span class="w"> </span><span class="py">session</span><span class="w"> </span><span class="py">info</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SHOW</span><span class="w"> </span><span class="py">SESSION</span><span class="w"> </span><span class="py">INFO</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="session-metrics" class="position-relative d-flex align-items-center group">
<span>Session Metrics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="session-metrics"
aria-haspopup="dialog"
aria-label="Share link: Session Metrics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Monitor session activity (server-side):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Prometheus metrics endpoint</span>
</span></span><span class="line"><span class="cl">curl http://localhost:9090/metrics <span class="p">|</span> grep session
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Example metrics:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># geode_active_sessions{} 42</span>
</span></span><span class="line"><span class="cl"><span class="c1"># geode_session_create_total{} 1234</span>
</span></span><span class="line"><span class="cl"><span class="c1"># geode_session_timeout_total{} 5</span>
</span></span><span class="line"><span class="cl"><span class="c1"># geode_avg_session_duration_seconds{} 180.5</span>
</span></span></code></pre></div>
<h4 id="session-logging" class="position-relative d-flex align-items-center group">
<span>Session Logging</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="session-logging"
aria-haspopup="dialog"
aria-label="Share link: Session Logging">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Enable session debugging:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># geode.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">logging</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">level</span><span class="p">:</span><span class="w"> </span><span class="l">debug</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">modules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">session</span><span class="p">:</span><span class="w"> </span><span class="l">trace</span><span class="w">
</span></span></span></code></pre></div><p><strong>Log Output</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">[SESSION] Created session: 550e8400-e29b-41d4-a716-446655440000
</span></span><span class="line"><span class="cl">[SESSION] Set parameter: $username = 'alice'
</span></span><span class="line"><span class="cl">[SESSION] Transaction started
</span></span><span class="line"><span class="cl">[SESSION] Transaction committed
</span></span><span class="line"><span class="cl">[SESSION] Idle timeout: closing session
</span></span></code></pre></div>
<h3 id="troubleshooting" class="position-relative d-flex align-items-center group">
<span>Troubleshooting</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="troubleshooting"
aria-haspopup="dialog"
aria-label="Share link: Troubleshooting">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="connection-pool-exhaustion" class="position-relative d-flex align-items-center group">
<span>Connection Pool Exhaustion</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="connection-pool-exhaustion"
aria-haspopup="dialog"
aria-label="Share link: Connection Pool Exhaustion">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Symptom</strong>: “Connection pool exhausted” error</p>
<p><strong>Solutions</strong>:</p>
<ol>
<li>
<p>Increase <code>max_connections</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">config</span><span class="p">.</span><span class="nx">MaxConnections</span> <span class="p">=</span> <span class="mi">200</span>
</span></span></code></pre></div></li>
<li>
<p>Decrease <code>idle_timeout</code> to reclaim connections faster:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">config</span><span class="p">.</span><span class="nx">IdleTimeout</span> <span class="p">=</span> <span class="mi">5</span> <span class="o">*</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Minute</span>
</span></span></code></pre></div></li>
<li>
<p>Check for connection leaks:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Always close connections
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">defer</span> <span class="nx">conn</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span></code></pre></div></li>
</ol>
<h4 id="session-timeout" class="position-relative d-flex align-items-center group">
<span>Session Timeout</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="session-timeout"
aria-haspopup="dialog"
aria-label="Share link: Session Timeout">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Symptom</strong>: “Session expired” or “Session not found” error</p>
<p><strong>Solutions</strong>:</p>
<ol>
<li>
<p>Increase session timeout:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">network</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">idle_timeout</span><span class="p">:</span><span class="w"> </span><span class="l">1800s </span><span class="w"> </span><span class="c"># 30 minutes</span><span class="w">
</span></span></span></code></pre></div></li>
<li>
<p>Use keep-alive queries:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">ticker</span> <span class="o">:=</span> <span class="nx">time</span><span class="p">.</span><span class="nf">NewTicker</span><span class="p">(</span><span class="mi">5</span> <span class="o">*</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Minute</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">go</span> <span class="kd">func</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="k">range</span> <span class="nx">ticker</span><span class="p">.</span><span class="nx">C</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">_</span><span class="p">,</span> <span class="nx">_</span> <span class="p">=</span> <span class="nx">db</span><span class="p">.</span><span class="nf">QueryContext</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="s">"RETURN 1"</span><span class="p">)</span> <span class="c1">// Keep-alive
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}()</span>
</span></span></code></pre></div></li>
<li>
<p>Re-establish connection on timeout:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="k">if</span> <span class="nx">errors</span><span class="p">.</span><span class="nf">Is</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">geode</span><span class="p">.</span><span class="nx">ErrBadConn</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">db</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">sql</span><span class="p">.</span><span class="nf">Open</span><span class="p">(</span><span class="s">"geode"</span><span class="p">,</span> <span class="nx">address</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">_</span> <span class="p">=</span> <span class="nx">db</span><span class="p">.</span><span class="nf">Ping</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></li>
</ol>
<h4 id="parameter-not-found" class="position-relative d-flex align-items-center group">
<span>Parameter Not Found</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="parameter-not-found"
aria-haspopup="dialog"
aria-label="Share link: Parameter Not Found">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Symptom</strong>: “Parameter $name not found” error</p>
<p><strong>Solutions</strong>:</p>
<ol>
<li>
<p>Set parameter before use:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="nv">$name</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">Alice</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">n</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w"> </span><span class="py">WHERE</span><span class="w"> </span><span class="py">n</span><span class="err">.</span><span class="py">name</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nv">$name</span><span class="w"> </span><span class="py">RETURN</span><span class="w"> </span><span class="py">n</span><span class="w">
</span></span></span></code></pre></div></li>
<li>
<p>Use <code>IF NOT EXISTS</code> for default values:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">SESSION</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">VALUE</span><span class="w"> </span><span class="py">IF</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">EXISTS</span><span class="w"> </span><span class="nv">$limit</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">100</span><span class="w">
</span></span></span></code></pre></div></li>
<li>
<p>Check parameter scope (session-local):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Different</span><span class="w"> </span><span class="py">sessions</span><span class="w"> </span><span class="py">have</span><span class="w"> </span><span class="py">different</span><span class="w"> </span><span class="py">parameters</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SESSION</span><span class="w"> </span><span class="py">RESET</span><span class="w"> </span><span class="py">PARAMETERS</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Clears</span><span class="w"> </span><span class="py">all</span><span class="w">
</span></span></span></code></pre></div></li>
</ol>
<h3 id="best-practices" class="position-relative d-flex align-items-center group">
<span>Best Practices</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="best-practices"
aria-haspopup="dialog"
aria-label="Share link: Best Practices">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="connection-lifecycle" class="position-relative d-flex align-items-center group">
<span>Connection Lifecycle</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="connection-lifecycle"
aria-haspopup="dialog"
aria-label="Share link: Connection Lifecycle">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Use connection pooling</strong> for multi-user applications</li>
<li><strong>Always close connections</strong> explicitly (defer in Go, context managers in Python)</li>
<li><strong>Set appropriate timeouts</strong> based on workload</li>
<li><strong>Monitor pool metrics</strong> (active connections, wait time, etc.)</li>
</ol>
<h4 id="parameter-management" class="position-relative d-flex align-items-center group">
<span>Parameter Management</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="parameter-management"
aria-haspopup="dialog"
aria-label="Share link: Parameter Management">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Name parameters clearly</strong>: <code>$user_id</code> not <code>$x</code></li>
<li><strong>Validate inputs</strong> before setting parameters</li>
<li><strong>Use IF NOT EXISTS</strong> for default values</li>
<li><strong>Reset parameters</strong> after workflows complete</li>
<li><strong>Document parameter contracts</strong> for team consistency</li>
</ol>
<h4 id="performance-optimization" class="position-relative d-flex align-items-center group">
<span>Performance Optimization</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="performance-optimization"
aria-haspopup="dialog"
aria-label="Share link: Performance Optimization">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Reuse connections</strong> via pooling (significantly faster than creating new connections)</li>
<li><strong>Batch queries</strong> when possible to reduce round-trips</li>
<li><strong>Use prepared statements</strong> for repeated queries</li>
<li><strong>Set realistic timeouts</strong> (too short = failures, too long = resource waste)</li>
<li><strong>Monitor session duration</strong> and optimize long-running sessions</li>
</ol>
<h4 id="security-hardening" class="position-relative d-flex align-items-center group">
<span>Security Hardening</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="security-hardening"
aria-haspopup="dialog"
aria-label="Share link: Security Hardening">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Always use TLS</strong> for production</li>
<li><strong>Validate all session parameters</strong> from user input</li>
<li><strong>Implement session timeout</strong> to limit exposure</li>
<li><strong>Audit session creation/destruction</strong> for compliance</li>
<li><strong>Use row-level security</strong> with session parameters for multi-tenancy</li>
</ol>
<h3 id="next-steps" class="position-relative d-flex align-items-center group">
<span>Next Steps</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="next-steps"
aria-haspopup="dialog"
aria-label="Share link: Next Steps">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p><strong>Explore More</strong>:</p>
<ul>
<li><a
href="/docs/transactions/overview/"
>Transaction Management</a>
- ACID transactions</li>
<li><a
href="/docs/client-libraries/"
>Connection Pooling</a>
- Client-specific pooling</li>
<li><a
href="/docs/security/overview/"
>Security Overview</a>
- Authentication and authorization</li>
</ul>
<p><strong>Related Topics</strong>:</p>
<ul>
<li><a
href="/docs/security/overview/#row-level-security"
>Row-Level Security</a>
- Policy-based access control</li>
<li><a
href="/docs/ops/observability/"
>Monitoring</a>
- Session metrics and monitoring</li>
<li><a
href="/docs/query/performance-tuning/"
>Performance Tuning</a>
- Optimize query and session performance</li>
</ul>
<p><strong>Client Libraries</strong>:</p>
<ul>
<li><a
href="/docs/client-libraries/go-client/"
>Go Client</a>
- Go connection pooling</li>
<li><a
href="/docs/client-libraries/python-client/"
>Python Client</a>
- Python async pooling</li>
<li><a
href="/docs/client-libraries/rust-client/"
>Rust Client</a>
- Rust tokio pooling</li>
</ul>
<hr>
<p><strong>ISO Standard</strong>: ISO/IEC 39075:2024 §15.3-15.4
<strong>Session Types</strong>: GRAPH, VALUE, BINDING TABLE parameters
<strong>Pooling</strong>: All 5 client libraries (Go, Python, Rust, Node.js, Zig)
<strong>Status</strong>: Production-ready</p>
Session Management Guide
Complete guide to Geode session management including session parameters, connection pooling, timeout configuration, lifecycle management, and best practices.