Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate4需要1分钟以上的时间来保存80MB的blob_Java_Hibernate_Jpa_Jboss - Fatal编程技术网

Java Hibernate4需要1分钟以上的时间来保存80MB的blob

Java Hibernate4需要1分钟以上的时间来保存80MB的blob,java,hibernate,jpa,jboss,Java,Hibernate,Jpa,Jboss,我们最近从JBoss6迁移到JBoss7.1.1,因此从hibernate3.6.6切换到hibernate4.0.1,并在将blob数据存储到数据库时遇到问题。 使用hibernate 3保存一个大约80MB的blob不到10秒,但使用hibernate 4保存它需要1分钟以上。我试过几种版本的Hibernate4-4.0.x、4.1.x、4.2.x,它们的行为都是一样的 环境: jboss 7.1.1、hibernate 4.0.1、ojdbc6、Oracle DB 11.2.0.3.0->

我们最近从JBoss6迁移到JBoss7.1.1,因此从hibernate3.6.6切换到hibernate4.0.1,并在将blob数据存储到数据库时遇到问题。 使用hibernate 3保存一个大约80MB的blob不到10秒,但使用hibernate 4保存它需要1分钟以上。我试过几种版本的Hibernate4-4.0.x、4.1.x、4.2.x,它们的行为都是一样的

环境:

jboss 7.1.1、hibernate 4.0.1、ojdbc6、Oracle DB 11.2.0.3.0->1分钟 jboss 6.1.0、hibernate 3.6.6、ojdbc6、Oracle DB 11.2.0.3.0-~10秒

我还打开了跟踪级别的日志记录,以查看时间消耗的位置,并发现以下内容:

