2011-06-09 58 views
3

我有三个实体,其中我尝试只保存1个实体。所有三个实体如下: -对象需要时间才能保持休眠

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> 

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

现在我需要缩短这段时间,因为我们将从1万条缩短到100万条记录,并且按照计算它需要很长时间..我需要缩短时间,我该怎么做?

根据需要,也是模式是如下: -

表学生:

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) 

请帮

+0

您是否使用hibernate工具生成数据库模式? – 2011-06-09 05:28:22

+0

我用hbm2ddl属性一次生成模式,之后我以更新模式运行代码。 – 2011-06-09 05:30:17

+1

请显示用于将实体插入数据库的代码 – bbaja42 2011-06-09 05:43:55

回答

4

考虑batch inserts。此外,如果此批次插入仅用于一次,即作为迁移过程的一部分,则IMO可以考虑删除表上的所有主键 - 以及任何其他索引,然后插入记录。之后,重新创建所有这些。希望你会注意到一个重大的改进。

+0

会批量插入真正打击性能下降吗?并与关键,这是正确的方式,就好像在处理之间我们正在放弃约束,就像我们正在执行一些补丁..我觉得这不是一个好习惯.. – 2011-06-09 06:11:24

+0

@MJ:我以为你是在做一些迁移。如果它将成为通常的情况和功能需求,那就把它忘掉。不要放弃限制。我更新了我的答案以澄清这一点。但的确,你必须考虑批量插入。 – 2011-06-09 06:22:10

+0

批处理插入将几乎可以肯定地改善您在这样的大插入过程中的性能。 – 2011-06-09 18:16:50

1

我认为你正在尝试导入学生实体与科和SportsTeam。此时,如果您将输入数据中的值设置为实体的元素并调用Save实体,则会导致在数据库中创建Student,Section和SportsTeam记录。这意味着如果您节省10000个学生实体,那么您将有效地创建10000个SportsTeam记录和10000个记录。

相反,我建议你遵循以下步骤: 1.阅读从输入数据 2.查询数据库(通过HQL)线为已退出SportsTeam和第 3.如果没有发现SportsTeam记录和部分然后创建它们 3.创建一个新的学生记录并从步骤2设置SportsTeam和部分。 4.保存学生记录。

此外,我建议你在一次交易中优化创建并保存学生对象的批量说1000。在批处理和释放对象之后关闭休眠事务将有助于提高DB/Network和内存的利用率。

1

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