hibernate+Struts+JSP+MySQL+Tomcat(5.5.17)的一个项目中遇到一个很奇怪的关于Tomcat的问题,麻烦高手详阅内容和能给予帮助,谢谢!!
Struts中的用于用户登陆的代码:
public class UserBiz implements Serializable
{
public User login( String userName , String password )
{
Session session = HbnUtil.getSession() ;
Transaction tx = session.beginTransaction() ;
User user = null ;
Query query = session.createQuery( "from User as u where u.userName=:userName and u.password=:password " )
.setString( "userName " , userName )
.setString( "password " , password ) ;
List list = query.list() ;
if ( list.size() != 0 )
{
Iterator iterator = list.iterator() ;
while ( iterator.hasNext() )
{
user = ( User ) iterator.next() ;
}
}
HbnUtil.closeConnection();
return user ;
}
}
HbnUtil工具包中的代码:
public class HbnUtil
{
private static Configuration config ;
private static SessionFactory sf ;
public HbnUtil()
{
}
static
{
config = new Configuration().configure() ;
sf = config.buildSessionFactory() ;
}
public static Session getSession()
{
return sf.openSession() ;
}
public static void closeConnection()
{
sf.close() ;
}
}
Hibernate中的hibernate.cfg.xml文件内容:
<?xml version= "1.0 "?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN "
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd ">
<hibernate-configuration>
<session-factory>
<property name= "show_sql "> true </property>
<property name= "format_sql "> true </property>
<!--datasource configuration-->
<property name= "dialect "> org.hibernate.dialect.MySQLDialect </property>
<property name= "connection.driver_class "> com.mysql.jdbc.Driver </property>
<property name= "connection.username "> root </property>
<property name= "connection.password "> 123 </property>
<property name= "connection.url "> jdbc:mysql://localhost:3306/MyDB </property>
<!--connection pool configuration-->
<property name= "c3p0.max_size "> 3 </property>
<property name= "c3p0.min_size "> 1 </property>
<property name= "c3p0.timeout "> 5000 </property>
<property name= "c3p0.max_statements "> 100 </property>
<property name= "c3p0.idle_test_period "> 3000 </property>
<property name= "c3p0.acquire_increment "> 1 </property>
<property name= "c3p0.validate "> false </property>
<!--mapping configuration-->
<mapping resource= "rongzhong/entity/User.hbm.xml "/>
<mapping resource= "rongzhong/entity/Media.hbm.xml "/>
</session-factory>
</hibernate-configuration>
JSP中的error.jsp文件内容:
<%@ page contentType= "text/html; charset=gb2312 " %>
<%@taglib uri= "http://struts.apache.org/tags-bean " prefix= "bean " %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN ">
<html>
<head>
<title> 错误 </title>
</head>
<body>
<center>
<h2> </h2>
<h2 class= "STYLE2 "> 登陆错误,请重新输入用户名和密码! </h2>
<p> </p>
<a href= "${pageContext.request.contextPath}/tologin.do "> 重新登陆 </a>
</center>
</body>
</html>
JSP中的login.jsp文件内容:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN " "http://www.w3.org/TR/html4/loose.dtd ">
<%@taglib uri= "http://struts.apache.org/tags-bean " prefix= "bean " %>
<%@taglib uri= "http://struts.apache.org/tags-html " prefix= "html " %>
<%@page contentType= "text/html;charset=GB2312 " %>
<center>
<h2> 用户登录 </h2>
<html:form method= "post " action= "/login.do ">
用户名: <input type= "text " name= "userName "> <br>
密 码: <input type= "password " name= "password "> <br>
<input type= "submit " value= "登陆 " >
</html:form>
</center>
问题:
启动Tomcat服务器后,在login.jsp的显示页面中输入用户名和密码,如果输入错误,便跳转到error.jsp的显示页面中,点击“登陆”,页面就又跳转到login.jsp页面中,(请高手注意,这个过程是第一次过程),再重复一边这个过程后(高手注意,这样的过程已经是第二次了),在这两个过程中Tomcat服务器一切正常,连接数据库,执行相应的select语句。可是到了第三次,Tomcat服务器的运行状态就一直停在(页面显示的信息)“opening JDBC connection”这个状态了,不进行任何的动作,碰到这个情况,只能重启服务器。我不知道这是因为什么,后来发现上面提到的这样的过程的重复的最大次数和hibernate.cfg.xml文件中的 <property name= "c3p0.max_size "> 3 </property> 这个设置有关,设置几就能重复几次这样的过程。自己想了想,这个设置是用来设置数据库的最大连接的,可是我的代码中已经在查询完数据库之后进行了释放资源呀,也把SessionFactory关闭了呀,怎么还能这样呢?难道说我这个程序只能有限次数的访问数据库????!!!!!请高手指点指点吧,很郁闷的,资源也释放了,就是不行……唉!
[解决办法]
不要关闭整个连接,只要关闭session就可以了