<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>eXo Platform - JCR - JDBC Data Container config</title>
  <meta http-equiv="Content-Type"
 content="text/html; charset=ISO-8859-1">
  <meta http-equiv="imagetoolbar" content="no">
  <meta name="revisit-after" content="7 days">
  <meta name="description" content="XWiki for sharing information">
  <meta name="keywords" content="portal, webOS, exo">
  <meta name="distribution" content="GLOBAL">
  <meta name="rating" content="General">
  <meta name="author" content="">
  <meta http-equiv="reply-to" content="">
  <meta name="language" content="en">
  <meta http-equiv="Content-Type"
 content="text/html; charset=iso-8859-1">
</head>
<body id="body" class="viewbody">
<!-- These elements will be closed in the footer vm file -->
<div id="xwikimaincontainer">
<div id="xwikimaincontainerinner">
<div id="headerglobal" class="layoutsection">
<div class="LeftBanner">
<div class="RightBanner">
<div class="MiddleBanner">
<div class="CompanyBanner">
<div class="LinkGlobal">
<div class="TopLink"><span></span></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="contenthideright" id="contentcontainer">
<div id="contentcontainerinner">
<div class="leftsidecolumns">
<div id="contentcolumn">
<div class="topmainleft">
<div class="topmainright"> </div>
</div>
<span></span>
<div class="main layoutsubsection">
<div id="xwikicontent">
<h3 class="heading-1-1"><span
 id="HDatacontainer2FDatabaseconfigurationeXoJCR">Data
container/Database configuration eXo JCR</span></h3>
<p class="paragraph"> eXo JCR persistent data container can work in two
configuration modes:
</p>
<ul class="star">
  <li>Multi-database - one database for each workspace (used in
standalone eXo JCR service mode)</li>
  <li>Single-database - all workspaces persisted in one database (used
in embedded eXo JCR service mode, e.g. in eXo portal)</li>
</ul>
Data container uses JDBC driver to communicate with actual database
software, i.e. any JDBC-enabled data storage can be used with eXo JCR
implementation.
<p class="paragraph"> Currently data container tested with RDBMS:
</p>
<ul class="star">
  <li>MySQL (5.x)</li>
  <li>PostgreSQL (8.x)</li>
  <li>Oracle Database (9i, 10g)</li>
  <li>Microsoft SQL Server (2005)</li>
  <li>Sybase ASE (15.0)</li>
  <li>Apache Derby/Java DB (10.1.x, 10.2.x)</li>
  <li>IBM DB2 (9.x)</li>
  <li>HSQLDB (1.8.0.7)</li>
</ul>
Each database software support ANSI SQL standards but has own
specifics too. So, each database has own configuration in eXo JCR as a
database dialect parameter (workspace container configuration <strong
 class="strong">exo-jcr-config.xml</strong>). If you need a more
detailed configuration of the database it's possible by editing the
metadata SQL-script files.
<p class="paragraph">In case the non-ANSI node name is used it's
necessary use a database
with Unicode encoding. Some JDBC drivers need additional parameters for
establishing a Unicode friendly connection. E.g. under mysql it's need
to add additional parameter for JDBC driver at the end of JDBC URL. For
instance:
<strong class="strong">jdbc:mysql://exoua.dnsalias.net/portal?characterEncoding=utf8</strong></p>
<p class="paragraph"> There are preconfigured configuration files for
HSQLDB. Look for these files in /conf/portal and /conf/standalone
folders of the jar-file <strong class="strong">exo.jcr.component.core-XXX.XXX.jar</strong>
or source-distribution of eXo JCR implementation.
</p>
<h4 class="heading-1-1-1"><span id="HMultidatabaseconfiguration3E3E">Multi-database
configuration&gt;&gt;</span></h4>
<p class="paragraph"> Need to configure each workspace in a repository.
You may have each one on different servers remotely as far as you need.</p>
<p class="paragraph"> First of all configure data containers in the
file <strong class="strong">configuration.xml</strong> for <em
 class="italic">org.exoplatform.services.naming.InitialContextInitializer</em>
