我有三个实体,我现在尝试只保存一个实体。所有这三个实体如下所示: -
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>
现在,如果我尝试使用正确的Student
和Section
详细信息保存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)
请帮忙
答案 0 :(得分:4)
此外,如果此批量插入只是一次,即作为迁移过程的一部分,那么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