论坛首页 入门讨论版 Spring

spring配置导致内存问题,网上有人问的感觉和我的问题一样,但没解决方案

浏览 2671 次
该帖已经被评为新手帖
作者 正文
最后更新时间:2007-07-12
现象很简单,如果spring里面sessionFactory配置的hbm.xml一多,系统不断的点保存,监控weblogic内存曲线,上的非常快,好像有好多东西放在内存里了,点一会就报OutOfMemory,但如果把sessionFactory配置的hbm.xml删掉一部分,比如就留下我要测试的那个hbm.xml文件,再测weblogic内存曲线,没次上升的非常少,而且怎么点击也不会出现OutOfMemory,代码我也上传了,我觉的spring不应该有这个问题,大家都在用,大家看看我哪里用的不对,才引起的,我真的是找了很久也没发现问题
  • code.rar (9.7 KB)
  • 描述:
  • 下载次数: 32
   
最后更新时间:2007-07-12
在web.xml中加上这个监听器看看,放在所有监听器前面
<listener>
   <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>

援引 http://calvin.redsaga.com/viewthread.php?tid=391
   
0 请登录后投票
最后更新时间:2007-07-12
1-尝试增加JVM内存容量
2-如果可能,尽量使用lazy方式,Spring和Hibernate都一样
3-减小Hibernate的级联深度
   
0 请登录后投票
最后更新时间:2007-07-12
org.springframework.web.util.IntrospectorCleanupListener这个也加过,没有用,weblogic内存设置2G了,正常使用肯定够用,lazy方式怎么设置,我也试着把sessionFactory的lazy属性设置为true,都没用,只有删除sessionFactory配置的hbm.xm有变化,搞不懂为什么,难道我只有用到sessionFactory的地方,都会把这些hbm.xm又加载一遍?怎么让他只加载一次。
   
0 请登录后投票
最后更新时间:2007-07-12
spring显然不会用到sessionFactory的地方,都会把这些hbm.xm又加载一遍,检查下你的code,或者用些工具分析下内存状况
   
0 请登录后投票
最后更新时间:2007-07-12
代码上传了,还能请大家看看哪不对,我真的搞了几天了,试了很多方法都没解决,因为对spring理解的还不是太透澈,请大家帮着看看,说明一下我用的是spring1.2+hibernate3.2,或是大家如果项目中用spring没什么问题,还能给配置文件什么的发给我看看到底有什么不同,因为我就是用的spring的hibernate的模版啊,只是自己又封装了一个工具类,业务dao都来用它,而不是所有的dao都继承HibernateDaoSupport,因为有的业务代码里又要用到jdbc模版的方法,又要用到hibernate模版的方法,我想大家也有这样实现的吧,我邮箱:cagecl@126.com
   
0 请登录后投票
最后更新时间:2007-07-12
代码看了n边,觉得很奇怪,找不到问题。但是我用spring都是在service中配置txManager的和txAttribute的,很多项目都没有问题,用的是spring1.2+hibernate2.0。个人建议使用spring2.0+hibernate3.2试验下
   
0 请登录后投票
最后更新时间:2007-07-13
txManager的和txAttribute??看看
   
0 请登录后投票
最后更新时间:2007-07-13
XmlBeanFactory bf = SpringContext.getXmlBeanFactory();

的实现能不能贴出来看一下?
   
0 请登录后投票
最后更新时间:2007-07-13
哈哈,问题解决了,就是出在XmlBeanFactory bf = SpringContext.getXmlBeanFactory();上,原来实现是写:
public static XmlBeanFactory getXmlBeanFactory() {
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource(
"applicationContext.xml"));
return factory;
}

public static Object getBean(String beanID) {
BeanFactory factory = new XmlBeanFactory(new ClassPathResource(
"applicationContext.xml"));
return factory.getBean(beanID);

}
这样好像是每次调用就会把applicationContext.xml又读一遍,现在改成单例模式的了,另外写了一个类,专门在action层调用:
public class ApplicationContextManager {

private static ApplicationContextManager applicationcontext = null;
private static ApplicationContext actx = null;
/**
* 通过单立得到一个ApplicationContextManager实例
* @return
*/
public static ApplicationContextManager getApplicationContextManager(){
if(applicationcontext==null){
applicationcontext = new ApplicationContextManager();
}
return applicationcontext;
}
/**
* 通过传入HttpServlet对象得到ApplicationContext对象
* @param servlet
* @return
*/
public  ApplicationContext getApplicationContext(HttpServlet servlet){
try{
if(actx==null){
actx =
WebApplicationContextUtils.getRequiredWebApplicationContext(servlet.getServletContext());
}
}catch(Exception ex){
ex.printStackTrace();
}


return actx;
}

在action层调用时:ApplicationContext ctx =
ApplicationContextManager.getApplicationContextManager().getApplicationContext(servlet);
Object obj = (Object) ctx.getBean(beanId);
这样就不会每次又取一遍了,如果已经读取过,就不再读了
   
0 请登录后投票
论坛首页 入门讨论版 Spring

跳转论坛:
JavaEye推荐