После нескольких таких же запросов hql приложение зависает - PullRequest
0 голосов
/ 21 июня 2011

Я вызываю нижеприведенную функцию с тем же batchNumber , и она работает без проблем 15 раз и без проблем получает записи из базы данных, но в 16. время приложение останавливается, когда query.list () строка называется. и не пишет " после запроса " (см. строку System.out). Он просто теряет фокус отладки и не дает никаких исключений. Эта проблема, вероятно, не о hql, потому что я видел эту проблему раньше, чем hql, и я использовал критерии вместо hql, и я получил эту проблему. Но для этого, когда я использовал « group by » в критериях (setProjection ....), он не возвращает результат, поскольку hibernate model (object) просто возвращает список. Но мне нужны результаты в качестве модели.

Примечание: примерно в 15 раз это только для теста. Это веб-приложение, и пользователь может многократно нажимать кнопку, которая вызывает эту функцию, чтобы просмотреть извлеченные записи из базы данных.

SiteAddressDaoImpl

public class SiteAddressDaoImpl<T, Id extends Serializable> extends
        GenericDaoHibernateImpl implements SiteAddressDao {
    public List<SiteAddressModel> getSitesByBatch(String batchNumber) {
        try {
            List<SiteAddressModel> siteList;
            MigrationPlanDao migrationPlanDao = ServiceFactory
                    .getO2SiteService().getMigrationPlanDao();
            Query query = this.getSession().createQuery(
                    "from " + persistentClass.getName() + " where "
                            + "siteType =:" + "type and  siteName in "
                            + "(select distinct exchange from "
                            + migrationPlanDao.getPersistentClass().getName()
                            + " where migrationBatchNumber =:" + "batchNumber"
                            + ")");
            query.setString("batchNumber", batchNumber);
            query.setString("type", "LLU/ASN");
            System.out.println("before query");

            siteList = query.list();
            System.out.println("after query");
            return siteList;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    ...
}

GenericDaoHibernateImpl

public class GenericDaoHibernateImpl<T, Id extends Serializable> extends HibernateDaoSupport implements GenericDao<T, Id> {..........}

Свойства Hibernate

 <!-- Hibernate SessionFactory Definition -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
      depends-on="annotatedClassRegistrar">
    <property name="dataSource" ref="dataSource"/>

    <property name="annotatedClasses" ref="annotatedClassList"/>

    <property name="hibernateProperties">
        <props>
            <prop key="c3p0.acquire_increment">1</prop>
            <prop key="c3p0.idle_test_period">120</prop>
            <prop key="c3p0.max_size">50</prop>
            <prop key="c3p0.max_statements">0</prop>
            <prop key="c3p0.min_size">20</prop>
            <prop key="c3p0.timeout">0</prop>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
            <prop key="hibernate.connection.autocommit">true</prop>
            <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>
        </props>
    </property>
</bean>

<!-- Spring Data Access Exception Translator Defintion -->
<bean id="jdbcExceptionTranslator" class="org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator">
    <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="exceptionTranslator" ref="jdbcExceptionTranslator"/>
    <property name="dataSource" ref="dataSource"/>
</bean>

  <!-- Hibernate Template Defintion -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
    <property name="jdbcExceptionTranslator" ref="jdbcExceptionTranslator"/>
</bean>

бобов для даос

    <bean name="migrationPlanDao"
      class="com.alcatel.lucent.tr.o2ccm.middleware.dao.impl.MigrationPlanDaoImpl">
    <constructor-arg value="com.alcatel.lucent.tr.o2ccm.middleware.model.hibernate.MigrationPlanModel"/>
    <property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>

     <bean name="siteAddressDao" class="com.alcatel.lucent.tr.o2ccm.middleware.dao.impl.SiteAddressDaoImpl">
    <constructor-arg value="com.alcatel.lucent.tr.o2ccm.middleware.model.hibernate.SiteAddressModel"/>
    <property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>

я просто сделал hql

 Query query = this.getSession().createQuery("from " + persistentClass.getName() +  " where " +  "siteName='siteName'");

это не сработало при 16-м запросе.

Я использовал критерий экземпляр hql, который выполняет ту же работу, что и hql. Сработало какая разница ...

DetachedCriteria criteria = DetachedCriteria.forClass(persistentClass);
criteria.add(Property.forName("siteName").eq("siteName"));        

siteList = getHibernateTemplate().findByCriteria(criteria);      

Hibernate версия 3.2.0.ga

Обновлено : я добавил некоторые детали.

Ответы [ 2 ]

1 голос
/ 22 июня 2011

Я решил проблему с помощью HibernateCallBack.

См. комментарии , чтобы узнать, какая реализация работает или не работает. Особенно если посмотреть на функции findByHql() и findByHqlQuery(), будет легче увидеть, в чем разница.

findByHql() - рабочая реализация. Разница, по-видимому, заключается в session , потому что в функции getSitesByBatch(), когда я вызываю findByHqlQuery(), я создаю запрос с помощью this.getSession, но когда я вызываю findByHql(), мне не нужно создайте запрос, потому что эта функция уже создает запрос по сеансу, взятому из параметра doInHibernate(Session session) функции Session. Прямой звонок на query.list() тоже не работает.

см. Код:

public class SiteAddressDaoImpl<T, Id extends Serializable> extends
        GenericDaoHibernateImpl implements SiteAddressDao {

    public List<SiteAddressModel> getSitesByBatch(String batchNumber) {
        List<SiteAddressModel> siteList;
        MigrationPlanDao migrationPlanDao = ServiceFactory.getO2SiteService()
                .getMigrationPlanDao();
        // working
        String hql = "from " + persistentClass.getName() + " where "
                + "siteType ='LLU/ASN' and  siteName in "
                + "(select distinct exchange from "
                + migrationPlanDao.getPersistentClass().getName()
                + " where migrationBatchNumber =" + "'" + batchNumber + "'"
                + ")";

        siteList = findbyHQL(hql);

        /*
         * // notWorking Query query = this.getSession().createQuery("from " +
         * persistentClass.getName() + " where " + "siteType =:" +
         * "type and  siteName in " + "(select distinct exchange from " +
         * migrationPlanDao.getPersistentClass().getName() +
         * " where migrationBatchNumber =:" + "batchNumber" + ")" );
         * 
         * query.setString("batchNumber", batchNumber); query.setString("type",
         * "LLU/ASN"); siteList = query.list();
         */

        /*
         * //working DetachedCriteria criteria =
         * DetachedCriteria.forClass(persistentClass);
         * criteria.add(Property.forName("siteName").eq("Barnet")); siteList =
         * getHibernateTemplate().findByCriteria(criteria);
         */

        /*
         * //notWorking Query query = this.getSession().createQuery("from " +
         * persistentClass.getName() + " where " + "siteName='Barnet'");
         * siteList = findbyHQLQuery(query);
         */

        /*
         * //working String hql = "from " + getPersistentClass().getName() +
         * " where " + "siteName='Barnet'" ; siteList = findbyHQL(hql);
         */

        return siteList;
    }
}

public class GenericDaoHibernateImpl<T, Id extends Serializable> extends
        HibernateDaoSupport implements GenericDao<T, Id> {
    public List<T> findbyHQL(final String hql) throws DaoException {
        getHibernateTemplate().setAlwaysUseNewSession(true);
        return getHibernateTemplate().executeFind(new HibernateCallback() {
            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                // String str = "from " + persistentClass.getName() + " o";
                Query query = session.createQuery(hql);
                List<T> list = query.list();
                logger.debug("Find " + list.size() + " records.");
                return list;
            }
        });
    }

    public List<T> findbyHQLQuery(final Query hqlQuery) throws DaoException {
        getHibernateTemplate().setAlwaysUseNewSession(true);
        return getHibernateTemplate().executeFind(new HibernateCallback() {
            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                List<T> list = hqlQuery.list();
                logger.debug("Find " + list.size() + " records.");
                return list;
            }
        });
    }
}
0 голосов
/ 21 июня 2011

Вы даете нам невероятно мало для продолжения. Число 15 кажется слишком круглым, чтобы человеческий глаз мог его игнорировать. Как вы управляете транзакциями и соединениями? Вы используете пул соединений? Вы возвращаете соединения в пул? Ваш пул подключений имеет размер ровно 15 подключений? Есть ли у вас какие-либо соединения в пуле, когда вы выполняете код в 16-й раз? Это то, что я предлагаю вам проверить первым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...