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.