17:33:58,203 TRACE [org.hibernate.engine.spi.ActionQueue] Adding an EntityInsertAction for [x.x.datastore.persistence.LobDataOutEntity] object
17:33:58,204 TRACE [org.hibernate.engine.spi.ActionQueue] Adding insert with no non-nullable, transient entities: [EntityInsertAction[x.x.datastore.persistence.LobDataOutEntity#2972533]]
17:33:58,205 TRACE [org.hibernate.engine.spi.ActionQueue] Adding resolved non-early insert action.
17:33:58,206 TRACE [org.hibernate.action.internal.UnresolvedEntityInsertActions] No unresolved entity inserts that depended on [[x.x.datastore.persistence.LobDataOutEntity#2972533]]
**17:33:58,206 TRACE [org.hibernate.action.internal.UnresolvedEntityInsertActions] No entity insert actions have non-nullable, transient entity dependencies.
17:34:21,162 TRACE [org.hibernate.event.internal.AbstractFlushingEventListener]  Flushing session**
17:34:21,163 DEBUG [org.hibernate.event.internal.AbstractFlushingEventListener]  Processing flush-time cascades
17:34:21,163 TRACE [org.hibernate.engine.internal.Cascade] Processing cascade ACTION_PERSIST_ON_FLUSH for: x.x.datastore.persistence.LobDataOutEntity
17:34:21,164 TRACE [org.hibernate.engine.internal.Cascade] Done processing cascade ACTION_PERSIST_ON_FLUSH for: x.x.datastore.persistence.LobDataOutEntity
17:34:21,189 TRACE [org.hibernate.persister.entity.AbstractEntityPersister] Dehydrating entity: [x.x.datastore.persistence.LobDataOutEntity#2972533]
17:34:21,189 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] binding parameter [1] as [BIGINT] - 2972533
17:34:21,190 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] binding parameter [2] as [BLOB] - oracle.sql.BLOB@67c6db48
17:34:48,845 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] binding parameter [3] as [CLOB] - <null>
**17:34:48,846 DEBUG [org.hibernate.engine.jdbc.batch.internal.BatchingBatch] Executing batch size: 1
17:35:21,295 DEBUG [org.hibernate.jdbc.Expectations] Success of batch update unknown: 0**
17:35:21,295 TRACE [org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl] Releasing statement [org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6@52cc5b6]
17:35:21,296 TRACE [org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl] Closing prepared statement [org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6@52cc5b6]
17:35:21,297 TRACE [org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl] Starting after statement execution processing [AFTER_STATEMENT]
17:35:21,297 DEBUG [org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl] Skipping aggressive release due to manual disabling
17:35:21,298 TRACE [org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl] Starting after statement execution processing [AFTER_STATEMENT]
17:35:21,299 DEBUG [org.hibernate.engine.jdbc.internal.LogicalConnectionImpl] Releasing JDBC connection
17:35:21,299 DEBUG [org.hibernate.engine.jdbc.internal.LogicalConnectionImpl] Released JDBC connection
17:35:21,300 TRACE [org.hibernate.event.internal.AbstractFlushingEventListener] Post flush

更新Hibernate,自版本4.0.x以来,应用了许多与Blob存储相关的重大改进(以及更多)。 以4.2.15.Final版本为例,或者-如果您已经准备好使用JPA2.1-4.3.6.Final版本,那么在撰写本文时,这些是最稳定、最高效的版本

我希望这些最新版本的性能也会超过旧的3.6.x版本,如果我错了,请让我们知道更多关于这个版本的细节


还有,为什么你今天要升级到JBoss7.1?它过时了,而且没有维护。现在,您可以免费进行开发,它基于JBoss 7。+但包括数千个错误修复和改进,或者,更先进一些,但也包含所有相同的改进和修复。

我看到
17:34:21190 TRACE
17:34:48845 TRACE
之间有很大区别。您确定数据源的配置与以前相同吗?我会尝试:1。检查这个2。在Hibernate中调试一点以了解确切的问题(Hibernate是开源的,只需附加正确Hibernate版本的源代码);您的应用服务器也发生了根本性的变化。Jboss 7.1.1中有很多bug,您可能想尝试从源代码构建7.2版本(您可以使用以下步骤:,但不是7.1.3,而是7.1.3),看看这是否有什么改进。感谢您的快速回复。根据你的建议,我已经下载了jboss-eap-6.2并在那里部署了我的应用程序。结果是一样的。仍然超过1分钟,hibernate日志中的等待完全相同。为了排除applicaton服务器,我将把hibernate降级到我知道它在Jboss 7.1中工作的版本,看看它是如何工作的。感谢您的帮助!我用JBoss7.1尝试了4.2.15.Final版本,结果是一样的。仍然超过1分钟。在使用JBoss-eap-6.2附带的Hibernate4.2.6版本进行测试时,我得到了相同的时间(>1分钟)。我已经编辑了我的初始帖子,并添加了关于persistence.xml文件、DS配置和创建BLOB的java代码的详细信息。你看到他们有什么明显的问题吗?为了回答您的问题,我们使用JBoss 7.1作为从6.1.0升级JBoss的中间版本。我还使用Hiberntae 4.2.15.Final在JBoss eap 6.2上运行了测试,结果是一样的。我在JIRA中打开了一个bug,在这里我添加了关于我使用的配置的更多细节。
<persistence xmlns="http://java.sun.com/xml/ns/persistence">
  <persistence-unit name="DAL-connector-persistence">
  <description>Persistence unit for SyncML module</description>
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <jta-data-source>java:jboss/datasources/DS</jta-data-source>
  <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.CustomOracleDialect"/> //the custom dialect is built over Oracle10gDialect
      <property name="hibernate.connection.release_mode" value="auto"></property>
      <property name="hibernate.transaction.auto_close_session" value="true"></property>
      <property name="hibernate.show_sql" value="false"></property>
      <property name="hibernate.jdbc.batch_size" value="30"></property>
      <property name="hibernate.jdbc.fetch_size" value="30"></property>
      <property name="hibernate.cache.use_second_level_cache" value="false"></property>
      <property name="hibernate.cache.use_query_cache" value="false"></property>
      <property name="hibernate.current_session_context_class" value="jta"></property>
      <property name="hibernate.transaction.flush_before_completion" value="true">  </property>
    </properties>
</persistence-unit>
<xa-datasource jndi-name="java:jboss/datasources/****DS" pool-name="***LDS" enabled="true" use-java-context="true">
   <xa-datasource-property name="URL">jdbc:oracle:thin:@@oracle.ds.ip@:@oracle.ds.sid@</xa-datasource-property>
   <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
   <driver>oracle</driver>
   <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
   <xa-pool>
       <min-pool-size>5</min-pool-size>
       <max-pool-size>20</max-pool-size>
       <prefill>true</prefill>
       <is-same-rm-override>false</is-same-rm-override>
   </xa-pool>
   <security>
       <security-domain>***DS-oracle-encrypted-password</security-domain>
   </security>
   <recovery no-recovery="true"/>
   <validation>
       <validate-on-match>false</validate-on-match>
       <background-validation>true</background-validation>
       <exception-sorter class-name="org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter"/>
   </validation>
   <timeout>
       <blocking-timeout-millis>5000</blocking-timeout-millis>
       <idle-timeout-minutes>2</idle-timeout-minutes>
   </timeout>
   <statement>
       <track-statements>true</track-statements>
       <prepared-statement-cache-size>1000</prepared-statement-cache-size>
   </statement>
</xa-datasource>
//lob initialization
LobDataOutEntity lobEntity = new LobDataOutEntity(); 
Session session = (Session) manager.getDelegate(); 
Blob newContent = Hibernate.getLobCreator(session).createBlob(new byte[]{}); 
lobEntity.setBlobData(newContent); 
manager.persist(lobEntity);


//read chunks of bytes and write them into the blob
while (...)
{
  lobEntity.getBlobData().setBytes(wrote + 1, b64DataBuf);
}

//merge the content when all bytes have been written into the blob
manager.merge(lobEntity);