Configure Bloomreach Experience Manager for Oracle Database

Overview

This guide explains how to configure Bloomreach Experience Manager (XM) to use Oracle Database or Amazon RDS for Oracle Database as the backend for the content repository and the Tomcat application container.

When to Use

Use this configuration when you need to run Bloomreach Experience Manager with Oracle Database as the underlying storage for content and repository data.

Prerequisites

  • Review the Configuring Databases documentation before proceeding.

  • Follow the Linux installation manual for initial setup.

  • Ensure you have access to an Oracle Database instance or Amazon RDS for Oracle Database.

  • Obtain the necessary database credentials and permissions.

Configuration Steps

1. Configure the Datasource

Set up the datasource for Oracle Database in your Tomcat container.

  • URL format:
    jdbc:oracle:thin:@DBHOST:DBPORT:DBNAME

  • Driver class:
    oracle.jdbc.OracleDriver

  • Validation query:
    SELECT 1 FROM DUAL

2. Update Repository Configuration

Modify the repository configuration to use Oracle-specific classes and parameters.

Set the following values in your repository.xml:

  • databaseType:
    oracle

  • FileSystem class:
    org.apache.jackrabbit.core.fs.db.OracleFileSystem

  • PersistenceManager class:
    org.apache.jackrabbit.core.persistence.pool.OraclePersistenceManager

  • Journal class:
    org.apache.jackrabbit.core.journal.OracleDatabaseJournal

  • DataStore class:
    org.apache.jackrabbit.core.data.db.DbDataStore

Optionally, add the tableSpace and/or indexTablespace parameters to specify tablespaces if they differ from the user's default.

3. Assign Database Roles and Privileges

Grant the following roles and privileges to the database user:

  • CONNECT

  • RESOURCE

Optionally, assign the UNLIMITED TABLESPACE privilege to prevent quota limitations when adding content.

4. Address Known Issues

If you encounter the following error during startup after the schema is created:

java.sql.SQLSyntaxErrorException: ORA-00955: name is already used by an existing object

This error indicates the database user lacks permission to detect existing objects, causing the system to attempt to create them again. To resolve this, add the parameter schemaCheckEnabled with value false to all FileSystem, PersistenceManager, Journal, and DataStore sections in your repository.xml.

Example Configurations

Example JNDI Resource for Tomcat

Define the datasource in Tomcat's conf/context.xml:

<Resource name="jdbc/repositoryDS" auth="Container" type="javax.sql.DataSource" maxTotal="20" maxIdle="10" initialSize="2" maxWaitMillis="10000" testWhileIdle="true" testOnBorrow="false" validationQuery="SELECT 1 FROM DUAL" timeBetweenEvictionRunsMillis="10000" minEvictableIdleTimeMillis="60000" username="DBUSER" password="DBPASS" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@DBHOST:DBPORT:DBNAME" />

Example repository.xml

