eclipselink повторяет один и тот же запрос тысячу раз, затем исключение стекового потока

#eclipselink #stack-overflow #repeat

#eclipselink #переполнение стека #повторите

Вопрос:

У меня есть проект jsf, который уже много раз развертывался на сервере приложений Oracle, он использует eclipse link 2.2.0, в новой недавней установке сайт выходит из строя при загрузке данных из БД, поскольку он продолжает выполнять один и тот же запрос тысячу раз, а затем выдает исключение stackoverflow

Если я подключаюсь к той же новой установке из моего локального jdev, приложение запускается нормально, поэтому кажется, что проблема с конфигурацией сервера, а не проблема с кодированием. код, используемый для создания дескриптора объекта

 public ClassDescriptor buildTLEntityPCDAODescriptor() {
    RelationalDescriptor descriptor = new RelationalDescriptor();
    descriptor.setJavaClass(com.its.tabs.tpc.layers.dal.entity.toplink.TLEntityPCDAO.class);
    descriptor.addTableName("TPC_ENTITIES");
    descriptor.addPrimaryKeyFieldName("TPC_ENTITIES.ENTITY_ID");

    // Inheritance Properties.

    // Descriptor Properties.
    descriptor.useSoftCacheWeakIdentityMap();
    descriptor.setIdentityMapSize(100);
    descriptor.useRemoteSoftCacheWeakIdentityMap();
    descriptor.setRemoteIdentityMapSize(100);
    descriptor.setSequenceNumberFieldName("TPC_ENTITIES.ENTITY_ID");
    descriptor.setSequenceNumberName("SEQ_ENTITIES");
    descriptor.setAlias("TLEntityPCDAO");

    // Cache Invalidation Policy
    TimeToLiveCacheInvalidationPolicy policy = new TimeToLiveCacheInvalidationPolicy(1);
    policy.setShouldUpdateReadTimeOnUpdate(false);
    descriptor.setCacheInvalidationPolicy(policy);

    // Query Manager.
    descriptor.getQueryManager().checkCacheForDoesExist();

    DirectToFieldMapping descriptionMapping = new DirectToFieldMapping();
    descriptionMapping.setAttributeName("description");
    descriptionMapping.setFieldName("TPC_ENTITIES.DESCRIPTION");
    descriptor.addMapping(descriptionMapping);

    DirectToFieldMapping serviceProviderCodeMapping = new DirectToFieldMapping();
    serviceProviderCodeMapping.setAttributeName("serviceProviderCode");
    serviceProviderCodeMapping.setFieldName("TPC_ENTITIES.SERVICE_PROVIDER_CODE");
    descriptor.addMapping(serviceProviderCodeMapping);

    DirectToFieldMapping entity_idMapping = new DirectToFieldMapping();
    entity_idMapping.setAttributeName("entity_id");
    entity_idMapping.setNullValue(new Long(0));
    entity_idMapping.setFieldName("TPC_ENTITIES.ENTITY_ID");
    descriptor.addMapping(entity_idMapping);

    DirectToFieldMapping idMapping = new DirectToFieldMapping();
    idMapping.setAttributeName("id");
    idMapping.readOnly();
    idMapping.setFieldName("TPC_ENTITIES.ENTITY_ID");
    descriptor.addMapping(idMapping);

    DirectToFieldMapping levelIdMapping = new DirectToFieldMapping();
    levelIdMapping.setAttributeName("levelId");
    levelIdMapping.setNullValue(new Long(0)); //changed from -1 to 0
    levelIdMapping.setFieldName("TPC_ENTITIES.LEVEL_ID");
    descriptor.addMapping(levelIdMapping);

    DirectToFieldMapping lookupIdMapping = new DirectToFieldMapping();
    lookupIdMapping.setAttributeName("lookupId");
    lookupIdMapping.setNullValue(new Long(0)); //changed from -1 to 0
    lookupIdMapping.setFieldName("TPC_ENTITIES.LOOKUP_ID");
    descriptor.addMapping(lookupIdMapping);

    DirectToFieldMapping levelDepthMapping = new DirectToFieldMapping();
    levelDepthMapping.setAttributeName("levelDepth");
    levelDepthMapping.setFieldName("TPC_ENTITIES.LEVEL_DEPTH");
    descriptor.addMapping(levelDepthMapping);

    DirectToFieldMapping entity_sequenceMapping = new DirectToFieldMapping();
    entity_sequenceMapping.setAttributeName("entity_sequence");
    entity_sequenceMapping.setNullValue(new Long(0));
    entity_sequenceMapping.setFieldName("TPC_ENTITIES.ENTITY_SEQUENCE");
    descriptor.addMapping(entity_sequenceMapping);

    DirectToFieldMapping entity_typeMapping = new DirectToFieldMapping();
    entity_typeMapping.setAttributeName("entity_type");
    entity_typeMapping.setFieldName("TPC_ENTITIES.ENTITY_TYPE");
    descriptor.addMapping(entity_typeMapping);

    DirectToFieldMapping nameMapping = new DirectToFieldMapping();
    nameMapping.setAttributeName("name");
    nameMapping.setFieldName("TPC_ENTITIES.NAME");
    descriptor.addMapping(nameMapping);

    DirectToFieldMapping parent_entity_idMapping = new DirectToFieldMapping();
    parent_entity_idMapping.setAttributeName("parent_entity_id");
    parent_entity_idMapping.setNullValue(new Long(0)); //changed from -1 to 0
    parent_entity_idMapping.setFieldName("TPC_ENTITIES.PARENT_ENTITY_ID");
    descriptor.addMapping(parent_entity_idMapping);

    AggregateObjectMapping auditFieldsMapping = new AggregateObjectMapping();
    auditFieldsMapping.setAttributeName("auditFields");
    auditFieldsMapping.setReferenceClass(com.its.tabs.architecture.dal.persistency.AuditFields.class);
    auditFieldsMapping.setIsNullAllowed(false);
    auditFieldsMapping.addFieldNameTranslation("TPC_ENTITIES.CREATED_BY", "createdBy->DIRECT");
    auditFieldsMapping.addFieldNameTranslation("TPC_ENTITIES.MODIFIED_BY", "modifiedBy->DIRECT");
    auditFieldsMapping.addFieldNameTranslation("TPC_ENTITIES.CREATED_DATE", "createdDate->DIRECT");
    auditFieldsMapping.addFieldNameTranslation("TPC_ENTITIES.MODIFIED_DATE", "modifiedDate->DIRECT");
    descriptor.addMapping(auditFieldsMapping);

    OneToManyMapping entitesMapping = new OneToManyMapping();
    entitesMapping.setAttributeName("entites");
    entitesMapping.setReferenceClass(com.its.tabs.tpc.layers.dal.entity.toplink.TLEntityPCDAO.class);
    entitesMapping.useTransparentCollection();
    entitesMapping.useCollectionClass(org.eclipse.persistence.indirection.IndirectList.class);
    entitesMapping.addTargetForeignKeyFieldName("TPC_ENTITIES.PARENT_ENTITY_ID", "TPC_ENTITIES.ENTITY_ID");
    descriptor.addMapping(entitesMapping);

    OneToManyMapping entityattributesMapping = new OneToManyMapping();
    entityattributesMapping.setAttributeName("entityattributes");
    entityattributesMapping.setReferenceClass(com.its.tabs.tpc.layers.dal.entityattributes.toplink.TLEntityAttributesDAO.class);
    entityattributesMapping.useTransparentCollection();
    entityattributesMapping.useCollectionClass(org.eclipse.persistence.indirection.IndirectList.class);
    entityattributesMapping.addTargetForeignKeyFieldName("TPC_ENTITY_ATTRIBUTES.ENTITY_ID", "TPC_ENTITIES.ENTITY_ID");
    descriptor.addMapping(entityattributesMapping);

    OneToOneMapping entityLevelIdMapping = new OneToOneMapping();
    entityLevelIdMapping.setAttributeName("levels");
    entityLevelIdMapping.setReferenceClass(TLLevelsDAO.class);
    entityLevelIdMapping.useProxyIndirection();
    entityLevelIdMapping.readOnly();
    entityLevelIdMapping.addForeignKeyFieldName("TPC_ENTITIES.LEVEL_ID", "TPC_LEVELS.LEVEL_ID");
    descriptor.addMapping(entityLevelIdMapping);

    OneToOneMapping entityLookupIdMapping = new OneToOneMapping();
    entityLookupIdMapping.setAttributeName("lookups");
    entityLookupIdMapping.setReferenceClass(TLLookupDAO.class);
    entityLookupIdMapping.useProxyIndirection();
    entityLookupIdMapping.readOnly();
    entityLookupIdMapping.addForeignKeyFieldName("TPC_ENTITIES.LOOKUP_ID", "TPC_LOOKUP.LOOKUP_ID");
    descriptor.addMapping(entityLookupIdMapping);

    return descriptor;
}
  

