2012-05-14 1 views
1

Я сохраняю по умолчанию узлы с двоичными данными (3 МБ) на нем. Измените их и сохраните снова. Позже я хочу вернуть более старую версию, поэтому я использую функцию восстановления. В Windows это работает при нормальной скорости (максимум 1 сек). Но в Linux это занимает около 20 секунд.JCR/Jackrabit/Derby - медленный IO с двоичными данными при восстановлении версии на Linux

Есть ли кто-нибудь, что делает его таким медленным? Здесь StackTrace от точки, где она медленно:

Daemon Thread [ajp-bio-8011-exec-40] (Evaluating) 
RandomAccessFile.writeBytes(byte[], int, int) line: not available [native method] 
DirRandomAccessFile4(RandomAccessFile).write(byte[], int, int) line: 466  
LogAccessFile.writeToLog(byte[], int, int, long) line: not available  
LogAccessFile.flushDirtyBuffers() line: not available [local variables unavailable] 
LogAccessFile.switchLogBuffer() line: not available 
LogAccessFile.reserveSpaceForChecksum(int, long, long) line: not available 
LogToFile.appendLogRecord(byte[], int, int, byte[], int, int) line: not available 
FileLogger.logAndDo(RawTransaction, Loggable) line: not available 
Xact.logAndDo(Loggable) line: not available 
LoggableActions.doAction(RawTransaction, BasePage, Loggable) line: not available  
LoggableActions.actionInsert(RawTransaction, BasePage, int, int, Object[], FormatableBitSet, LogicalUndo, byte, int, boolean, int, DynamicByteArrayOutputStream, int, int) line: not available 
StoredPage(BasePage).insertLongColumn(BasePage, LongColumnException, byte) line: not available 
StoredPage(BasePage).insertAllowOverflow(int, Object[], FormatableBitSet, int, byte, int, RecordHandle) line: not available 
StoredPage(BasePage).insert(Object[], FormatableBitSet, byte, int) line: not available 
HeapController.doInsert(DataValueDescriptor[]) line: not available 
HeapController.insertAndFetchLocation(DataValueDescriptor[], RowLocation) line: not available 
RowChangerImpl.insertRow(ExecRow) line: not available 
InsertResultSet.normalInsertCore(LanguageConnectionContext, boolean) line: not available  
InsertResultSet.open() line: not available 
GenericPreparedStatement.executeStmt(Activation, boolean, long) line: not available 
GenericPreparedStatement.execute(Activation, long) line: not available 
EmbedPreparedStatement40(EmbedStatement).executeStatement(Activation, boolean, boolean) line: not available 
EmbedPreparedStatement40(EmbedPreparedStatement).executeStatement(Activation, boolean, boolean) line: not available 
EmbedPreparedStatement40(EmbedPreparedStatement).execute() line: not available 
PoolablePreparedStatement(DelegatingPreparedStatement).execute() line: 172 
DelegatingPreparedStatement.execute() line: 172 
DelegatingPreparedStatement.execute() line: 172 
DerbyConnectionHelper(ConnectionHelper).execute(PreparedStatement, Object[]) line: 473 
DerbyConnectionHelper(ConnectionHelper).reallyExec(String, Object...) line: 303 
ConnectionHelper$1.call() line: 285 
ConnectionHelper$1.call() line: 281 
ConnectionHelper$1(ConnectionHelper$RetryManager<T>).doTry() line: 486 
DerbyConnectionHelper(ConnectionHelper).exec(String, Object...) line: 281 
BundleDbPersistenceManager$DbBlobStore.put(String, InputStream, long) line: 1214  
BundleWriter.writeState(NodePropBundle$PropertyEntry) line: 240 
BundleWriter.writeBundle(NodePropBundle) line: 132 
BundleBinding.writeBundle(OutputStream, NodePropBundle) line: 164 
DerbyPersistenceManager(BundleDbPersistenceManager).storeBundle(NodePropBundle) line: 885 
DerbyPersistenceManager(AbstractBundlePersistenceManager).putBundle(NodePropBundle) line: 769 
DerbyPersistenceManager(AbstractBundlePersistenceManager).storeInternal(ChangeLog) line: 686  
DerbyPersistenceManager(AbstractBundlePersistenceManager).store(ChangeLog) line: 563  
DerbyPersistenceManager(BundleDbPersistenceManager).store(ChangeLog) line: 477 
SharedItemStateManager$Update.end() line: 770 
SharedItemStateManager.update(ChangeLog, EventStateCollectionFactory) line: 1492  
XAItemStateManager(LocalItemStateManager).update(ChangeLog) line: 400 
XAItemStateManager.update(ChangeLog) line: 354 
XAItemStateManager(LocalItemStateManager).update() line: 375  
VersionManagerImplBase$WriteOperation.save() line: 470 
VersionManagerImpl$6.perform(SessionContext) line: 253 
SessionState.perform(SessionOperation<T>) line: 216 
VersionManagerImpl.perform(SessionOperation<T>) line: 96  
VersionManagerImpl.restore(Version[], boolean) line: 225  
VersionManagerImpl.restore(Version, boolean) line: 217 