The following is a complete example of a repository.xml configured for Oracle Database:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 2.6//EN" "http://jackrabbit.apache.org/dtd/repository-2.6.dtd"> <Repository> <DataSources> <DataSource name="repositoryDS"> <param name="driver" value="javax.naming.InitialContext"/> <param name="url" value="java:comp/env/jdbc/repositoryDS"/> <param name="databaseType" value="oracle"/> </DataSource> </DataSources> <FileSystem class="org.apache.jackrabbit.core.fs.db.OracleFileSystem"> <param name="dataSourceName" value="repositoryDS"/> <param name="schemaObjectPrefix" value="repository_"/> </FileSystem> <Security appName="Jackrabbit"> <SecurityManager class="org.hippoecm.repository.security.SecurityManager"/> <AccessManager class="org.hippoecm.repository.security.HippoAccessManager"/> <LoginModule class="org.hippoecm.repository.security.HippoLoginModule"/> </Security> <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default"/> <Workspace name="${wsp.name}"> <FileSystem class="org.apache.jackrabbit.core.fs.db.OracleFileSystem"> <param name="dataSourceName" value="repositoryDS"/> <param name="schemaObjectPrefix" value="${wsp.name}_"/> </FileSystem> <PersistenceManager class="org.apache.jackrabbit.core.persistence.pool.OraclePersistenceManager"> <param name="dataSourceName" value="repositoryDS"/> <param name="schemaObjectPrefix" value="${wsp.name}_"/> <param name="externalBLOBs" value="true"/> <param name="consistencyCheck" value="false"/> <param name="consistencyFix" value="false"/> <param name="bundleCacheSize" value="256"/> </PersistenceManager> <SearchIndex class="org.hippoecm.repository.FacetedNavigationEngineImpl"> <param name="indexingConfiguration" value="indexing_configuration.xml"/> <param name="indexingConfigurationClass" value="org.hippoecm.repository.query.lucene.ServicingIndexingConfigurationImpl"/> <param name="path" value="${wsp.home}/index"/> <param name="useSimpleFSDirectory" value="true"/> <param name="useCompoundFile" value="true"/> <param name="minMergeDocs" value="100"/> <param name="volatileIdleTime" value="10"/> <param name="maxMergeDocs" value="100000"/> <param name="mergeFactor" value="5"/> <param name="maxFieldLength" value="10000"/> <param name="bufferSize" value="1000"/> <param name="cacheSize" value="1000"/> <param name="onWorkspaceInconsistency" value="log"/> <param name="forceConsistencyCheck" value="false"/> <param name="enableConsistencyCheck" value="false"/> <param name="autoRepair" value="true"/> <param name="analyzer" value="org.hippoecm.repository.query.lucene.StandardHippoAnalyzer"/> <param name="queryClass" value="org.apache.jackrabbit.core.query.QueryImpl"/> <param name="respectDocumentOrder" value="false"/> <param name="resultFetchSize" value="1000"/> <param name="extractorTimeout" value="100"/> <param name="extractorBackLogSize" value="100"/> <param name="excerptProviderClass" value="org.apache.jackrabbit.core.query.lucene.DefaultHTMLExcerpt"/> <param name="supportSimilarityOnStrings" value="true"/> <param name="supportSimilarityOnBinaries" value="false"/> </SearchIndex> <ISMLocking class="org.apache.jackrabbit.core.state.FineGrainedISMLocking"/> </Workspace> <Versioning rootPath="${rep.home}/version"> <FileSystem class="org.apache.jackrabbit.core.fs.db.OracleFileSystem"> <param name="dataSourceName" value="repositoryDS"/> <param name="schemaObjectPrefix" value="version_"/> </FileSystem> <PersistenceManager class="org.apache.jackrabbit.core.persistence.pool.OraclePersistenceManager"> <param name="dataSourceName" value="repositoryDS"/> <param name="schemaObjectPrefix" value="version_"/> <param name="externalBLOBs" value="true"/> <param name="consistencyCheck" value="false"/> <param name="consistencyFix" value="false"/> <param name="bundleCacheSize" value="64"/> </PersistenceManager> <ISMLocking class="org.apache.jackrabbit.core.state.FineGrainedISMLocking"/> </Versioning> <Cluster> <Journal class="org.apache.jackrabbit.core.journal.OracleDatabaseJournal"> <param name="dataSourceName" value="repositoryDS"/> <param name="databaseType" value="oracle"/> <param name="schemaObjectPrefix" value="repository_"/> <param name="revision" value="${rep.home}/revision.log"/> <!-- clean up journal table --> <param name="janitorEnabled" value="true"/> <param name="janitorSleep" value="86400"/> <!-- a day in seconds --> <param name="janitorFirstRunHourOfDay" value="3"/> </Journal> </Cluster> <DataStore class="org.apache.jackrabbit.core.data.db.DbDataStore"> <param name="dataSourceName" value="repositoryDS"/> <param name="minRecordLength" value="1024"/> <param name="maxConnections" value="5"/> <param name="copyWhenReading" value="true"/> </DataStore> </Repository>

