HibernateSearch,JPA,H2驱动程序在数据库索引过程中引发异常

康斯坦丁

使用HibernateSearch,我想索引我的H2嵌入式数据库。
调用此代码:

EntityManager em = articleDao.getEntityManager();
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
try {
    fullTextEntityManager.createIndexer().progressMonitor(new CustomMassIndexerProcessMonitor()).startAndWait();
} catch (InterruptedException e) {
    e.printStackTrace();
}  

索引几分钟后,将引发以下异常:

2013-09-04 09:01:41 ERROR LogErrorHandler.handleException():83 - HSEARCH000058: HSEARCH000116: Unexpected error during MassIndexer operation
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
    at java.lang.AbstractStringBuilder.append(Unknown Source)
    at java.lang.StringBuffer.append(Unknown Source)
    at java.io.StringWriter.write(Unknown Source)
    at org.h2.util.IOUtils.copyAndCloseInput(IOUtils.java:201)
    at org.h2.util.IOUtils.readStringAndClose(IOUtils.java:301)
    at org.h2.value.ValueLobDb.getString(ValueLobDb.java:226)
    at org.h2.jdbc.JdbcResultSet.getString(JdbcResultSet.java:296)
    at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$2.doExtract(VarcharTypeDescriptor.java:66)
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:64)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:261)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:247)
    at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:332)
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2912)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1673)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1605)
    at org.hibernate.loader.Loader.getRow(Loader.java:1505)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:713)
    at org.hibernate.loader.Loader.processResultSet(Loader.java:943)
    at org.hibernate.loader.Loader.doQuery(Loader.java:911)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342)
    at org.hibernate.loader.Loader.doList(Loader.java:2526)
    at org.hibernate.loader.Loader.doList(Loader.java:2512)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2342)
    at org.hibernate.loader.Loader.list(Loader.java:2337)
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:124)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1662)
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374)
    at org.hibernate.search.batchindexing.impl.IdentifierConsumerEntityProducer.loadList(IdentifierConsumerEntityProducer.java:151)
Hibernate Search: entityloader-2, CustomMassIndexerProcessMonitor entitiesLoaded(10)
Hibernate Search: collectionsloader-2, CustomMassIndexerProcessMonitor documentsAdded(1)
Hibernate Search: collectionsloader-2, CustomMassIndexerProcessMonitor documentsBuilt(1)
Hibernate Search: collectionsloader-3, CustomMassIndexerProcessMonitor documentsAdded(1)
Hibernate Search: collectionsloader-3, CustomMassIndexerProcessMonitor documentsBuilt(1)
2013-09-04 09:01:47 ERROR LogErrorHandler.handleException():83 - HSEARCH000058: HSEARCH000116: Unexpected error during MassIndexer operation
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOfRange(Unknown Source)
    at java.lang.String.<init>(Unknown Source)
    at java.lang.StringBuffer.toString(Unknown Source)
    at java.io.StringWriter.toString(Unknown Source)
    at org.h2.util.IOUtils.readStringAndClose(IOUtils.java:302)
    at org.h2.value.ValueLobDb.getString(ValueLobDb.java:226)
    at org.h2.jdbc.JdbcResultSet.getString(JdbcResultSet.java:296)
    at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$2.doExtract(VarcharTypeDescriptor.java:66)
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:64)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:261)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:247)
    at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:332)
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2912)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1673)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1605)
    at org.hibernate.loader.Loader.getRow(Loader.java:1505)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:713)
    at org.hibernate.loader.Loader.processResultSet(Loader.java:943)
    at org.hibernate.loader.Loader.doQuery(Loader.java:911)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342)
    at org.hibernate.loader.Loader.doList(Loader.java:2526)
    at org.hibernate.loader.Loader.doList(Loader.java:2512)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2342)
    at org.hibernate.loader.Loader.list(Loader.java:2337)
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:124)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1662)
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374)
    at org.hibernate.search.batchindexing.impl.IdentifierConsumerEntityProducer.loadList(IdentifierConsumerEntityProducer.java:151)
    at org.hibernate.search.batchindexing.impl.IdentifierConsumerEntityProducer.loadAllFromQueue(IdentifierConsumerEntityProducer.java:117)
    at org.hibernate.search.batchindexing.impl.IdentifierConsumerEntityProducer.run(IdentifierConsumerEntityProducer.java:94)
    at org.hibernate.search.batchindexing.impl.OptionallyWrapInJTATransaction.run(OptionallyWrapInJTATransaction.java:132)

