hibernate 中的会话和会话工厂
Session and session factory in hibernate
我正在使用 Java、Hibernate 和 SQL 服务器创建一个应用程序。我对会话和会话工厂的对象声明有疑问。
起初,当我开始创建应用程序时,我总是在需要时创建会话和会话工厂。但是现在我注意到当我如上所述创建会话和会话工厂时我的应用程序变慢了所以我开始在我的登录页面创建所有需要的会话和会话工厂并将修饰符指定为 public static.
public static Session session = null;
public static SessionFactory sessionfactory = new org.hibernate.cfg.Configuration().configure().buildSessionFactory();
public static Session session1 = null;
public static SessionFactory sessionfactory1 = new org.hibernate.cfg.Configuration().configure().buildSessionFactory();
public static Session session2 = null;
public static SessionFactory sessionfactory2 = new org.hibernate.cfg.Configuration().configure().buildSessionFactory();
现在,每当我需要使用会话和会话工厂时,我都会将会话称为 Login.session (loginpagefilename.sessionobject)。
Login.session = Login.sessionfactory.openSession();
Login.session.beginTransaction();
String hql = "FROM TEST_SERVICES_POJO lts WHERE NOT EXISTS (SELECT lsm.inttestid FROM PARAMETER_MAPPING_POJO lsm WHERE lsm.status = 1 and lsm.inttestid=lts.inttestid)";
org.hibernate.Query query = Login.session.createQuery(hql);
DefaultTableModel model = (DefaultTableModel) testtable.getModel();
model.setRowCount(0);
for (Iterator it = query.iterate(); it.hasNext();) {
TEST_SERVICES_POJO slp = (TEST_SERVICES_POJO) it.next();
Object[] row = {slp.getTestname()};
model.addRow(row);
}
Login.session.getTransaction().commit();
这里一开始我没有使用hibernate的回滚功能。但是现在我想实现hibernate的回滚功能。所以遵循哪种方法会给我更好的性能。请给我一个方法。提前致谢。
最重要的是:永远不要为每个应用程序创建一个以上 SessionFactory
(除非您有多个持久性上下文,然后为每个应用程序和持久性上下文创建一个)。继续创建 SessionFactories
将首先破坏您的性能,然后由于 OutOfMemoryError
s 而破坏您的应用程序服务器。在应用程序启动时创建一个 SessionFactory
并将其保存在可访问的位置 - 将其存储在 jndi 中,将其保存在全局 class 或类似的东西中。
根据需要创建 Session
s - 最佳匹配通常是每个事务一个 Session
,因此 hibernate 可以利用其缓存机制。
我正在使用 Java、Hibernate 和 SQL 服务器创建一个应用程序。我对会话和会话工厂的对象声明有疑问。 起初,当我开始创建应用程序时,我总是在需要时创建会话和会话工厂。但是现在我注意到当我如上所述创建会话和会话工厂时我的应用程序变慢了所以我开始在我的登录页面创建所有需要的会话和会话工厂并将修饰符指定为 public static.
public static Session session = null;
public static SessionFactory sessionfactory = new org.hibernate.cfg.Configuration().configure().buildSessionFactory();
public static Session session1 = null;
public static SessionFactory sessionfactory1 = new org.hibernate.cfg.Configuration().configure().buildSessionFactory();
public static Session session2 = null;
public static SessionFactory sessionfactory2 = new org.hibernate.cfg.Configuration().configure().buildSessionFactory();
现在,每当我需要使用会话和会话工厂时,我都会将会话称为 Login.session (loginpagefilename.sessionobject)。
Login.session = Login.sessionfactory.openSession();
Login.session.beginTransaction();
String hql = "FROM TEST_SERVICES_POJO lts WHERE NOT EXISTS (SELECT lsm.inttestid FROM PARAMETER_MAPPING_POJO lsm WHERE lsm.status = 1 and lsm.inttestid=lts.inttestid)";
org.hibernate.Query query = Login.session.createQuery(hql);
DefaultTableModel model = (DefaultTableModel) testtable.getModel();
model.setRowCount(0);
for (Iterator it = query.iterate(); it.hasNext();) {
TEST_SERVICES_POJO slp = (TEST_SERVICES_POJO) it.next();
Object[] row = {slp.getTestname()};
model.addRow(row);
}
Login.session.getTransaction().commit();
这里一开始我没有使用hibernate的回滚功能。但是现在我想实现hibernate的回滚功能。所以遵循哪种方法会给我更好的性能。请给我一个方法。提前致谢。
最重要的是:永远不要为每个应用程序创建一个以上 SessionFactory
(除非您有多个持久性上下文,然后为每个应用程序和持久性上下文创建一个)。继续创建 SessionFactories
将首先破坏您的性能,然后由于 OutOfMemoryError
s 而破坏您的应用程序服务器。在应用程序启动时创建一个 SessionFactory
并将其保存在可访问的位置 - 将其存储在 jndi 中,将其保存在全局 class 或类似的东西中。
根据需要创建 Session
s - 最佳匹配通常是每个事务一个 Session
,因此 hibernate 可以利用其缓存机制。