Example repository.xml for Repository Consistency Checker

The Repository Consistency Checker requires a separate repository.xml configuration. The following example is tailored for Oracle Database:

<?xml version="1.0"?> <!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 2.6//EN" "http://jackrabbit.apache.org/dtd/repository-2.6.dtd"> <Repository> <DataSources> <DataSource name="ds1"> <param name="driver" value="oracle.jdbc.OracleDriver"/> <param name="url" value="jdbc:oracle:thin:@DBHOST:DBPORT:DBNAME"/> <param name="user" value="DBUSER"/> <param name="password" value="DBPASS"/> <param name="databaseType" value="oracle"/> <param name="validationQuery" value="select 1 from dual"/> <param name="maxPoolSize" value="10"/> </DataSource> </DataSources> <FileSystem class="org.apache.jackrabbit.core.fs.db.OracleFileSystem"> <param name="dataSourceName" value="ds1"/> <param name="schemaObjectPrefix" value="repository_" /> </FileSystem> <Security appName="Jackrabbit"> <SecurityManager class="org.apache.jackrabbit.core.security.simple.SimpleSecurityManager"/> <AccessManager class="org.apache.jackrabbit.core.security.simple.SimpleAccessManager"/> <LoginModule class="org.apache.jackrabbit.core.security.simple.SimpleLoginModule"/> </Security> <DataStore class="org.apache.jackrabbit.core.data.db.DbDataStore"> <param name="dataSourceName" value="ds1"/> <param name="minRecordLength" value="1024" /> <param name="copyWhenReading" value="true" /> <param name="tablePrefix" value="" /> <param name="schemaObjectPrefix" value="" /> </DataStore> <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default" maxIdleTime="2"/> <Workspace name="${wsp.name}"> <FileSystem class="org.apache.jackrabbit.core.fs.db.OracleFileSystem"> <param name="dataSourceName" value="ds1"/> <param name="schemaObjectPrefix" value="${wsp.name}_" /> </FileSystem> <PersistenceManager class="org.apache.jackrabbit.core.persistence.pool.OraclePersistenceManager"> <param name="dataSourceName" value="ds1"/> <param name="schemaObjectPrefix" value="${wsp.name}_" /> </PersistenceManager> </Workspace> <Versioning rootPath="${rep.home}/version"> <FileSystem class="org.apache.jackrabbit.core.fs.db.OracleFileSystem"> <param name="dataSourceName" value="ds1"/> <param name="schemaObjectPrefix" value="version_" /> </FileSystem> <PersistenceManager class="org.apache.jackrabbit.core.persistence.pool.OraclePersistenceManager"> <param name="dataSourceName" value="ds1"/> <param name="schemaObjectPrefix" value="version_" /> </PersistenceManager> <ISMLocking class="org.apache.jackrabbit.core.state.FineGrainedISMLocking"/> </Versioning> <Cluster> <Journal class="org.apache.jackrabbit.core.journal.OracleCleanOnCloseDatabaseJournal"> <param name="dataSourceName" value="ds1"/> <param name="schemaObjectPrefix" value="repository_"/> </Journal> </Cluster> </Repository>

Verification

  • Start the application and confirm that it connects to Oracle Database without errors.

  • Check the database for created schema objects.

  • Monitor the logs for any SQL exceptions or permission issues.

Troubleshooting

Error

java.sql.SQLSyntaxErrorException: ORA-00955: name is already used by an existing object

Cause
The database user does not have permission to detect existing objects, resulting in repeated creation attempts.

Resolution
Add the parameter schemaCheckEnabled with value false to all FileSystem, PersistenceManager, Journal, and DataStore sections in your repository.xml.

Share Feedback
Page: /deploy/on-premise-deployment/configuration/configuring-brxm-for-oracle-database
Section: Deploy
Category *
Configure Bloomreach Experience Manager for Oracle database | Bloomreach Content Documentation