Skip to content

Session Management Quick Reference

Session Management Quick Reference

Quick reference guide for HeliosDB Nano session management and monitoring.

Quick Commands

View All Sessions

-- Generic (all protocols)
SELECT * FROM helios_sessions;
-- PostgreSQL style
SELECT * FROM pg_stat_activity;
-- Oracle style
SELECT * FROM v$session;

View Active Queries

-- All active queries
SELECT session_id, username, current_query
FROM helios_sessions
WHERE state = 'active';
-- PostgreSQL style
SELECT pid, usename, query
FROM pg_stat_activity
WHERE state = 'active';
-- Oracle style
SELECT sid, username, sql_text
FROM v$session
WHERE status = 'ACTIVE';

Count Sessions by Protocol

SELECT protocol, COUNT(*) AS session_count
FROM helios_sessions
GROUP BY protocol;

Find Idle Sessions

-- Sessions idle for more than 5 minutes
SELECT session_id, username, last_activity
FROM helios_sessions
WHERE state = 'idle'
AND (CURRENT_TIMESTAMP - last_activity) > INTERVAL '5 minutes';

Session States

StateDescription
activeCurrently executing a query
idleConnected but not executing
idle_in_transactionIdle within a transaction block

System Table Schema

CREATE TABLE helios_sessions (
session_id INT8 PRIMARY KEY,
protocol TEXT NOT NULL,
username TEXT NOT NULL,
client_address TEXT NOT NULL,
client_port INT4 NOT NULL,
connect_time TIMESTAMP NOT NULL,
last_activity TIMESTAMP NOT NULL,
current_query TEXT,
state TEXT NOT NULL
);

Rust API

Register Session

let session_id = registry.register_session(
ProtocolType::PostgreSQL,
"username".to_string(),
"127.0.0.1".to_string(),
5432,
)?;

Update Query

registry.update_session_query(session_id, "SELECT * FROM users".to_string())?;

Clear Query

registry.clear_session_query(session_id)?;

Unregister Session

registry.unregister_session(session_id)?;

Get All Sessions

let sessions = registry.get_all_sessions()?;
for session in sessions {
println!("{:?}", session);
}

Python Client Examples

PostgreSQL

import psycopg2
conn = psycopg2.connect(
host='localhost',
port=5432,
database='heliosdb',
user='myuser',
password='mypass'
)
cursor = conn.cursor()
# View sessions
cursor.execute("SELECT * FROM pg_stat_activity")
sessions = cursor.fetchall()
# View my session
cursor.execute("SELECT pg_backend_pid()")
my_pid = cursor.fetchone()[0]

Oracle

import oracledb
conn = oracledb.connect(
user='myuser',
password='mypass',
dsn='localhost:1521/heliosdb'
)
cursor = conn.cursor()
# View sessions
cursor.execute("SELECT * FROM v$session WHERE username IS NOT NULL")
sessions = cursor.fetchall()

Monitoring Queries

Session Activity Report

SELECT
protocol,
COUNT(*) AS total_sessions,
SUM(CASE WHEN state = 'active' THEN 1 ELSE 0 END) AS active,
SUM(CASE WHEN state = 'idle' THEN 1 ELSE 0 END) AS idle
FROM helios_sessions
GROUP BY protocol;

Top Users by Session Count

SELECT
username,
COUNT(*) AS session_count,
MAX(last_activity) AS last_seen
FROM helios_sessions
GROUP BY username
ORDER BY session_count DESC
LIMIT 10;

Long-Running Queries

SELECT
session_id,
username,
current_query,
(CURRENT_TIMESTAMP - last_activity) AS duration
FROM helios_sessions
WHERE state = 'active'
ORDER BY duration DESC
LIMIT 10;

Troubleshooting

Problem: No sessions showing

Check: Is the server running?

Terminal window
nc -z localhost 5432 # PostgreSQL
nc -z localhost 1521 # Oracle

Check: Are connections authenticated?

SELECT COUNT(*) FROM helios_sessions;

Problem: Sessions stuck in ‘active’

Solution: Clear stale sessions

-- Identify stale sessions (active > 1 hour)
SELECT session_id, username, current_query
FROM helios_sessions
WHERE state = 'active'
AND (CURRENT_TIMESTAMP - last_activity) > INTERVAL '1 hour';

Problem: Too many idle sessions

Solution: Configure connection timeout

[session]
idle_timeout_seconds = 300 # 5 minutes

Common Patterns

Session Lifecycle

// 1. Register on connect
let session_id = registry.register_session(...)?;
// 2. Track queries
loop {
let query = receive_query();
registry.update_session_query(session_id, query.clone())?;
execute_query(query)?;
registry.clear_session_query(session_id)?;
}
// 3. Unregister on disconnect
registry.unregister_session(session_id)?;

Query Tracking Pattern

pub async fn execute_with_tracking(
&mut self,
query: &str,
session_id: i64,
registry: &SessionRegistry,
) -> Result<ExecutionResult> {
registry.update_session_query(session_id, query.to_string())?;
let result = self.execute(query).await;
registry.clear_session_query(session_id)?;
result
}

View Mappings

PostgreSQL → HeliosDB

PostgreSQLHeliosDB
pg_stat_activity.pidhelios_sessions.session_id
pg_stat_activity.usenamehelios_sessions.username
pg_stat_activity.statehelios_sessions.state
pg_stat_activity.queryhelios_sessions.current_query

Oracle → HeliosDB

OracleHeliosDB
v$session.sidhelios_sessions.session_id
v$session.usernamehelios_sessions.username
v$session.statushelios_sessions.state (mapped)
v$session.sql_texthelios_sessions.current_query

Configuration

[session]
# Maximum sessions per user
max_sessions_per_user = 10
# Maximum total sessions
max_total_sessions = 1000
# Idle timeout in seconds
idle_timeout_seconds = 3600
# Enable query history tracking
track_query_history = true
[monitoring]
# Enable session tracking
session_tracking = true
# Log session events
log_session_events = true
# Log query execution
log_query_execution = true

Performance Tips

  1. Use indexes: System tables should have indexes on frequently queried columns
  2. Limit results: Always use LIMIT when querying session tables
  3. Batch updates: Update session state in batches when possible
  4. Monitor locks: Watch for lock contention on session registry
  5. Clean idle sessions: Regularly clean up idle sessions

Testing

Run protocol tests with session tracking:

Terminal window
cd tests/protocol_tests
./run_tests.sh

Test individual protocols:

Terminal window
python3 test_postgres.py # PostgreSQL
python3 test_oracle.py # Oracle