Вопрос по Hibernate
Появился вопрос по Hibernate:
Таблица:
create table tags (
id integer,
objectid integer,
objecttype integer,
tag varchar(200)
)
Ключи созданы по следующим полям:
ID - primary key
objectid+objecttype
objectid+objecttype+tag
map file
<hibernate-mapping>
<class name="logic.tags.Tag" table="tags" lazy="true">
<id name="ID" column="ID" type="long">
<generator class="sequence">
<param name="sequence">tags_seq</param>
</generator>
</id>
<property name="objectID" column="ObjectID"/>
<property name="objectType" column="ObjectType"/>
<property name="tagName" column="Tag"/>
</class>
</hibernate-mapping>
class файл
public class Tag {
private String tagName;
private Long objectID;
private Long objectType;
private Long ID;
public Long getID() {
return ID;
}
private void setID(Long ID) {
this.ID = ID;
}
/**
* Конструктор тега
* @param tagName тег
* @param objectID идентификатор объекта к которому тег привязан
* @param objectType тип объекта
*/
public Tag(String tagName, Long objectID, Long objectType) {
this.tagName = tagName;
this.objectID = objectID;
this.objectType = objectType;
}
/**
* Конструктор тега
* @param ID ID
* @param tagName тег
* @param objectID идентификатор объекта к которому тег привязан
* @param objectType тип объекта
*/
public Tag(Long ID,String tagName, Long objectID, Long objectType) {
this.tagName = tagName;
this.objectID = objectID;
this.objectType = objectType;
this.ID = ID;
}
public Tag(){
}
public void setTagName(String tagName) {
this.tagName = tagName;
}
public void setObjectID(Long objectID) {
this.objectID = objectID;
}
public void setObjectType(Long objectType) {
this.objectType = objectType;
}
public String getTagName() {
return tagName;
}
public Long getObjectID() {
return objectID;
}
public Long getObjectType() {
return objectType;
}
}
в таблицу загружаю данные следующим образом:
int objectCount = 100;
int tagCount = 10;
con.createStatement().executeUpdate("del ete from tags");
Statement stat = con.createStatement();
for (int i=0;i<objectCount;i++){
for (int j=0;j<tagCount;j++){
String tag = //здесь генерирую случайную строку;
stat.executeUpdate("insert into tags(ID,ObjectID,ObjectType,Tag) values("+tagCount*i+j+","+i+",1,'"+tag+" ')");
}
}
Код загрузки Hibernate данных
HashMap<Integer,List> data = new HashMap<Integer, List>();
long startHibernate = System.currentTimeMillis();
for (int i=0;i<objectCount;i++){
String query = "from Tag " +
"where objectID = :objectID and objectType=:objectType";
Query query1 = session.createQuery(query);
query1.setLong("objectID",(long)i);
query1.setLong("objectType",(long)1);
List list = query1.list();
data.put(i,list);
}
long stopHibernate = System.currentTimeMillis();
System.out.println(new Date()+"Time Count:"+(stopHibernate-startHibernate));
Измеряю результат для загрузки напрямую через JDBC... результат немного удручающий: для 1`000`000 тегов при 10 тегах на объект я не дождался загрузки через Hibernate. JDBC загружалось чуть больше минуты.
Теперь вопрос:
Адекватные ли данные я получил? Можно ли как-нибудь оптимизировать производительность, и вообще предназначен ли Hibernate для загрузки такого объема данных?
create table tags (
id integer,
objectid integer,
objecttype integer,
tag varchar(200)
)
Ключи созданы по следующим полям:
ID - primary key
objectid+objecttype
objectid+objecttype+tag
map file
<hibernate-mapping>
<class name="logic.tags.Tag" table="tags" lazy="true">
<id name="ID" column="ID" type="long">
<generator class="sequence">
<param name="sequence">tags_seq</param>
</generator>
</id>
<property name="objectID" column="ObjectID"/>
<property name="objectType" column="ObjectType"/>
<property name="tagName" column="Tag"/>
</class>
</hibernate-mapping>
class файл
public class Tag {
private String tagName;
private Long objectID;
private Long objectType;
private Long ID;
public Long getID() {
return ID;
}
private void setID(Long ID) {
this.ID = ID;
}
/**
* Конструктор тега
* @param tagName тег
* @param objectID идентификатор объекта к которому тег привязан
* @param objectType тип объекта
*/
public Tag(String tagName, Long objectID, Long objectType) {
this.tagName = tagName;
this.objectID = objectID;
this.objectType = objectType;
}
/**
* Конструктор тега
* @param ID ID
* @param tagName тег
* @param objectID идентификатор объекта к которому тег привязан
* @param objectType тип объекта
*/
public Tag(Long ID,String tagName, Long objectID, Long objectType) {
this.tagName = tagName;
this.objectID = objectID;
this.objectType = objectType;
this.ID = ID;
}
public Tag(){
}
public void setTagName(String tagName) {
this.tagName = tagName;
}
public void setObjectID(Long objectID) {
this.objectID = objectID;
}
public void setObjectType(Long objectType) {
this.objectType = objectType;
}
public String getTagName() {
return tagName;
}
public Long getObjectID() {
return objectID;
}
public Long getObjectType() {
return objectType;
}
}
в таблицу загружаю данные следующим образом:
int objectCount = 100;
int tagCount = 10;
con.createStatement().executeUpdate("del
Statement stat = con.createStatement();
for (int i=0;i<objectCount;i++){
for (int j=0;j<tagCount;j++){
String tag = //здесь генерирую случайную строку;
stat.executeUpdate("insert into tags(ID,ObjectID,ObjectType,Tag) values("+tagCount*i+j+","+i+",1,'"+tag+"
}
}
Код загрузки Hibernate данных
HashMap<Integer,List> data = new HashMap<Integer, List>();
long startHibernate = System.currentTimeMillis();
for (int i=0;i<objectCount;i++){
String query = "from Tag " +
"where objectID = :objectID and objectType=:objectType";
Query query1 = session.createQuery(query);
query1.setLong("objectID",(long)i);
query1.setLong("objectType",(long)1);
List list = query1.list();
data.put(i,list);
}
long stopHibernate = System.currentTimeMillis();
System.out.println(new Date()+"Time Count:"+(stopHibernate-startHibernate));
Измеряю результат для загрузки напрямую через JDBC... результат немного удручающий: для 1`000`000 тегов при 10 тегах на объект я не дождался загрузки через Hibernate. JDBC загружалось чуть больше минуты.
Теперь вопрос:
Адекватные ли данные я получил? Можно ли как-нибудь оптимизировать производительность, и вообще предназначен ли Hibernate для загрузки такого объема данных?
