Skip to main content

Connection Pool

Embedded DuckDB connection management with Arrow-native streaming support.


Overview

ConnectionPool provides a high-performance, thread-safe way to execute SQL against an embedded DuckDB instance.

Unlike traditional pools, this implementation:

  • Uses DuckDB's native connection duplication
  • Streams results via Apache Arrow
  • Avoids heavy JDBC object creation

Key Features

  • Singleton-managed DuckDB instance
  • Connection duplication per request
  • Arrow IPC streaming enabled by default
  • Automatic statement and reader cleanup
  • Batch execution helpers
  • Record mapping utilities

Basic Usage

Execute a Query

ConnectionPool.execute("SELECT 1");
ConnectionPool.printResult("SELECT * FROM users");

Collect a Single Value

Long count = ConnectionPool.collectFirst("SELECT COUNT(*) FROM t", Long.class);

Arrow Reader

try (BufferAllocator allocator = new RootAllocator()) {
ArrowReader reader = ConnectionPool.getReader(
connection,
allocator,
"SELECT * FROM users",
1000
);
}

Arrow readers stream data in batches and must always be closed.


Batch Execution

ConnectionPool.executeBatch(new String[] {
"CREATE TABLE t(a INT)",
"INSERT INTO t VALUES (1)"
});

Transactional batch execution is also supported.


Configuration

Properties are loaded from:

src/main/resources/duckdb.properties

Common options:

duckdb.database=memory
duckdb.config.threads=4
duckdb.config.enable_external_access=true

Production Notes

  • Designed for embedded DuckDB only
  • Not a network pool
  • Prefer Arrow readers over ResultSet
  • Always close readers and connections