We look on JackRabbit+Oracle as a storage for Business Objects. Is it possible? Or CMS is only for documents storage??
Each Object can have a unique set of flexible fields (like usual custom fields but more featured) and we need to search by these fields. I plan to achieve this by adding mix-ins to each node. One mix-in will define on property or child node. There will be lots of objects, they must be archived, maybe also versioned. Next XML illustrates approximate structure of object and order of nodes quantities: <ObjsRoot> <MainObject x1 000 000 - must be archived> <ObjVersion x5> <Entry1 10xPropertyMix-ins/> <EntryList2> <Line 6xPropertyMix-ins x10/> </EntryList2> <EntryList3> <Line 2xPropertyMix-ins x5/> </EntryList3> <Bid x10> <BidVersion x5> <Entry1 10xPropertyMix-ins/> <EntryList2> <Line 4xPropertyMix-ins x10/> </EntryList2> <EntryList3> <Line 2xPropertyMix-ins x5/> </EntryList3> </BidVersion> </Bid> </ObjVersion> </MainObject> </ObjsRoot> *NOTE:* each mix-in has only one property. We've made short research regarding JackRabbit. We compared what to use: - JPA+Oracle (field table <-> value table <-> integer table, string table etc.) concrete value table can be joined to business object table using id etc. - JackRabbit + Oracle using mix-ins (nodes have their properties using mix-ins, each mix-ins = one property) *Environment:* Oracle 10 data base for data storage, local file system for indexes storage. The configuration XML file is attached. JackRabbit *Advantages* 1. A visual and more natural representation of the Business Object and its metadata 2. A powerful Query engine *Disadvantages * 1. Not acceptable performance for both read and update operations. See the details below. Simple data model is used for the performance testing: <companies> <company> <employee> <addresses/> </employee> </company> </companies> Company has properties: name, profit; employee has properties: name, age, birthday, salary, currency; address has properties: country, city, street, phone Data was generated for about 4000 companies with 20 employees for each company and 20 addresses for each employee. It takes about 1.8 millions records for nodes and 7.16 million records for properties in Oracle. Some queries were executed. For example, executing time for query: Executed query: "//sourcing/JackRabbitPerf ormanceTestMixin/companies/ CompanyType/[EMAIL PROTECTED] >= 20]/[EMAIL PROTECTED] > 5000000]" is 501615 ms if result set is limited to 10 nodes. In case, then result set doesn t limited and all existing nodes are returned, executing time for query takes more than 30 minutes. Topics - Querying of objects, best practices here in pagination, loading etc. - Load Entries of ObjVersion and Entries of BidVersion By ID - Search list of ObjVersion with count of bids, criteria can be complex - Is it possible to join tables from relational database? Or just store all in CMS, then node joins are not too long? - Configuration of JackRabbit, indexing etc. - Adding objects takes time Thank you very much in advance!
<?xml version="1.0"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 1.4//EN" "http://jackrabbit.apache.org/dtd/repository-1.4.dtd"> <!-- Example Repository Configuration File --> <Repository> <!-- virtual file system where the repository stores global state (e.g. registered namespaces, custom node types, etc.) --> <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem"> <param name="path" value="${rep.home}/repository" /> </FileSystem> <!-- security configuration --> <Security appName="Jackrabbit"> <!-- access manager: class: FQN of class implementing the AccessManager interface --> <AccessManager class="org.apache.jackrabbit.core.security.SimpleAccessManager"> <!-- <param name="config" value="${rep.home}/access.xml"/> --> </AccessManager> <LoginModule class="org.apache.jackrabbit.core.security.SimpleLoginModule"> <!-- anonymous user name ('anonymous' is the default value) --> <!-- <param name="anonymousId" value="anonymous"/> --> <!-- default user name to be used instead of the anonymous user when no login credentials are provided (unset by default) --> <!-- <param name="defaultUserId" value="superuser"/> --> </LoginModule> </Security> <!-- location of workspaces root directory and name of default workspace --> <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default" /> <!-- workspace configuration template: used to create the initial workspace if there's no workspace yet --> <Workspace name="${wsp.name}"> <!-- virtual file system of the workspace: class: FQN of class implementing the FileSystem interface --> <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem"> <param name="path" value="${wsp.home}" /> </FileSystem> <!-- persistence manager of the workspace: class: FQN of class implementing the PersistenceManager interface --> <!-- PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.DerbyPersistenceManager"> <param name="url" value="jdbc:derby:${wsp.home}/db;create=true"/> <param name="schemaObjectPrefix" value="${wsp.name}_"/> </PersistenceManager --> <PersistenceManager class="org.apache.jackrabbit.core.state.db.OraclePersistenceManager"> <param name="url" value="jdbc:oracle:thin:@EPMSD100.minsk.epam.com:1521:SLONINIT" /> <param name="user" value="TEST" /> <param name="password" value="test" /> <param name="schemaObjectPrefix" value="${wsp.name}_" /> <param name="externalBLOBs" value="false" /> </PersistenceManager> <!-- Search index and the file system it uses. class: FQN of class implementing the QueryHandler interface --> <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex"> <param name="path" value="${wsp.home}/index" /> <param name="textFilterClasses" value="org.apache.jackrabbit.extractor.MsWordTextExtractor,org.apache.jackrabbit.extractor.MsExcelTextExtractor,org.apache.jackrabbit.extractor.MsPowerPointTextExtractor,org.apache.jackrabbit.extractor.PdfTextExtractor,org.apache.jackrabbit.extractor.OpenOfficeTextExtractor,org.apache.jackrabbit.extractor.RTFTextExtractor,org.apache.jackrabbit.extractor.HTMLTextExtractor,org.apache.jackrabbit.extractor.XMLTextExtractor" /> <param name="extractorPoolSize" value="2" /> <param name="supportHighlighting" value="true" /> </SearchIndex> </Workspace> <!-- Configures the versioning --> <Versioning rootPath="${rep.home}/version"> <!-- Configures the filesystem to use for versioning for the respective persistence manager --> <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem"> <param name="path" value="${rep.home}/version" /> </FileSystem> <!-- Configures the persistence manager to be used for persisting version state. Please note that the current versioning implementation is based on a 'normal' persistence manager, but this could change in future implementations. --> <!--PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.DerbyPersistenceManager"> <param name="url" value="jdbc:derby:${rep.home}/version/db;create=true" /> <param name="schemaObjectPrefix" value="version_" /> </PersistenceManager --> <PersistenceManager class="org.apache.jackrabbit.core.state.db.OraclePersistenceManager"> <param name="url" value="jdbc:oracle:thin:@EPMSD100.minsk.epam.com:1521:SLONINIT" /> <param name="user" value="TEST" /> <param name="password" value="test" /> <param name="schemaObjectPrefix" value="version_" /> <param name="externalBLOBs" value="false" /> </PersistenceManager> </Versioning> <!-- Search index for content that is shared repository wide (/jcr:system tree, contains mainly versions) --> <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex"> <param name="path" value="${rep.home}/repository/index" /> <param name="textFilterClasses" value="org.apache.jackrabbit.extractor.MsWordTextExtractor,org.apache.jackrabbit.extractor.MsExcelTextExtractor,org.apache.jackrabbit.extractor.MsPowerPointTextExtractor,org.apache.jackrabbit.extractor.PdfTextExtractor,org.apache.jackrabbit.extractor.OpenOfficeTextExtractor,org.apache.jackrabbit.extractor.RTFTextExtractor,org.apache.jackrabbit.extractor.HTMLTextExtractor,org.apache.jackrabbit.extractor.XMLTextExtractor" /> <param name="extractorPoolSize" value="2" /> <param name="supportHighlighting" value="true" /> </SearchIndex> </Repository>