我正在记录10000条记录的保存时间,我不知道为什么它需要40分钟才能保存10000条记录。我有一个类,其中所有基本会话工厂工作完成然后我扩展(继承到[DAO(nameofentity)]类名称并请求getsession然后保存功能。为什么它需要花费这么多时间?我有log4j初始化程序,它像一个大显示器向下滚动。
以下是在hibernate中获取会话的基类代码。
package DAO;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class BaseDAO {
private static final ThreadLocal<Session> session= new ThreadLocal<Session>();
private static final SessionFactory sessionFactory = new Configuration()
.configure().buildSessionFactory();
public Session getSession() {
Session session = (Session) BaseDAO.session.get();
if (session == null) {
session = sessionFactory.openSession();
BaseDAO.session.set(session);
}
return session;
}
protected void begin() {
getSession().beginTransaction();
}
protected void commit() {
getSession().getTransaction().commit();
}
protected void rollback() {
try {
getSession().getTransaction().rollback();
} catch (HibernateException e) {
System.out.println(e.getMessage());
}
try {
getSession().close();
} catch (HibernateException e) {
System.out.println(e.getMessage());
}
BaseDAO.session.set(null);
}
public void close() {
getSession().close();
BaseDAO.session.set(null);
}
}
然后是扩展它的类
package DAO;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import pojo.Address;
import pojo.Clinic;
import pojo.Patient;
public class PatientDAO extends BaseDAO {
public PatientDAO(){
}
It takes more 4 seconds to add just 100 elements so roughly bout 8 mins to
add 10K elements. Is there some thing erong with my code. i.e the
SAVE() method Below.And ya i tried removing the additional update that i am doing
it did not make much difference.
I have beeen asked to bring the time for 10K to <1 min..!! :( please help
public void create(Patient p) throws ApplicationException {
try {
begin();
getSession().save(p);
Query query = getSession().createQuery
("update Address patientid=? where id=?");
query.setParameter(0,p.getId());
query.setParameter(1, p.getAddress().getId());
query.executeUpdate();
commit();
} catch (HibernateException e) {
rollback();
throw new ApplicationException(e.getCause().getMessage());
}
}
Hibernate cfg。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">self</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306 /rajtest1</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.default_schema">rajtest1</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.pool_size">10</property>
<!-- property name="current_session_context_class">thread</property-->
<!--property
name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property-->
<property name="show_sql">false</property>
<property name="hbm2ddl.auto" >update</property>
<mapping resource ="Clinic.hbm.xml"/>
<mapping resource="Doctor.hbm.xml"/>
<mapping resource="Patient.hbm.xml"/>
<mapping resource="Address.hbm.xml"/>
</session-factory>
</hibernate-configuration>
答案 0 :(得分:1)
首先:
您为每个插入执行提交。这是低效的。对许多插入进行一次提交绝对更有效。
第二
为什么在创建患者后对地址进行更新?可能你刚刚创建了地址。将地址定义为患者对象的成员(例如,具有多对一或一对一关系)并将两者一起插入一次保存(使用级联)或在之后插入地址更有效病人。在这种情况下,hibernate管理在地址中设置patientid。
第三
使用
跟踪SQL语句<property name="show_sql">true</property>
在hibernate配置文件中查看是否存在多余的SQL语句,
第四:
直接在SQL命令行中尝试插入。也许您的数据库速度不快。
答案 1 :(得分:-1)
如果您要保存10000条记录,则不应该一次执行一条记录。创建一个proc来执行基于集合的插入或更新,而不是使用n_Hibernate。