JDBC Nodes
Crux nodes can use JDBC databases to store their transaction logs and/or document stores.
Example configuration
JDBC transaction logs and document stores depend on a 'connection pool' component - if you use both, they can share the same connection pool.
Connection pools require a JDBC 'dialect' - out of the box, Crux supports the following:
-
H2:
crux.jdbc.h2/->dialect
-
MySQL:
crux.jdbc.mysql/->dialect
-
Microsoft SQL Server:
crux.jdbc.mssql/->dialect
-
Oracle:
crux.jdbc.oracle/->dialect
-
PostgreSQL:
crux.jdbc.psql/->dialect
-
SQLite:
crux.jdbc.sqlite/->dialect
Each of these also require an additional dependency to pull in the relevant JDBC driver - see the Crux JDBC project.clj for our latest dependencies.
The connection pool also requires a db-spec
- a map containing either a full jdbcUrl
or its component parts, including dbtype
(provided by the dialect by default), host
, port
, dbname
.
Any other attributes supplied (user
, password
, say) are appended to the URL as query parameters - see your individual JDBC driver for full details.
Crux uses HikariCP to provide connection pools.
You can pass options directly to HikariConfig
via pool-opts
- for example, to setMaximumPoolSize
, add maximumPoolSize
to your configuration.
JDBC as a Transaction Log
{ "crux/tx-log": { "crux/module": "crux.jdbc/->tx-log", "connection-pool": { "dialect": { "crux/module": "crux.jdbc.psql/->dialect" }, "pool-opts": { ... }, "db-spec": { ... } }, "poll-sleep-duration": "PT1S" }, ... }
{:crux/tx-log {:crux/module 'crux.jdbc/->tx-log :connection-pool {:dialect {:crux/module 'crux.jdbc.psql/->dialect} :pool-opts { ... } :db-spec { ... }} :poll-sleep-duration (Duration/ofSeconds 1)} ...}
{:crux/tx-log {:crux/module crux.jdbc/->tx-log :connection-pool {:dialect {:crux/module crux.jdbc.psql/->dialect} :pool-opts { ... } :db-spec { ... }} :poll-sleep-duration "PT1S"} ...}
If you do not want the local node to index transactions, you can use the crux.jdbc/->ingest-only-tx-log
module.
JDBC as a Document Store
{ "crux/document-store": { "crux/module": "crux.jdbc/->document-store", "connection-pool": { "dialect": { "crux/module": "crux.jdbc.psql/->dialect" }, "pool-opts": { ... }, "db-spec": { ... } } }, ... }
{:crux/document-store {:crux/module 'crux.jdbc/->document-store :connection-pool {:dialect {:crux/module 'crux.jdbc.psql/->dialect} :pool-opts { ... } :db-spec { ... }}} ...}
{:crux/document-store {:crux/module crux.jdbc/->document-store :connection-pool {:dialect {:crux/module crux.jdbc.psql/->dialect} :pool-opts { ... } :db-spec { ... }}} ...}
Sharing connection pools
If you use JDBC for both the transaction log and document store, you can share the same connection pool between the two modules as follows:
{ "crux.jdbc/connection-pool": { "dialect": { "crux/module": "crux.jdbc.psql/->dialect" }, "pool-opts": { ... }, "db-spec": { ... } }, "crux/document-store": { "crux/module": "crux.jdbc/->document-store", "connection-pool": "crux.jdbc/connection-pool" }, "crux/tx-log": { "crux/module": "crux.jdbc/->tx-log", "connection-pool": "crux.jdbc/connection-pool" }, ... }
{:crux.jdbc/connection-pool {:dialect {:crux/module 'crux.jdbc.psql/->dialect} :pool-opts { ... } :db-spec { ... }} :crux/tx-log {:crux/module 'crux.jdbc/->tx-log :connection-pool :crux.jdbc/connection-pool} :crux/document-store {:crux/module 'crux.jdbc/->document-store :connection-pool :crux.jdbc/connection-pool} ...}
{:crux.jdbc/connection-pool {:dialect {:crux/module crux.jdbc.psql/->dialect} :pool-opts { ... } :db-spec { ... }} :crux/tx-log {:crux/module crux.jdbc/->tx-log :connection-pool :crux.jdbc/connection-pool} :crux/document-store {:crux/module crux.jdbc/->document-store :connection-pool :crux.jdbc/connection-pool} ...}