Using a relational database
Last updated
Last updated
Out-of-the-box, Orbeon Forms includes an SQLite embedded database with multiple demo forms. This setup is designed for a quick start, but for development or production use, you should configure Orbeon Forms to utilize a separate relational database.
The setup for the relational persistence layers is a 3-step process. The first two steps are database specific, so please refer to the relevant subsections below.
Database setup: You set up the database and create a schema with a few tables. This is typically be done by a DBA.
Application server setup: You configure your application server to use the database.
Orbeon Forms setup: You configure Orbeon Forms to use the relevant persistence layer.
You can find more about the relational database schema in the page.
Support for Oracle, SQL Server, and DB2 are features.
See also .
Make sure that Oracle's Database Character Set is set to AL32UTF8
, also as . You can see you database parameters by running the following query: select * from nls_database_parameters
, and the Database Character Set is identified by nls_characterset
.
Create a user/schema in Oracle, for instance with the commands below. In this example "all privileges" are granted to the newly created user/schema, which is not strictly required. You might want to fine-tune permissions on your system as appropriate. If you had already created this schema and that the definition changed, or that you want to restart from scratch for some other reason, you can first delete the schema with all the data it contains with drop user orbeon cascade
.
Run the following DDL to create or update your Orbeon database, and note that if upgrading to 2016.2, you need to .
2024.1 and newer
2022.1 to 2023.1
With Oracle 11.2, XMLType
values are stored by default using the binary XML storage. The binary XML storage has numerous benefits over the basic file storage. In many respect, it is the "proper" way to store XML. However, we found that Oracle fails to properly save some documents when the binary XML storage is used. In particular, when documents have attributes with long values (several thousands of characters), when retrieving the document, the value of some attributes is missing. For this reason, until this issue is solved by Oracle, we recommend you store XMLType
values as "basic file", per the above DDL.
[SINCE Orbeon Forms 2018.2]
[UP TO Orbeon Forms 2018.1]
Create a new user orbeon
. Orbeon Forms will connect to MySQL as that user.
Create a new schema orbeon
. This schema will contains the tables used to store your forms definitions and form data.
If needed, grant permissions, for example:
2024.1 and newer
2022.1 to 2023.1
[SINCE Orbeon Forms 4.6]
Orbeon Forms relies on SQL Server's full-text search, which is included out-of-the-box in all SQL Server editions, except the Express and Express with Tools. If you're using one of those two editions of SQL Server, you might want to look into getting Express with Advanced Services.
2024.1 and newer
2023.1
2022.1
usql
to create an orbeon
databaseYou can create an orbeon
database and run the DDL to create the tables and indices used by Orbeon Forms using the command-line tool usql
. Follow these steps, making sure to replace PASSWORD
with the password for the sa
user and VERSION
with your desired DDL version.
usql mssql://sa:PASSWORD@localhost/
CREATE DATABASE orbeon;
\q
usql mssql://sa:PASSWORD@localhost/orbeon
\i sqlserver-VERSION.sql
After upgrading your database, we recommend verifying that you have all the latest indexes. Use the following SQL query to get a list of indexes in your database. You can then compare that list to the indexes defined in the latest DDL linked above.
[SINCE Orbeon Forms 4.8]
2024.1 and newer
2023.1
2022.1
[SINCE Orbeon Forms 4.3]
2022.1 and newer
When using Tomcat, you setup a JDBC data source for your database instance either:
in server.xml
(not recommended by the Tomcat documentation because it is less flexible)
or in a separate context XML file (such as orbeon.xml
) for the web app (recommended).
In both cases, you define a <Resource>
element containing several configuration attributes. We provide examples below for all the databases covered.
Here is a typical example:
If you create a separate context file:
Give it the name of your web app, for example orbeon.xml
.
Make sure the context is placed in the appropriate Tomcat folder.
Here is an example of a context file. Note the enclosing <Context>
element:
See also the following external links:
Assuming:
${HOST}
: the host Oracle server is running on, for example oracle.acme.com
${PORT}
: the port the Oracle server is running on, for example 1521
${INSTANCE}
: the instance name, for example orcl
${USERNAME}
: the user/schema, for example orbeon
${PASSWORD}
: the password, for example password
Put the Oracle jar file that contains the JDBC driver (e.g. ojdbc6_g.jar
, xdb.jar
, and xmlparserv2.jar
) in the appropriate directory for your application server (on Tomcat: common/lib
or simply lib
, depending on the version). If you don't already have it, you can download the Oracle JDBC driver from the Oracle site.
Place ojdbc5_g.jar
into server/default/lib/
.
Create an Oracle datasource as server/default/deploy/oracle-ds.xml
, for example:
Update WEB-INF/jboss-web.xml
to:
Copy it in the appropriate directory for your application server (on Tomcat: common/lib
or simply lib
, depending on the version).
[SINCE Orbeon Forms 4.6]
Uncompress the zip file, and copy the sqljdbc4.jar
it contains to the appropriate directory for your application server (on Tomcat: common/lib
or simply lib
with newer Tomcat version).
[SINCE Orbeon Forms 4.8]
Copy the driver jar to the appropriate directory for your application server (on Tomcat: common/lib
or simply lib
, depending on the version).
The following attributes of the datasource need to be configured as needed:
username
password
url
: including the server
and database
parts of the path
[SINCE Orbeon Forms 4.3]
Uncompress the zip file, and copy the db2jcc4.jar
it contains to the appropriate directory for your application server (on Tomcat: common/lib
or simply lib
, depending on the version).
Orbeon Forms comes with an embedded SQLite database in order to show demo forms, and also to allow to quickly get started with Orbeon Forms. When configuring your own provider or providers, you should disable the embedded SQLite database. To do so, add the following properties to your properties-local.xml
, assuming here that your new persistence provider is called postgresql
:
The single schema configuration described in the previous section uses the predefined oracle
and mysql
providers. To use multiple schemas you need to define you own provider names. For instance, assume that you have two apps, hr
and finance
, and would like both the form definition and data for those apps to be stored in two separate schemas:
In your application server configuration, you setup two data sources ; let's call them hr-datasource
and finance-datasource
.
In properties-local.xml
, you use the following properties to define two providers hr
and finance
that you configure to use the desired persistence layer implementation (Oracle in this example) and data source:
Still in properties-local.xml
, you map the hr
and finance
app to the respective provider:
Orbeon Forms stores form data as XML in relational databases, which gives it a lot of flexibility. However, it might be harder for other tools to access this XML data. For this reason, you might want to provide other tools a way to access the XML data through another "flat" table or view that has one column per form field.
title
corresponds to the title form field;
author
corresponds to the author form field;
document_id
corresponds to the column with the same name in orbeon_form_data
.
Start by creating the bookshelf
table:
Choose an appropriate type for your columns, depending on the maximum length for the fields. Then create a trigger, which will update your bookshelf
table when form data is saved in orbeon_form_data
:
Since you are interested in data for Bookshelf form, which is in the app orbeon
form bookshelf
, the trigger only does something if new.app = 'orbeon' and new.form = 'bookshelf'
. To enable auditing, the MySQL persistence layer never deletes or updates data; it only inserts new row. So your trigger only needs to be concerned about updates. On insert, you want to make sure you are not creating duplicates in your bookshelf
table, hence the delete
statement. When a newly inserted row has delete = 'N'
, this indicates that a user deleted that document, in which case you don't want to insert a row in your bookshelf
table, hence the if
test.
For older DDL see .
MySQL 5.7 and MySQL 8: Since version 2018.2, Orbeon Forms uses the utf8mb4
character set instead of the utf8
character set. The reason being that MySQL's utf8
character set can only store UTF-8-encoded symbols that consist of 1 to 3 bytes, that is characters in the Unicode , which means that none of the characters in the , which include Emojis, could stored. However, the switch to the utf8mb4
character set will prevent you from creating some indexes on MySQL 5.6 where default key prefix limit is 767 bytes. Hence we recommend you use MySQL 5.7, which raised the index key prefix length limit to 3072 bytes for InnoDB tables. If in your situation upgrading to MySQL 5.7 isn't an option, you can explore , or changing the DDL that ships with Orbeon Forms to use utf8
instead of utf8mb4
.
Minimum version: The MySQL persistence layer relies on that have been introduced in MySQL 5.1, so you need to be using the MySQL 5.1 (which was released in November 2008) or newer.
Recommended versions: However, we recommend you use MySQL 5.6.4 or newer, as it supports .
MySQL 5.7: With MySQL 5.7, since Orbeon Forms 2016.2, you must set the sql_mode
to , or you might get errors while creating the database schema.
By default, the MySQL JDBC driver the character encoding and character collation set on the server. (included), the default character encoding is latin1
and the default collation latin1_swedish_ci
. , the default character encoding is utf8mb4
and the default collation utf8mb4_0900_ai_ci
. So, if you're using MySQL 5.7 or earlier, you must specify the following 2 parameters when starting MySQL:
Run the following DDL to create or update your Orbeon database, and note that if upgrading to 2016.2, you need to .
For older DDL see .
Run the following DDL to create or update your Orbeon database, and note that if upgrading to 2016.2, you need to .
For older DDL see .
Run the following DDL to create or update your Orbeon database, and note that if upgrading to 2016.2, you need to .
For older DDL see .
Run the following DDL to create or update your Orbeon database, and note that if upgrading to 2016.2, you need to .
For older DDL see .
Tomcat documentation:
Apache Commons documentation:
Blog post:
Your Resource
element pointing to the your Oracle instance (see also above). In the example below, the Oracle server is running on localhost
, the instance name is globaldb
, and the user/schema is orbeon
with password orbeon
. Those values are highlighted in the configuration below, and you'll most likely want to change them to fit your setup.
Please follow the , but here are some steps that work for us in our test environment.
, called Connector/J, e.g. mysql-connector-java-5.1.39-bin.jar
(latest version as of 2016-06-20)
Setup a JDBC data source for your MySQL schema (see also above). In the example below, the MySQL server is running on localhost
port 3306, the schema is orbeon
, the username/password is orbeon
/orbeon
. Those values are highlighted in the configuration below, and you'll most likely want to change them to fit your setup. Also, on the JDBC URL you're telling the MySQL driver to use Unicode and the UTF-8 encoding when talking to the database, which we highly recommend you to do in order to avoid encoding issues with non-ASCII characters.
(as of 2020-05-04, this is version 8.2 of the driver)
When using Java 11 or newer, you might need to add the JAXB API, which was present in earlier versions of Java. Download the JAR file from and place it in the same directory you placed the JDBC driver.
Set up the JDBC data source for your SQL Server instance (see also above). Example:
.
Setup the JDBC data source for your PostgreSQL instance (see also above). Example:
for the version of DB2 you're using.
Setup the JDBC data source for your DB2 instance (see also above). Example:
What follows applies to Orbeon Forms 4.0 and newer. For Orbeon Forms 3.9, see this .
In addition, since by removing the SQLite demo database you don't have the Orbeon Forms demo forms anymore, you should remove the demo forms tiles from the . You can do this by setting the following property:
In your properties-local.xml
, you map an app / form / form type to the implementation of the persistence API you're using with the oxf.fr.persistence.provider.*.*.*
. For instance, if using PostgreSQL, set the property to:
See .
Orbeon Forms doesn't provide a way to have a table or view automatically created for a form upon publishing in MySQL. However, you can do this manually. For instance, assume you want to create a "flat" bookshelf
table for the sample . You want that table to have 3 columns:
See .