код, используемый для чтения объектов

         List<EntityPCEntity> entityList      = new ArrayList<EntityPCEntity>();            
        entityList = (List<EntityPCEntity>)this.getTABSEntityManagerFinder().getEclipseLinkAdapter().readMultipleDAOs(TLEntityPCDAO.class);

       return entityList;
  

исключение

14/06/17 13:03:36 Вызвано: java.lang.Ошибка StackOverflowError 14/06/17 13:03:36 в com.evermind.server.connector.ApplicationConnectionManager.getTransaction(ApplicationConnectionManager.java:1582) 06.04.17 13:03:36 на com.evermind.server.connector.ApplicationConnectionManager.getConnectionFromShareablePool(ApplicationConnectionManager.java:1652) 06.04.17 13:03:36 на com.evermind.server.connector.ApplicationConnectionManager.acquireConnectionContext(ApplicationConnectionManager.java:1497) 06.04.17 13:03:36 на com.evermind.server.connector.ApplicationConnectionManager.allocateConnection(ApplicationConnectionManager.java:1449) 06.04.17 13:03:36 в oracle.j2ee.connector.OracleConnectionManager.unprivileged_allocateConnection(OracleConnectionManager.java:238) 06.04.17 13:03:36 в oracle.j2ee.connector.OracleConnectionManager.allocateConnection(OracleConnectionManager.java: 192) 14/06/17 13:03:36 в oracle.oc4j.sql.ManagedDataSource.getConnection(ManagedDataSource.java:197) 14/06/17 13:03:36 в oracle.oc4j.sql.ManagedDataSource.getConnection(ManagedDataSource. java:142) 14/06/17 13:03:36 в oracle.oc4j.sql.ManagedDataSource.getConnection(ManagedDataSource.java: 127) 14/06/17 13:03:36 в org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:126) 06.04.17 13:03:36 в org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94) 06.04.17 14:03:36 в org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162) 06.04.17 13:03:36 в org.eclipse.persistence.internal.databaseaccess.DatasourceAccessor.connectInternal(DatasourceAccessor.java:330) 06.04.17 13:03:36 в org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.connectInternal(DatabaseAccessor.java:291) 06.04.17 13:03:36 в org.eclipse.persistence.internal.databaseaccess.DatasourceAccessor.reconnect(DatasourceAccessor.java:565) 06.04.17 13:03:36 в org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.reconnect(DatabaseAccessor.java:1434) 06.04.17 13:03:36 в org.eclipse.persistence.internal.databaseaccess.DatasourceAccessor.incrementCallCount(DatasourceAccessor.java:305) 06.04.17 13:03:36 в org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:570) 06.04.17 13:03:36 в org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:526) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1729) 06.04.17 13:03:36 в org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:566) 06.04.17 13:03:36 в org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:207) 06.04.17 13:03:36 в org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193) 06.04.17 13:03:36 в org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectOneRow(DatasourceCallQueryMechanism.java:667) 06.04.17 13:03:36 в org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectOneRowFromTable(ExpressionQueryMechanism.java:2603) 06.04.17 13:03:36 в org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectOneRow(ExpressionQueryMechanism.java:2574) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ReadObjectQuery.executeObjectLevelReadQuery(ReadObjectQuery.java:444) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1080) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.DatabaseQuery.execute(DatabaseQuery.java:808) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1040) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ReadObjectQuery.execute(ReadObjectQuery.java:412) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1126) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2842) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.AbstractSession.ExecuteQuery(AbstractSession.java:1521) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.AbstractSession.ExecuteQuery(AbstractSession.java:1503) 06.04.17 14:03:36 в org.eclipse.persistence.internal.sessions.AbstractSession.ExecuteQuery(AbstractSession.java:1463) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.AbstractSession.checkAndRefreshInvalidObject(AbstractSession.java:1024) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.cloneAndRegisterObject(UnitOfWorkImpl.java:960) 06.04.17 13:03:36 в org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildWorkingCopyCloneNormally(ObjectBuilder.java:628) 06.04.17 13:03:36 в org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObjectInUnitOfWork(ObjectBuilder.java:565) 06.04.17 13:03:36 в org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:497) 06.04.17 13:03:36 в org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:456) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ObjectLevelReadQuery.buildObject(ObjectLevelReadQuery.java:723) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ReadObjectQuery.registerResultInUnitOfWork(ReadObjectQuery.java:766) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ReadObjectQuery.executeObjectLevelReadQuery(ReadObjectQuery.java:451) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1080) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.DatabaseQuery.execute(DatabaseQuery.java:808) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1040) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ReadObjectQuery.execute(ReadObjectQuery.java:412) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1126) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2842) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.AbstractSession.ExecuteQuery(AbstractSession.java:1521) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.AbstractSession.ExecuteQuery(AbstractSession.java:1503) 06.04.17 14:03:36 в org.eclipse.persistence.internal.sessions.AbstractSession.ExecuteQuery(AbstractSession.java:1463) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.AbstractSession.checkAndRefreshInvalidObject(AbstractSession.java:1024) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.cloneAndRegisterObject(UnitOfWorkImpl.java:960) 06.04.17 13:03:36 в org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildWorkingCopyCloneNormally(ObjectBuilder.java:628) 06.04.17 13:03:36 в org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObjectInUnitOfWork(ObjectBuilder.java:565) 06.04.17 13:03:36 в org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:497) 06.04.17 13:03:36 в org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:456) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ObjectLevelReadQuery.buildObject(ObjectLevelReadQuery.java:723) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ReadObjectQuery.registerResultInUnitOfWork(ReadObjectQuery.java:766) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ReadObjectQuery.executeObjectLevelReadQuery(ReadObjectQuery.java:451) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1080) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.DatabaseQuery.execute(DatabaseQuery.java:808) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1040) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ReadObjectQuery.execute(ReadObjectQuery.java:412) 06.04.17 13:03:36 в org.eclipse.persistence.запросы.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1126) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2842) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.AbstractSession.ExecuteQuery(AbstractSession.java:1521) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.AbstractSession.ExecuteQuery(AbstractSession.java:1503) 06.04.17 14:03:36 в org.eclipse.persistence.internal.sessions.AbstractSession.ExecuteQuery(AbstractSession.java:1463) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.AbstractSession.checkAndRefreshInvalidObject(AbstractSession.java:1024) 06.04.17 13:03:36 в org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.cloneAndRegisterObject(UnitOfWorkImpl.java:960) 06.04.17 13:03:36 в org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildWorkingCopyCloneNormally(ObjectBuilder.java:628) 06.04.17 13:03:36 в org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObjectInUnitOfWork(ObjectBuilder.java:565) 06.04.17 13:03:36 в org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:497)

Комментарии:

1. Вы используете действительно странный способ чтения базы данных. Разве это не нормально для использования EntityManager ?

Ответ №1:

Если вы посмотрите на свою политику недействительности:

 TimeToLiveCacheInvalidationPolicy policy = new TimeToLiveCacheInvalidationPolicy(1);
policy.setShouldUpdateReadTimeOnUpdate(false);
descriptor.setCacheInvalidationPolicy(policy);
  

Вы сделали его недействительным в течение миллисекунды, вероятно, еще до того, как его можно будет прочитать. Хотя я не вижу больше информации о вашей объектной модели или выполняемых запросах, это, вероятно, вносит очень большой вклад в вашу проблему, поскольку это означает, что любые ссылки на этот объект почти всегда будут признаны недействительными и будут вынуждены запрашивать его снова.