似乎在尝试从数据库读取时,H2 util类之一抛出了此异常。我曾尝试使用以下命令增加堆容量:'-Xms1024m -Xmx2048m',但这无济于事:(
场景如下。我的H2数据库的每个条目都有一个字段类型CLOB。如果我在此字段中写入少量内容,则所有内容很好,不会引发任何错误,但是如果我在那些字段中有很多内容(每个字段900kb),那么在索引过程中会引发错误。

我正在使用以下罐子:
hibernate-entitymanager 4.2.4.Final
h2 1.3.173
hibernate-search 4.4.0.Alpha1

这是我的持久性单元配置:

<persistence-unit name="hibernateSearchH2TestPersistenceUnit" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <mapping-file>META-INF/queriesForTest.xml</mapping-file>

    <class>com.kaidex.db.entity.DocStatus</class>
    <class>com.kaidex.db.entity.DocType</class>
    <class>com.kaidex.db.entity.Article</class>
    <class>com.kaidex.db.entity.Issuer</class>
    <class>com.kaidex.db.entity.PublishingSource</class>

    <properties>
        <property name="hibernate.connection.url" value="jdbc:h2:D:\\kaidextestdb;CIPHER=XTEA"/>

        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
        <property name="hibernate.connection.driver_class" value="org.h2.Driver"/>

        <property name="hibernate.connection.username" value="sa"/>
        <property name="hibernate.connection.password" value="filepass userpass"/>

        <property name="hibernate.format_sql" value="true"/>
        <property name="hibernate.show_sql" value="false" />
        <property name="hibernate.hbm2ddl.auto" value="update" />


        <property name="hibernate.search.default.directory_provider" value="filesystem"/> 
        <property name="hibernate.search.default.indexBase" value="D:\lucene"/>
        <property name="hibernate.search.lucene_version" value="LUCENE_36"/>
    </properties>
</persistence-unit>

更新。添加了实体配置:

@Entity(name="Article")
@Table(name="Article", schema="Kaidexdb")
@Indexed
public class Article {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;
    ... 
    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    @Column(columnDefinition="CLOB")
    private String contentRo;

    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    @Column(columnDefinition="CLOB")
    private String contentRu;

    @IndexedEmbedded
    @ManyToOne
    @JoinColumn(name="docType_id", nullable=false)  
    private DocType docType;

    @IndexedEmbedded
    @ManyToOne
    @JoinColumn(name="docStatus_id", nullable=false)    
    private DocStatus docStatus;

    @IndexedEmbedded
    @ManyToOne
    @JoinColumn(name="issuer_id", nullable=false)
    private Issuer issuer;

    @IndexedEmbedded
    @ManyToOne
    @JoinColumn(name="ps_id", nullable=false)
    private PublishingSource publishingSource;
...


@Entity(name="DocStatus")
@Table(name="DocStatus", schema="Kaidexdb")
@Indexed
public class DocStatus {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    private String longNameRo;
    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    private String longNameRu;

    @OneToMany(mappedBy="docStatus", targetEntity=Article.class)
    private List<Article> articles; 
...

@Entity(name="DocType")
@Table(name="DocType", schema="Kaidexdb")
@Indexed
public class DocType {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;

    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    @Column(unique=true)
    private String shortName;

    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    private String longNameRo;

    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    private String longNameRu;

    @OneToMany(mappedBy="docType", targetEntity=Article.class)
    private List<Article> articles;
...


@Entity(name="Issuer")
@Table(name="Issuer", schema="Kaidexdb")
@Indexed
public class Issuer {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;

    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    private String shortNameRo; 

    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    private String longNameRo;  

    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    private String longNameRu;

    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    @Column(name="parent_id")
    private long parentId; 

    @OneToMany(mappedBy="issuer", targetEntity=Article.class)
    private List<Article> articles;
...


@Entity
@Table(name="PublishingSource", schema="Kaidexdb")
@Indexed
public class PublishingSource {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;

    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    private String longNameRo;

    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    private String longNameRu;


    @OneToMany(mappedBy="publishingSource", targetEntity=Article.class)
    private List<Article> articles; 

有人可以帮我解决这个问题吗?
也许我应该对H2嵌入式数据库进行一些特定的配置,以通知H2我使用了很大的CLOB字段?

先感谢您。

康斯坦丁

我已经部分解决了这个问题。我减少了每个查询通过Hibernate Search加载的对象数:

EntityManager em = articleDao.getEntityManager();
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
fullTextEntityManager.createIndexer().batchSizeToLoadObjects(2).startAndWait();

如果H2开发人员能够在下一版本中解决此问题,那将是很棒的。
我已经使用HSQLDB和Apache Derby测试了相同的代码,并且这些数据库驱动程序未引发任何异常。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

h2数据库驱动程序发出未找到驱动程序的消息

来自分类Dev

Spring Boot-内存泄漏-H2数据库-不注销驱动程序

来自分类Dev

连接到H2数据库时,DriverManager尝试使用mariadb驱动程序

来自分类Dev

ODP.NET托管驱动程序在连接到Oracle数据库时引发异常

来自分类Dev

Symfony2在数据库驱动程序上给出ParameterNotFoundException

来自分类Dev

NHibernate中的多个数据库驱动程序

来自分类Dev

代码中的数据库驱动程序规范

来自分类Dev

使用Sqlsrv驱动程序从存储过程中获取数据

来自分类Dev

区分JDBC驱动程序异常和数据库异常

来自分类Dev

Slick 3.0在数据库驱动程序级别上是被动的还是异步的?对于哪些数据库?

来自分类Dev

从JAR文件中包含的应用程序访问H2数据库

来自分类Dev

E4 应用程序中的 H2 数据库无法解析

来自分类Dev

H2数据库中的当前时刻

来自分类Dev

在 h2 数据库中存储图像

来自分类Dev

Spring H2驱动程序问题

来自分类Dev

如何检查值是否在数据库中而不会在Zend中引发异常?

来自分类Dev

当Rails中不存在数据库时会引发什么类型的异常?

来自分类Dev

在数据库中未使用属性的动态OrderBy()引发异常

来自分类Dev

H2数据库的IOExceptions

来自分类Dev

H2数据库与unitils

来自分类Dev

H2数据库表上的SQL查询引发ArrayIndexOutOfBoundsException

来自分类Dev

有没有一种方法可以通过Node.js驱动程序检查Mongo中是否存在数据库?

来自分类Dev

android应用程序开发过程中的空数据库

来自分类Dev

使用瘦驱动程序的Oracle 12c数据库连接会引发IO错误

来自分类Dev

我可以在数据库的不同存储过程中引用SQL Server中的CONSTANT这样的东西吗?

来自分类Dev

休眠控制台配置无法在数据库连接中找到jdbc驱动程序

来自分类Dev

尝试使用H2数据库更新JDBC ResultSet时发生异常

来自分类Dev

H2数据库Json字段休眠转换器异常

来自分类Dev

尝试使用H2数据库更新JDBC ResultSet时发生异常

Related 相关文章

  1. 1

    h2数据库驱动程序发出未找到驱动程序的消息

  2. 2

    Spring Boot-内存泄漏-H2数据库-不注销驱动程序

  3. 3

    连接到H2数据库时,DriverManager尝试使用mariadb驱动程序

  4. 4

    ODP.NET托管驱动程序在连接到Oracle数据库时引发异常

  5. 5

    Symfony2在数据库驱动程序上给出ParameterNotFoundException

  6. 6

    NHibernate中的多个数据库驱动程序

  7. 7

    代码中的数据库驱动程序规范

  8. 8

    使用Sqlsrv驱动程序从存储过程中获取数据

  9. 9

    区分JDBC驱动程序异常和数据库异常

  10. 10

    Slick 3.0在数据库驱动程序级别上是被动的还是异步的?对于哪些数据库?

  11. 11

    从JAR文件中包含的应用程序访问H2数据库

  12. 12

    E4 应用程序中的 H2 数据库无法解析

  13. 13

    H2数据库中的当前时刻

  14. 14

    在 h2 数据库中存储图像

  15. 15

    Spring H2驱动程序问题

  16. 16

    如何检查值是否在数据库中而不会在Zend中引发异常?

  17. 17

    当Rails中不存在数据库时会引发什么类型的异常?

  18. 18

    在数据库中未使用属性的动态OrderBy()引发异常

  19. 19

    H2数据库的IOExceptions

  20. 20

    H2数据库与unitils

  21. 21

    H2数据库表上的SQL查询引发ArrayIndexOutOfBoundsException

  22. 22

    有没有一种方法可以通过Node.js驱动程序检查Mongo中是否存在数据库?

  23. 23

    android应用程序开发过程中的空数据库

  24. 24

    使用瘦驱动程序的Oracle 12c数据库连接会引发IO错误

  25. 25

    我可以在数据库的不同存储过程中引用SQL Server中的CONSTANT这样的东西吗?

  26. 26

    休眠控制台配置无法在数据库连接中找到jdbc驱动程序

  27. 27

    尝试使用H2数据库更新JDBC ResultSet时发生异常

  28. 28

    H2数据库Json字段休眠转换器异常

  29. 29

    尝试使用H2数据库更新JDBC ResultSet时发生异常

热门标签

归档