J2EE程序运行一段时间后,就不动了.那是怎么回事??而且有点越来越慢的感觉.

guoqiangone 2008-01-22 02:03:15
我用的是Struts+spring+hibernate架构.
当程序启动时速度还可以,可是运行一段时间后,程序根本就不走.
如果把tomcat重新启动,程序又可以运行,可是运行一段时间后,程序又不走了.这是怎么回事啊

环境是这样的struts 1.2,spring 1.3 hibernate3.1的
eclipse 3.2,myEclipse 5.0的tomcat5.0,jdk1.5

把代码贴出来大家帮我看看
UserInfoDAO.java如下

package com.shop.front.dao;

import java.util.Date;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.Transaction;
import org.springframework.context.ApplicationContext;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.shop.front.coll.IUserInfoDAO;
import com.shop.front.vo.UserInfo;

/**
* Data access object (DAO) for domain model class UserInfo.
* @see com.shop.front.vo.UserInfo
* @author MyEclipse - Hibernate Tools
*/
public class UserInfoDAO extends HibernateDaoSupport implements IUserInfoDAO {

private static final Log log = LogFactory.getLog(UserInfoDAO.class);

//property constants
public static final String USER_ACCOUNT = "userAccount";
public static final String USER_NUMBER = "userNumber";
public static final String USER_NAME = "userName";
public static final String USER_PWD = "userPwd";
public static final String USER_SEX = "userSex";
public static final String USER_PHONE = "userPhone";
public static final String USER_MOBILE = "userMobile";
public static final String EMAIL = "email";
public static final String ADDERSS = "adderss";
public static final String POST_CODE = "postCode";
public static final String COMMEND_MAN = "commendMan";
public static final String INTEGRAL = "integral";
public static final String PWD_MATTER = "pwdMatter";
public static final String PWD_RESULT = "pwdResult";
public static final String STATE_ID = "stateId";
public static final String REMARK = "remark";

private String hql=null;
private Query query=null;
private List list=null;

protected void initDao() {
//do nothing
}

/**
* 根据传入的用户名和密码来判断
* 此用户是存在。如果存在返回一个用户实例,
* 如果不存在返回null
*/
public Object login(String useraccount ,String userpwd){
hql="From UserInfo where userAccount=? and userPwd=? and stateId=1";
query=this.getSession().createQuery(hql);
query.setString(0, useraccount);
query.setString(1, userpwd);
list=query.list();
if(list.size()>0){
return list.get(0);
}
this.getSession().close();
return null;
}


/**
* 用户注册
*
*/
public boolean register(UserInfo userinfo){
try{
this.getSession().save(userinfo);
this.getSession().close();
}catch(Exception ex){
ex.printStackTrace();
System.out.println("注册UserInfoDAO出错");
this.getSession().close();
return false;
}
return true;
}

/**
* 查找用户名是否存在
* @author account 用户名,true表示可用,false不可用
*/
public boolean searchUserAcount(String account){
hql="From UserInfo where userAccount=?";
query=this.getSession().createQuery(hql);
query.setString(0, account);
list=query.list();
if(list.size()<1){
return true;
}
this.getSession().close();
return false;
}


/** 修改密码
* @author 修改成功返回true,修改失败返回false
*
*/
public boolean change_password(UserInfo userinfo){
try{
hql="update UserInfo set userPwd=? where userId=?";
query=this.getSession().createQuery(hql);
query.setString(0,userinfo.getUserPwd());
query.setInteger(1, userinfo.getUserId());
int i=query.executeUpdate();
if(i==0){
return false;
}
this.getSession().close();
// this.getSession().update(userinfo);
}catch(Exception ex){
ex.printStackTrace();
System.out.println("Dao出错");
this.getSession().close();
return false;
}
return true;
}

/** 修改用户信息
* @author 修改成功返回true,修改失败返回false
*
*/
public boolean update_userInfo(UserInfo userinfo){
try{
// hql="update UserInfo set userSex=?,userPhone=?,userMobile=?,adderss=?,postCode=?,userName=? where userId=?";
// query=this.getSession().createQuery(hql);
// query.setByte(0, userinfo.getUserSex());
// query.setString(1,userinfo.getUserPhone());
// query.setString(2, userinfo.getUserMobile());
// query.setString(3,userinfo.getAdderss());
// query.setString(4, userinfo.getPostCode());
// query.setString(5, userinfo.getUserName());
// query.setInteger(6, userinfo.getUserId());
// int i=query.executeUpdate();
// if(i==0){
// return false;
// }
Transaction tran = this.getSession().beginTransaction() ;
this.getSession().update(userinfo);
tran.commit();
this.getSession().close();
}catch(Exception ex){
ex.printStackTrace();
System.out.println("Dao出错");
this.getSession().close();
return false;
}
return true;
}

}


只用到了上面那几个方法.这个类是hibernate生成的,当然我没有用到里面的方法,都是自己写的,原方法我都没有删除.
HibernateSessionFactory 这个类也是自动生成的,我什么都没有去更改.
...全文
310 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangtemplar 2010-04-15
  • 打赏
  • 举报
回复
帖子是08年的,但是看完此贴并没有解决我的问题。现在我自己解决了,所以和大家分享一下。

