[hibernate-announce] Performance Problem

Harald Entner harald.entner at gmx.at
Thu Jun 14 06:12:54 EDT 2007


Hello everyone,

i have a problem with the performance of hibernate. I execute the 
following code during server startup about 5000 times.

public PoTextModule findTextModuleByNameAndLanguage(String name, String 
uid) {
        long st = System.currentTimeMillis();
        Object[] keyValues = {name, uid};
        try {
            List l = getHibernateTemplate().find("from PoTextModule tm" +
                    " where tm.name = ? and tm.language.UID = ?",keyValues);
            return (PoTextModule) (l.size()>0 ? l.get(0) : null);
        } catch (Exception e) {
            logger.error("Could not determine textmodule with name '" + 
name + "' and language '" + uid +"'");
            logger.error(e,e);
            return null;
        }
        finally {
            logger.info("ftmbnal: " + (System.currentTimeMillis()-st) + 
".");
        }
    }

It should return a textmodule with the given name and language. When the 
server starts, the query is pretty fast. But the more queries have been 
executed, the more time it needs to execute.

The startup looks like this

start transaction
    for all modules
       for all textmodules in the modules
          if textmodule is existent 
                if textmodule hasChanged
                     update module
          else
                create textmodule
       // end for all textmodulesmodules
// end for all modules
       
findTextModuleByNameAndLanguage(String name, String uid)  needs 0 to 30 
ms in the beginning, but after a while sometimes 500ms.

What is wrong? The table has no more than 5000 entries, and there is 
almost no difference if its empty or not.

Maybe too many queries in one transaction?

Here is my hbm:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 
3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-cascade="none" default-access="property" 
default-lazy="true" auto-import="true">
  <class table="PoTextModule" 
name="at.workflow.webdesk.po.model.PoTextModule" mutable="true" 
polymorphism="implicit" dynamic-update="false" dynamic-insert="false" 
select-before-update="false" optimistic-lock="version">
    <cache usage="read-write" include="all" />
    <id name="UID" type="string" column="TEXTMODULE_UID" length="32">
      <generator class="uuid.hex" />
    </id>
    <property name="name" unique="false" optimistic-lock="true" 
lazy="false" generated="never">
      <column name="NAME" unique-key="nameAndLanguage" />
    </property>
    <property name="value" length="1000" unique="false" 
optimistic-lock="true" lazy="false" generated="never" />
    <many-to-one cascade="none" foreign-key="FK_TEXTMODULE_LANGUAGE" 
not-null="true" name="language" unique="false" update="true" 
insert="true" optimistic-lock="true" not-found="exception" embed-xml="true">
      <column name="LANGUAGE_UID" unique-key="nameAndLanguage" />
    </many-to-one>
    <many-to-one column="ACTION_UID" cascade="none" 
foreign-key="FK_TEXTMODULE_ACTION" not-null="false" name="action" 
unique="false" update="true" insert="true" optimistic-lock="true" 
not-found="exception" embed-xml="true" />
    <many-to-one column="TEXTMODULE_PARENT_UID" cascade="none" 
foreign-key="FK_TEXTMODULE_TEXTMODULE" not-null="false" name="parent" 
unique="false" update="true" insert="true" optimistic-lock="true" 
not-found="exception" embed-xml="true" />
    <property name="allowUpdateOnVersionChange" unique="false" 
optimistic-lock="true" lazy="false" generated="never" />
    <set inverse="true" lazy="true" name="childs" sort="unsorted" 
mutable="true" optimistic-lock="true" embed-xml="true">
      <key column="TEXTMODULE_PARENT_UID" on-delete="noaction" />
      <one-to-many class="at.workflow.webdesk.po.model.PoTextModule" 
not-found="exception" embed-xml="true" />
    </set>
    <many-to-one column="MODULE_UID" cascade="none" 
foreign-key="FK_TEXTMODULE_MODULE" not-null="false" name="module" 
unique="false" update="true" insert="true" optimistic-lock="true" 
not-found="exception" embed-xml="true" />
  </class>
</hibernate-mapping>

The transaction is managed via spring.

Thanks in advance,

Harald





More information about the hibernate-announce mailing list