Мой конфигурации вы можете указать мне на новый ?:

<?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.5//EN" 
"http://jackrabbit.apache.org/dtd/repository-1.5.dtd"> 
<!-- Example Repository Configuration File 
Used by 
- org.apache.jackrabbit.core.config.RepositoryConfigTest.java 
- 
--> 
<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"> 
     <!-- 
     security manager: 
     class: FQN of class implementing the JackrabbitSecurityManager interface 
     --> 
     <SecurityManager class="org.apache.jackrabbit.core.security.simple.SimpleSecurityManager" workspaceName="security"> 
      <!-- 
      workspace access: 
      class: FQN of class implementing the WorkspaceAccessManager interface 
      --> 
      <!-- <WorkspaceAccessManager class="..."/> --> 
      <!-- <param name="config" value="${rep.home}/security.xml"/> --> 
     </SecurityManager> 
     <!-- 
     access manager: 
     class: FQN of class implementing the AccessManager interface 
     --> 
     <AccessManager class="org.apache.jackrabbit.core.security.simple.SimpleAccessManager"> 
      <!-- <param name="config" value="${rep.home}/access.xml"/> --> 
     </AccessManager> 
     <LoginModule class="org.apache.jackrabbit.core.security.simple.SimpleLoginModule"> 
      <!-- 
      anonymous user name ('anonymous' is the default value) 
      --> 
      <param name="anonymousId" value="anonymous"/> 
      <!-- 
      administrator user id (default value if param is missing is 'admin') 
      --> 
      <param name="adminId" value="admin"/> 
     </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> 
     <!-- 
     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.PlainTextExtractor,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> 
    </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.PlainTextExtractor,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> 

Correct конфигурации был:

<?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.5//EN" 
"http://jackrabbit.apache.org/dtd/repository-1.5.dtd"> 
<!-- Example Repository Configuration File 
Used by 
- org.apache.jackrabbit.core.config.RepositoryConfigTest.java 
- 
--> 
<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> 

    <!-- 
     data store configuration 
    --> 
    <DataStore class="org.apache.jackrabbit.core.data.FileDataStore"/> 

    <!-- 
    security configuration 
    --> 
    <Security appName="Jackrabbit"> 
     <!-- 
     security manager: 
     class: FQN of class implementing the JackrabbitSecurityManager interface 
     --> 
     <SecurityManager class="org.apache.jackrabbit.core.security.simple.SimpleSecurityManager" workspaceName="security"> 
      <!-- 
      workspace access: 
      class: FQN of class implementing the WorkspaceAccessManager interface 
      --> 
      <!-- <WorkspaceAccessManager class="..."/> --> 
      <!-- <param name="config" value="${rep.home}/security.xml"/> --> 
     </SecurityManager> 
     <!-- 
     access manager: 
     class: FQN of class implementing the AccessManager interface 
     --> 
     <AccessManager class="org.apache.jackrabbit.core.security.simple.SimpleAccessManager"> 
      <!-- <param name="config" value="${rep.home}/access.xml"/> --> 
     </AccessManager> 
     <LoginModule class="org.apache.jackrabbit.core.security.simple.SimpleLoginModule"> 
      <!-- 
      anonymous user name ('anonymous' is the default value) 
      --> 
      <param name="anonymousId" value="anonymous"/> 
      <!-- 
      administrator user id (default value if param is missing is 'admin') 
      --> 
      <param name="adminId" value="admin"/> 
     </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> 
     <!-- 
     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.PlainTextExtractor,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> 
    </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.PlainTextExtractor,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> 
+0

Какую версию Jackrabbit вы используете? В более старых версиях Jackrabbit (которые не используют DataStore) проблема с производительностью может быть связана с хранением двоичного файла в базе данных. Новые версии двоичных файлов Jackrabbit хранятся в файловой системе (FileDataStore) по умолчанию, что должно быть быстрым. –

+0

привет, я использую «2.4.1», это старая версия? – wutzebaer

+0

2.4.1 - это новая версия, но, похоже, вы используете старые файлы конфигурации (repository.xml и workspace.xml), потому что в вашем случае он использует (старый) DbBlobStore, а не FileDataStore. –

ответ

1

Проблема похоже, что вы используете старый файл конфигурации, где FileDataStore не используется. Для того, чтобы использовать его, вы можете:

Перенос данных имеет то преимущество, что существующие двоичные файлы также перемещаются в FileDataStore, который должен уменьшить размер хранилища.

+0

привет спасибо, что сделал это, я был, к счастью, в ситуации, что мне не нужно было переносить старые данные, спасибо! – wutzebaer