component. It's JNDI context initializer which register (bind) naming
resources (datasources) for data container.</p>
<p class="paragraph"> Example (fragment of <strong class="strong">configuration.xml</strong>
for standalone mode of two data containers (<strong class="strong">jdbcjcr</strong>
- local HSQLDB, <strong class="strong">jdbcjcr1</strong> - remote
MySQL):</p>
<div class="code">
<pre>&lt;component&gt;<br>    &lt;key&gt;org.exoplatform.services.naming.InitialContextInitializer&lt;/key&gt;<br>    &lt;type&gt;org.exoplatform.services.naming.InitialContextInitializer&lt;/type&gt;<br>    &lt;component-plugins&gt;<br>      &lt;component-plugin&gt;<br>        &lt;name&gt;bind.datasource&lt;/name&gt;<br>        &lt;set-method&gt;addPlugin&lt;/set-method&gt;<br>        &lt;type&gt;org.exoplatform.services.naming.BindReferencePlugin&lt;/type&gt;<br>        &lt;init-params&gt;<br>          &lt;value-param&gt;<br>            &lt;name&gt;bind-name&lt;/name&gt;<br>            &lt;value&gt;jdbcjcr&lt;/value&gt;<br>          &lt;/value-param&gt;<br>          &lt;value-param&gt;<br>            &lt;name&gt;class-name&lt;/name&gt;<br>            &lt;value&gt;javax.sql.DataSource&lt;/value&gt;<br>          &lt;/value-param&gt;<br>          &lt;value-param&gt;<br>            &lt;name&gt;factory&lt;/name&gt;<br>            &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;<br>          &lt;/value-param&gt;<br>          &lt;properties-param&gt;<br>            &lt;name&gt;ref-addresses&lt;/name&gt;<br>            &lt;description&gt;ref-addresses&lt;/description&gt;<br>            &lt;property name=<span
 class="java-quote">"driverClassName"</span> value=<span
 class="java-quote">"org.hsqldb.jdbcDriver"</span>/&gt;<br>            &lt;property name=<span
 class="java-quote">"url"</span> value=<span class="java-quote">"jdbc:hsqldb:file:target/temp/data/portal"</span>/&gt;<br>            &lt;property name=<span
 class="java-quote">"username"</span> value=<span class="java-quote">"sa"</span>/&gt;<br>            &lt;property name=<span
 class="java-quote">"password"</span> value=<span class="java-quote">""</span>/&gt;<br>          &lt;/properties-param&gt;<br>        &lt;/init-params&gt;<br>            &lt;/component-plugin&gt;<br>      &lt;component-plugin&gt;<br>        &lt;name&gt;bind.datasource&lt;/name&gt;<br>        &lt;set-method&gt;addPlugin&lt;/set-method&gt;<br>        &lt;type&gt;org.exoplatform.services.naming.BindReferencePlugin&lt;/type&gt;<br>        &lt;init-params&gt;<br>          &lt;value-param&gt;<br>            &lt;name&gt;bind-name&lt;/name&gt;<br>            &lt;value&gt;jdbcjcr1&lt;/value&gt;<br>          &lt;/value-param&gt;<br>          &lt;value-param&gt;<br>            &lt;name&gt;class-name&lt;/name&gt;<br>            &lt;value&gt;javax.sql.DataSource&lt;/value&gt;<br>          &lt;/value-param&gt;<br>          &lt;value-param&gt;<br>            &lt;name&gt;factory&lt;/name&gt;<br>            &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;<br>          &lt;/value-param&gt;<br>          &lt;properties-param&gt;<br>            &lt;name&gt;ref-addresses&lt;/name&gt;<br>            &lt;description&gt;ref-addresses&lt;/description&gt;<br>            &lt;property name=<span
 class="java-quote">"driverClassName"</span> value=<span
 class="java-quote">"com.mysql.jdbc.Driver"</span>/&gt;<br>            &lt;property name=<span
 class="java-quote">"url"</span> value=<span class="java-quote">"jdbc:mysql://exoua.dnsalias.net/jcr"</span>/&gt;<br>            &lt;property name=<span
 class="java-quote">"username"</span> value=<span class="java-quote">"exoadmin"</span>/&gt;<br>            &lt;property name=<span
 class="java-quote">"password"</span> value=<span class="java-quote">"exo12321"</span>/&gt;<br>            &lt;property name=<span
 class="java-quote">"maxActive"</span> value=<span class="java-quote">"50"</span>/&gt;<br>            &lt;property name=<span
 class="java-quote">"maxIdle"</span> value=<span class="java-quote">"5"</span>/&gt;<br>            &lt;property name=<span
 class="java-quote">"initialSize"</span> value=<span class="java-quote">"5"</span>/&gt;<br>          &lt;/properties-param&gt;<br>        &lt;/init-params&gt;<br>      &lt;/component-plugin&gt;<br>    &lt;init-params&gt;<br>      &lt;value-param&gt;<br>        &lt;name&gt;<span
 class="java-keyword">default</span>-context-factory&lt;/name&gt;<br>        &lt;value&gt;org.exoplatform.services.naming.SimpleContextFactory&lt;/value&gt;<br>      &lt;/value-param&gt;<br>    &lt;/init-params&gt;<br>  &lt;/component&gt;</pre>
</div>
<p class="paragraph"> We configure database connection parameters:
</p>
<ul class="star">
  <li><strong class="strong">driverClassName</strong>, e.g.
"org.hsqldb.jdbcDriver", "com.mysql.jdbc.Driver",
"org.postgresql.Driver"</li>
  <li><strong class="strong">url</strong>, e.g.
"jdbc:hsqldb:file:target/temp/data/portal",
"jdbc:mysql://exoua.dnsalias.net/jcr"</li>
  <li><strong class="strong">username</strong>, e.g. "sa", "exoadmin"</li>
  <li><strong class="strong">password</strong>, e.g. "", "exo12321"</li>
</ul>
There can be connection pool configuration parameters (<em
 class="italic">org.apache.commons.dbcp.BasicDataSourceFactory</em>
currently):
<ul class="star">
  <li><strong class="strong">maxActive</strong>, e.g. 50</li>
  <li><strong class="strong">maxIdle</strong>, e.g. 5</li>
  <li><strong class="strong">initialSize</strong>, e.g. 5</li>
  <li>and other according to <span class="wikiexternallink"><a
 href="http://jakarta.apache.org/commons/dbcp/configuration.html">Apache
DBCP configuration</a></span></li>
</ul>
When data container configuration done we can configure repository
service in the file <strong class="strong">exo-jcr-config.xml</strong>.
Each one workspace configured for own data container.
<div class="code">
<pre>&lt;workspaces&gt;<br>        &lt;workspace name=<span
 class="java-quote">"ws"</span> auto-init-root-nodetype=<span
 class="java-quote">"nt:unstructured"</span>&gt;<br>          &lt;container class=<span
 class="java-quote">"org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer"</span>&gt;<br>            &lt;properties&gt;<br>              &lt;property name=<span
 class="java-quote">"sourceName"</span> value=<span class="java-quote">"jdbcjcr"</span>/&gt;<br>              &lt;property name=<span
 class="java-quote">"dialect"</span> value=<span class="java-quote">"<span
 class="java-keyword">generic</span>"</span>/&gt;<br>              &lt;property name=<span
 class="java-quote">"update-storage"</span> value=<span
 class="java-quote">"<span class="java-keyword">true</span>"</span>/&gt;<br>              &lt;property name=<span
 class="java-quote">"max-buffer-size"</span> value=<span
 class="java-quote">"204800"</span>/&gt;<br>              &lt;property name=<span
 class="java-quote">"swap-directory"</span> value=<span
 class="java-quote">"target/temp/swap/ws"</span>/&gt;   <br>              &lt;property name=<span
 class="java-quote">"multi-db"</span> value=<span class="java-quote">"<span
 class="java-keyword">true</span>"</span>/&gt;<br>            &lt;/properties&gt;<br>          &lt;/container&gt;<br>          &lt;cache enabled=<span
 class="java-quote">"<span class="java-keyword">true</span>"</span>&gt;<br>            &lt;properties&gt;<br>              &lt;property name=<span
 class="java-quote">"maxSize"</span> value=<span class="java-quote">"1000"</span>/&gt;<br>              &lt;property name=<span
 class="java-quote">"liveTime"</span> value=<span class="java-quote">"1800"</span>/&gt;&lt;!-- 30 min --&gt;<br>            &lt;/properties&gt;<br>          &lt;/cache&gt;<br>          &lt;query-handler class=<span
 class="java-quote">"org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex"</span>&gt;<br>            &lt;properties&gt;<br>              &lt;property name=<span
 class="java-quote">"indexDir"</span> value=<span class="java-quote">"target/temp/index"</span>/&gt;<br>            &lt;/properties&gt;<br>          &lt;/query-handler&gt;<br>        &lt;/workspace&gt;<br>        &lt;workspace name=<span
 class="java-quote">"ws1"</span> auto-init-root-nodetype=<span
 class="java-quote">"nt:unstructured"</span>&gt;<br>          &lt;container class=<span
 class="java-quote">"org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer"</span>&gt;<br>            &lt;properties&gt;<br>              &lt;property name=<span
 class="java-quote">"sourceName"</span> value=<span class="java-quote">"jdbcjcr1"</span>/&gt;<br>              &lt;property name=<span
 class="java-quote">"dialect"</span> value=<span class="java-quote">"<span
 class="java-keyword">generic</span>"</span>/&gt;<br>              &lt;property name=<span
 class="java-quote">"update-storage"</span> value=<span
 class="java-quote">"<span class="java-keyword">true</span>"</span>/&gt;<br>              &lt;property name=<span
 class="java-quote">"max-buffer-size"</span> value=<span
 class="java-quote">"204800"</span>/&gt;<br>              &lt;property name=<span
 class="java-quote">"swap-directory"</span> value=<span
 class="java-quote">"target/temp/swap/ws1"</span>/&gt;   <br>              &lt;property name=<span
 class="java-quote">"multi-db"</span> value=<span class="java-quote">"<span
 class="java-keyword">true</span>"</span>/&gt;<br>            &lt;/properties&gt;<br>          &lt;/container&gt;<br>          &lt;cache enabled=<span
 class="java-quote">"<span class="java-keyword">true</span>"</span>&gt;<br>            &lt;properties&gt;<br>              &lt;property name=<span
 class="java-quote">"maxSize"</span> value=<span class="java-quote">"1000"</span>/&gt;<br>              &lt;property name=<span
 class="java-quote">"liveTime"</span> value=<span class="java-quote">"10000"</span>/&gt;<br>            &lt;/properties&gt;<br>          &lt;/cache&gt;<br>          &lt;query-handler class=<span
 class="java-quote">"org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex"</span>&gt;<br>            &lt;properties&gt;<br>              &lt;property name=<span
 class="java-quote">"indexDir"</span> value=<span class="java-quote">"target/temp/index"</span>/&gt;<br>            &lt;/properties&gt;<br>          &lt;/query-handler&gt;<br>        &lt;/workspace&gt;<br>      &lt;/workspaces&gt;</pre>
</div>
<ul class="star">
  <li><strong class="strong">sourceName</strong> - a
javax.sql.DataSource instance object to a database configured in
InitialContextInitializer component;</li>
  <li><strong class="strong">dialect</strong> - a database dialect,
possible values is "generic" or "hsqldb", "mysql", "pgsql", "oracle",
"oracle-oci", "mssql", "sybase", "derby", "db2".</li>
  <li><strong class="strong">multi-db</strong> - enable multi-database
container with this parameter (set value "true");</li>
  <li><strong class="strong">max-buffer-size</strong> - threshold after
that a javax.jcr.Value content will be swapped to a temporary storage
in operations before save will performed. I.e. swap for pending changes.</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
