我正在开发一个社交网站项目。为了缩短我将向用户显示的网站页面中的代码,我已经创建了一个不同的类,我已经将其包含在我的各个页面中,并使用了该类中定义的不同函数。
例如:我想显示用户的详细信息,这是代码:
User objUser=new User();
ResultSet rs=objUser.getAllDetails(userName);
rs.next();
data="<div id=text>"+
"<table>"+
"<tr><td colspan=2><h1>User Details<hr></h1></td></tr>"+
"<tr><td>First Name: </td><td>"+rs.getString("firstname")+"</td></tr>"+
"<tr><td>Last Name: </td><td>"+rs.getString("lastname")+"</td></tr>"+
"<tr><td>User Name: </td><td>"+rs.getString("username")+"</td></tr>"+
"<tr><td>Mail Id: </td><td>"+rs.getString("mailid")+"</td></tr>"+
"<tr><td>Contact: </td><td>"+rs.getString("contact")+"</td></tr>"+
"<tr><td>Course: </td><td>"+rs.getString("course")+"</td></tr>"+
"<tr><td>Branch: </td><td>"+rs.getString("branch")+"</td></tr>"+
"<tr><td>Year: </td><td>"+rs.getString("year")+"</td></tr>"+
"</table>"+
"</div>";
这是我检索详细信息的代码。我的类名是User,我创建了它的一个对象,并使用其中定义的函数返回我处理并存储为字符串然后再打印的结果。
这是我的功能getAllDetails()
的代码 public ResultSet getAllDetails(String userName)
{
ResultSet rs=null;
try
{
Class.forName(application.getInitParameter("driver"));
Connection con = DriverManager.getConnection(application.getInitParameter("url"),application.getInitParameter("username"),application.getInitParameter("password"));
Statement st=con.createStatement();
rs=st.executeQuery("Select * from userfinal where username='"+userName+"'");
return rs;
}
catch(Exception e)
{
return rs;
}
}
现在,问题是如果我运行我的webapp很长一段时间我得到一个TNS错误,我相信这是因为没有打开连接,因为所有连接都被占用。问题是我没有关闭我在getDetails()函数中建立的连接,但是如果我在返回ResultSet之前尝试关闭连接,那么它会显示连接已关闭的错误。如果我在返回对象后将其关闭,我认为没有任何意义,但我也尝试了它,并且错误表明return语句之后的代码永远不会被执行。如果我尝试在Finally块中关闭连接,那么它不会识别变量st和con。
我相信一个解决方案是增加连接数量,但我认为这不是很好,因为如果我现场制作这个应用程序并且有很多用户,我不能继续增加连接到无限数量的连接。
请帮忙。在此先感谢您的帮助。我希望我能够清楚地说明我打算提出的问题。
答案 0 :(得分:1)
你做错了。首先,getConnection()位置错误,太深。在用户会话开始时使用getConnection(),在相同级别的代码中,您最终可以断言所有结果都已从数据库中读取,并且您可以安全地关闭()连接。
或者更好的是,谷歌“连接池”,以了解如何更有效地设计它。