使用this.getSession().close();和楼主出现相同问题,而使用releaseSession(session);来释放session就正常了。
kingkang_kobe 2008-05-23
  • 打赏
  • 举报
回复
我的程序也遇到过相似的问题,请问怎么解决呢>
hongbowu 2008-04-17
  • 打赏
  • 举报
回复
我有同样的问题,请问解决了吗?
guoqiangone 2008-01-23
  • 打赏
  • 举报
回复
Session session = null;
session = this.getSession();

楼上的兄弟按你的这个做法还是不行啊

还跑一短时间后就不跑了,只有在对数据库的数据有操作就会有那种情况。
如果jsp页面没有对数据库数据进行操作的话的,页面还是有反应的
rayt_1982 2008-01-23
  • 打赏
  • 举报
回复
public Object login(String useraccount ,String userpwd){
String hql="From UserInfo where userAccount=? and userPwd=? and stateId=1";
Session session = null;
session = this.getSession();
Query query=session.createQuery(hql);
query.setString(0, useraccount);
query.setString(1, userpwd);
List list=query.list();
session.close();
if(list.size()>0){
return list.get(0);
}
return null;
}
this.getSession();可能会新创建一个session对象
guoqiangone 2008-01-23
  • 打赏
  • 举报
回复
上去 上去 上去 上去
guoqiangone 2008-01-23
  • 打赏
  • 举报
回复
这是我数据库连接用spring管理的,需要在那里关闭呢。怎么关闭啊
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</property>
<property name="url">
<value>jdbc:microsoft:sqlserver://localhost:1433</value>
</property>
<property name="username">
<value>sa</value>
</property>
</bean>

还有这个类 HibernateSessionFactory 是hibernate自动生成的,需要怎么关闭

          
package com.shop.factory;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;


public class HibernateSessionFactory {

private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private static Configuration configuration = new Configuration();
private static org.hibernate.SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION;

private HibernateSessionFactory() {
}


public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();

if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
threadLocal.set(session);
}

return session;
}


public static void rebuildSessionFactory() {
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
System.err
.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}


public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);

if (session != null) {
session.close();
}
}

/**
* return session factory
*
*/
public static org.hibernate.SessionFactory getSessionFactory() {
return sessionFactory;
}

/**
* return session factory
*
* session factory will be rebuilded in the next call
*/
public static void setConfigFile(String configFile) {
HibernateSessionFactory.configFile = configFile;
sessionFactory = null;
}

/**
* return hibernate configuration
*
*/
public static Configuration getConfiguration() {
return configuration;
}

}

Zero2One 2008-01-23
  • 打赏
  • 举报
回复
有地方数据库连接或session未关闭,造成内存溢出,看下你代码逻辑吧
lightao220 2008-01-23
  • 打赏
  • 举报
回复
多数是session没有关闭
写程序要养成良好的习惯在finnally{} 里关闭session
这段代码写的不咋地,出口太多,一个函数最好允许一个出口
public boolean change_password(UserInfo userinfo){

try{
hql="update UserInfo set userPwd=? where userId=?";
query=this.getSession().createQuery(hql);
query.setString(0,userinfo.getUserPwd());
query.setInteger(1, userinfo.getUserId());
int i=query.executeUpdate();
if(i==0){
return false;
}
this.getSession().close();
// this.getSession().update(userinfo);
}catch(Exception ex){
ex.printStackTrace();
System.out.println("Dao出错");
this.getSession().close();
return false;
}
return true;
}


改版
public boolean change_password(UserInfo userinfo){
boolean flag = false;
try{
hql="update UserInfo set userPwd=? where userId=?";
query=this.getSession().createQuery(hql);
query.setString(0,userinfo.getUserPwd());
query.setInteger(1, userinfo.getUserId());
int i=query.executeUpdate();
if(i>0)
flag = true;

}catch(Exception ex){
ex.printStackTrace();
System.out.println("Dao出错");
}finally{
this.getSession().close();
}
return flag ;
}


xuyingjun 2008-01-23
  • 打赏
  • 举报
回复
list=query.list();
方法改下,可以用iterato()
guoqiangone 2008-01-22
  • 打赏
  • 举报
回复
我这样修改还是不行啊,当对数据进行几轮操作时,就又跑不动了,
大家说说程序跑不动都有哪些原因造成的呢


public Object login(String useraccount ,String userpwd){
hql="From UserInfo where userAccount=? and userPwd=? and stateId=1";
query=this.getSession().createQuery(hql);
query.setString(0, useraccount);
query.setString(1, userpwd);
list=query.list();
this.getSession().close();
if(list.size()>0){
return list.get(0);
}
return null;
}
rayt_1982 2008-01-22
  • 打赏
  • 举报
回复
if(list.size()>0){
return list.get(0);
}
this.getSession().close();
return null;

list.size()>0时session没关,导致没有链接用了.还有几个方法类似.
先关闭session再return
jinxinzhang 2008-01-22
  • 打赏
  • 举报
回复
MyEclipse工作内存小!Eclipse工作内存改了没用啊,如果你用myEclipse的话
guoqiangone 2008-01-22
  • 打赏
  • 举报
回复
不是吧,我内存分配的比较大啊
mathsyang 2008-01-22
  • 打赏
  • 举报
回复
Eclipse内存分配小了?!

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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