title | summary | toc | |
---|---|---|---|
Build a Clojure App with CockroachDB and java.jdbc |
Learn how to use CockroachDB from a simple Clojure application with a low-level client driver. |
true |
false |
This tutorial shows you how build a simple Clojure application with CockroachDB using leiningen and the Closure java.jdbc driver.
We have tested the Clojure java.jdbc driver in conjunction with the PostgreSQL JDBC driver enough to claim beta-level support. If you encounter problems, please open an issue with details to help us make progress toward full support.
{% include {{page.version.version}}/app/before-you-begin.md %}
Install the Clojure lein
utility as described in its official documentation.
{% include {{page.version.version}}/app/create-maxroach-user-and-bank-database.md %}
Create a certificate and key for the maxroach
user by running the following command. The code samples will run as this user.
New in v19.1: Pass the --also-generate-pkcs8-key
flag to generate a key in PKCS#8 format, which is the standard key encoding format in Java. In this case, the generated PKCS8 key will be named client.maxroach.key.pk8
.
{% include copy-clipboard.html %}
$ cockroach cert create-client maxroach --certs-dir=certs --ca-key=my-safe-directory/ca.key --also-generate-pkcs8-key
As the maxroach
user, use the built-in SQL client to create an accounts
table in the new database.
{% include copy-clipboard.html %}
$ cockroach sql \
--certs-dir=certs \
--database=bank \
--user=maxroach \
-e 'CREATE TABLE accounts (id INT PRIMARY KEY, balance INT)'
Now that you have a database and a user, you'll run code to create a table and insert some rows, and then you'll run code to read and update values as an atomic transaction.
-
Create a new directory
myapp
. -
Create a file
myapp/project.clj
and populate it with the following code, or download it directly.{% include copy-clipboard.html %}
{% include {{ page.version.version }}/app/project.clj %}
-
Create a file
myapp/src/test/util.clj
and populate it with the code from this file. Be sure to place the file in the subdirectorysrc/test
in your project.
First, use the following code to connect as the maxroach
user and execute some basic SQL statements, inserting rows and reading and printing the rows.
Create a file myapp/src/test/test.clj
and copy the code below to it, or download it directly. Be sure to rename this file to test.clj
in the subdirectory src/test
in your project.
{% include copy-clipboard.html %}
{% include {{ page.version.version }}/app/basic-sample.clj %}
Run with:
{% include copy-clipboard.html %}
$ lein run
Next, use the following code to again connect as the maxroach
user but this time execute a batch of statements as an atomic transaction to transfer funds from one account to another, where all included statements are either committed or aborted.
Copy the code below to myapp/src/test/test.clj
or
download it directly. Again, preserve the file name test.clj
.
{{site.data.alerts.callout_info}} CockroachDB may require the client to retry a transaction in case of read/write contention. CockroachDB provides a generic retry function that runs inside a transaction and retries it as needed. You can copy and paste the retry function from here into your code. {{site.data.alerts.end}}
{% include copy-clipboard.html %}
{% include {{ page.version.version }}/app/txn-sample.clj %}
Run with:
{% include copy-clipboard.html %}
$ lein run
After running the code, use the built-in SQL client to verify that funds were transferred from one account to another:
{% include copy-clipboard.html %}
$ cockroach sql --certs-dir=certs -e 'SELECT id, balance FROM accounts' --database=bank
id | balance
+----+---------+
1 | 900
2 | 350
(2 rows)
{% include {{page.version.version}}/app/insecure/create-maxroach-user-and-bank-database.md %}
As the maxroach
user, use the built-in SQL client to create an accounts
table in the new database.
{% include copy-clipboard.html %}
$ cockroach sql --insecure \
--database=bank \
--user=maxroach \
-e 'CREATE TABLE accounts (id INT PRIMARY KEY, balance INT)'
Now that you have a database and a user, you'll run code to create a table and insert some rows, and then you'll run code to read and update values as an atomic transaction.
-
Create a new directory
myapp
. -
Create a file
myapp/project.clj
and populate it with the following code, or download it directly.{% include copy-clipboard.html %}
{% include {{ page.version.version }}/app/project.clj %}
-
Create a file
myapp/src/test/util.clj
and populate it with the code from this file. Be sure to place the file in the subdirectorysrc/test
in your project.
First, use the following code to connect as the maxroach
user and execute some basic SQL statements, inserting rows and reading and printing the rows.
Create a file myapp/src/test/test.clj
and copy the code below to it, or download it directly. Be sure to rename this file to test.clj
in the subdirectory src/test
in your project.
{% include copy-clipboard.html %}
{% include {{ page.version.version }}/app/insecure/basic-sample.clj %}
Run with:
{% include copy-clipboard.html %}
$ lein run
Next, use the following code to again connect as the maxroach
user but this time execute a batch of statements as an atomic transaction to transfer funds from one account to another, where all included statements are either committed or aborted.
Copy the code below to myapp/src/test/test.clj
or
download it directly. Again, preserve the file name test.clj
.
{{site.data.alerts.callout_info}} CockroachDB may require the client to retry a transaction in case of read/write contention. CockroachDB provides a generic retry function that runs inside a transaction and retries it as needed. You can copy and paste the retry function from here into your code. {{site.data.alerts.end}}
{% include copy-clipboard.html %}
{% include {{ page.version.version }}/app/insecure/txn-sample.clj %}
Run with:
{% include copy-clipboard.html %}
$ lein run
After running the code, use the built-in SQL client to verify that funds were transferred from one account to another:
{% include copy-clipboard.html %}
$ cockroach sql --insecure -e 'SELECT id, balance FROM accounts' --database=bank
id | balance
+----+---------+
1 | 900
2 | 350
(2 rows)
Read more about using the Clojure java.jdbc driver.
{% include {{ page.version.version }}/app/see-also-links.md %}