|
该帖已经被评为新手帖
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2007-07-12
现象很简单,如果spring里面sessionFactory配置的hbm.xml一多,系统不断的点保存,监控weblogic内存曲线,上的非常快,好像有好多东西放在内存里了,点一会就报OutOfMemory,但如果把sessionFactory配置的hbm.xml删掉一部分,比如就留下我要测试的那个hbm.xml文件,再测weblogic内存曲线,没次上升的非常少,而且怎么点击也不会出现OutOfMemory,代码我也上传了,我觉的spring不应该有这个问题,大家都在用,大家看看我哪里用的不对,才引起的,我真的是找了很久也没发现问题
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-07-12
在web.xml中加上这个监听器看看,放在所有监听器前面
<listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> 援引 http://calvin.redsaga.com/viewthread.php?tid=391 |
|
| 返回顶楼 | |
|
最后更新时间:2007-07-12
1-尝试增加JVM内存容量
2-如果可能,尽量使用lazy方式,Spring和Hibernate都一样 3-减小Hibernate的级联深度 |
|
| 返回顶楼 | |
|
最后更新时间:2007-07-12
org.springframework.web.util.IntrospectorCleanupListener这个也加过,没有用,weblogic内存设置2G了,正常使用肯定够用,lazy方式怎么设置,我也试着把sessionFactory的lazy属性设置为true,都没用,只有删除sessionFactory配置的hbm.xm有变化,搞不懂为什么,难道我只有用到sessionFactory的地方,都会把这些hbm.xm又加载一遍?怎么让他只加载一次。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-07-12
spring显然不会用到sessionFactory的地方,都会把这些hbm.xm又加载一遍,检查下你的code,或者用些工具分析下内存状况
|
|
| 返回顶楼 | |
|
最后更新时间:2007-07-12
代码上传了,还能请大家看看哪不对,我真的搞了几天了,试了很多方法都没解决,因为对spring理解的还不是太透澈,请大家帮着看看,说明一下我用的是spring1.2+hibernate3.2,或是大家如果项目中用spring没什么问题,还能给配置文件什么的发给我看看到底有什么不同,因为我就是用的spring的hibernate的模版啊,只是自己又封装了一个工具类,业务dao都来用它,而不是所有的dao都继承HibernateDaoSupport,因为有的业务代码里又要用到jdbc模版的方法,又要用到hibernate模版的方法,我想大家也有这样实现的吧,我邮箱:cagecl@126.com
|
|
| 返回顶楼 | |
|
最后更新时间:2007-07-12
代码看了n边,觉得很奇怪,找不到问题。但是我用spring都是在service中配置txManager的和txAttribute的,很多项目都没有问题,用的是spring1.2+hibernate2.0。个人建议使用spring2.0+hibernate3.2试验下
|
|
| 返回顶楼 | |
|
最后更新时间:2007-07-13
txManager的和txAttribute??看看
|
|
| 返回顶楼 | |
|
最后更新时间:2007-07-13
XmlBeanFactory bf = SpringContext.getXmlBeanFactory();
的实现能不能贴出来看一下? |
|
| 返回顶楼 | |
|
最后更新时间: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); 这样就不会每次又取一遍了,如果已经读取过,就不再读了 |
|
| 返回顶楼 | |






