<!-- 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&amp;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">&lt;</span><span class="py">graph_expression</span><span class="err">&gt;</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">&#39;</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">&lt;</span><span class="py">expression</span><span class="err">&gt;</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">&#39;</span><span class="py">alice</span><span class="err">&#39;</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">&gt;</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">&lt;</span><span class="py">binding_table_ref</span><span class="err">&gt;</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">&#39;</span><span class="py">America</span><span class="err">/</span><span class="py">New_York</span><span class="err">&#39;</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">&#34;geodedb.com/geode&#34;</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">&amp;</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">&#34;localhost:3141&#34;</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">&#34;MATCH (n:Person) RETURN n LIMIT 10&#34;</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">&#39;localhost&#39;</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">&#34;MATCH (n:Person) RETURN n LIMIT 10&#34;</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">&#34;localhost&#34;</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">&#34;MATCH (n:Person) RETURN n LIMIT 10&#34;</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">&amp;</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">&#34;MATCH (n) RETURN count(n)&#34;</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">&#34;MATCH (n) RETURN count(n)&#34;</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">&#34;geode&#34;</span><span class="p">,</span> <span class="s">&#34;localhost:3141&#34;</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">&#39;</span><span class="py">acme</span><span class="err">-</span><span class="py">corp</span><span class="err">&#39;</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">&#39;</span><span class="py">tenant_id</span><span class="err">&#39;</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">&gt;</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">&#39;</span><span class="py">P7D</span><span class="err">&#39;</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">&#39;</span><span class="py">UTC</span><span class="err">&#39;</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">&gt;</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">&lt;</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">&amp;</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">&#39;</span><span class="py">secret123</span><span class="err">&#39;</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 = &#39;alice&#39; </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>: &ldquo;Connection pool exhausted&rdquo; 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>: &ldquo;Session expired&rdquo; or &ldquo;Session not found&rdquo; 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">&#34;RETURN 1&#34;</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">&#34;geode&#34;</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>: &ldquo;Parameter $name not found&rdquo; 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">&#39;</span><span class="py">Alice</span><span class="err">&#39;</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>