如何在Tomcat中加载一个重量级的类

xharry 2007-11-28 06:32:09
我问的问题可能很简单,我用tomcat不多,对类似的容器不熟悉

我想在我的项目中,使用Hibernate,大家知道,SessionFactory的建立很耗费时间,我想让这个类只做一次初始化动作,
该怎么做,我要在哪里写这个初始化代码,以及在哪里去调用这个Singleton类呢?

我是个新手

Thanks
...全文
112 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xharry 2007-12-03
  • 打赏
  • 举报
回复
up
xharry 2007-12-03
  • 打赏
  • 举报
回复
也就是说:

SessionFactory sf = getServletContext().getAttribute("sfName");

我只能在jsp中用,我测试过了,正常


但是要在自己写的另一个java文件中用,就不可以了

xharry 2007-12-03
  • 打赏
  • 举报
回复
package com.foo;

import java.util.*;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class BizB{
public ArrayList test() {
ArrayList l = new ArrayList();


SessionFactory sessionFactory = (SessionFactory) getServletContext()
.getAttribute("hb");
Session s = sessionFactory.openSession();
Transaction tx = s.beginTransaction();
try {

Query q = s.createQuery("from com.foo.User");
//out.println("size=" + q.list().size());
l.addAll(q.list());
tx.commit();
} catch (HibernateException e) {
e.printStackTrace();
tx.rollback();
} finally {
s.close();
}

return l;
}
}

我按照楼上的做了,可是在我自己的写的类中,如果 这样写,就会报错 :getServletContext 找不到

请问我该怎么写,extends HttpServerlet?
天外流星 2007-12-03
  • 打赏
  • 举报
回复
SessionFactory如果有异常,就不能启动Tomcat了,SessionFactory以静态方式载入容器的.Tomcat启动的时候初始化一次.
xharry 2007-11-29
  • 打赏
  • 举报
回复
谢谢楼上,我测试了,可以

那我又个疑问,对于SessionFactory这类的东西,如果发生了异常,那不就挂了嘛,就得重启tomcat

它只是tomcat启动的时候才初始化一次

是这样么?


sharpyuce 2007-11-28
  • 打赏
  • 举报
回复

在服务器启动时,就创建一个ServerContext
写一个实现ServletContextListener的类并且在web.xml部署下就OK了

package mypack;
import ....; //导入的自己写哈

public class MyServletContextListener implements ServletContextListener{
void contextDestroyed(ServletContextEvent sce){
ServletContext context = sce.getServletContext();
Configuration cfg = new Configuration().configure();
SessionFactory sf = config.buildSessionFactory();
context.setAttribute("sfName",sf);

}
void contextInitialized(ServletContextEvent sce){


}
}

在web.xml中在<servlet>标签开始之前加入如下标签:
<listener>
<listener-class>mypack.MyServletContextListener</listener-class>
</listener>
要别的地方 用的时候直接 SessionFactory sf = getServletContext.getAttribute("sfName");
bocohaijiao 2007-11-28
  • 打赏
  • 举报
回复
xiyuan1999 2007-11-28
  • 打赏
  • 举报
回复
没有关系

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