对象花时间在hibernate中持久化

时间:2011-06-09 05:16:07

标签: java performance hibernate persistence

我有三个实体,我现在尝试只保存一个实体。所有这三个实体如下所示: -

1。学生实体

     <class name="com.school.Student" table="TABLE_STUDENT">
        <id name="id" type="long">
            <column name="ST_ID" />
            <generator class="native" />
        </id>
        <property name="name" type="string" column="ST_NAME"/>
        <many-to-one name="studentSection" class="com.school.Section" fetch="select">
            <column name="SECTION_ID" not-null="true" />
        </many-to-one> 
        <many-to-one name="studentSportsTeam" class="com.school.SportsTeam" fetch="select">
            <column name="SPORTS_TEAM" not-null="true" />
        </many-to-one>
     </class>

2。部分实体

     <class name="com.school.Section" table="TABLE_SECTION">
         <id name="sectionId" type="string">
            <column name="SECTION_ID" />
            <generator class="assigned" />
        </id>
        <property name="floor" type="string" column="SEC_FLOOR"/>
        <property name="capcacity" type="int" column="SEC_CAPACITY"/>
        <set name="studentDetails" inverse="true" lazy="true" table="TABLE_STUDENT" fetch="select">
            <key>
                <column name="SECTION_ID" not-null="true" />
            </key>
            <one-to-many class="com.school.Student" />
        </set>
     </class>

第3。 SprotsTeam实体: -

    <class name="com.school.SportsTeam" table="TABLE_SPORTS">
         <id name="sportsTeamId" type="string">
            <column name="SPORTS_TEAM" />
            <generator class="assigned" />
        </id>
        <property name="noOfPlayers" type="int" column="SPORTS_PLAYER_NUM"/>
        <property name="captainName" type="string" column="SPORTS_CAPTAIN_NAME"/>
        <set name="playerDetails" inverse="true" lazy="true" table="TABLE_STUDENT" fetch="select">
            <key>
                <column name="SPORTS_TEAM" not-null="true" />
            </key>
            <one-to-many class="com.school.Student" />
        </set>
     </class>

现在,如果我尝试使用正确的StudentSection详细信息保存SportsTeam实体,则需要花费大量时间将其保留到数据库中。目前我正在为大约10000名学生运行它,这个过程(仅持续)大约需要15分钟。我添加了一些记录器来计算完整的时间。

现在我需要减少这个时间,因为我们将从10,000个记录缩短到100万个记录,并且计算它需要很长时间..我需要减少时间,我该怎么做?

根据需要,架构如下: -

TABLE STUDENT:

ST_ID               NUMBER,
ST_NAME             VARCHAR(40),
SECTION_ID          VARCHAR(10),
SPORTS_TEAM         VARCHAR(10)

TABLE_SECTION:

SECTION_ID          VARCHAR(10),
SEC_FLOOR           VARCHAR(2),
SEC_CAPACITY        NUMBER

TABLE_SPORTS:

SPORTS_TEAM                  VARCHAR(10),
SPORTS_PLAYER_NUM            NUMBER,
SPORTS_CAPTAIN_NAME          VARCHAR(40)

请帮忙

3 个答案:

答案 0 :(得分:4)

考虑batch inserts

此外,如果此批量插入只是一次,即作为迁移过程的一部分,那么IMO,您可以考虑删除表上的所有主键 - 以及任何其他索引,然后插入记录。之后重新创建所有这些。希望你会注意到一个显着的进步。

答案 1 :(得分:1)

我认为您正在尝试使用Section和SportsTeam导入学生实体。此时,如果您将输入数据中的值设置为实体的元素并在Student实体上调用save,那么将导致在数据库中创建Student,Section和SportsTeam记录。这意味着如果您保存10000个学生实体,那么您将有效地创建10000个SportsTeam记录和10000个分段记录。

相反,我建议您按照以下步骤操作: 1.从输入数据中读取一行 2.查询已经退出的SportsTeam和Section的db(通过hql) 3.如果没有为SportsTeam和Section找到记录,则创建它们 3.创建新的学生记录,并从步骤2设置SportsTeam和Section。 4.保存学生记录。

另外,我建议您在单个事务中优化创建和保存一批1000个学生对象。在批处理和释放对象之后关闭hibernate事务将有助于提高DB / Network和内存的利用率。

答案 2 :(得分:1)

我会指定字符串属性的长度;否则它们可能被实现为clobs