一段代码.高人来帮忙看看有没有问题?

xuwei1008 2012-03-09 10:11:43
JSP+JAVABEAN连接数据库.每隔一段时间就打不开网页了.需要重启TOCMAT才行.请高人帮我看看,程序有没有问题?
数据源JAVABEAN:
第一个DBConnSource.java
/*
* 数据源连接BEAN
*/
package mybean;

import java.sql.*;
import javax.sql.*;
import javax.naming.*;

public class DBConnSource {
private Connection conn;
private Statement stmt;
private PreparedStatement pstmt;
public DBConnSource(String dsName){
try{
Context initCtx = new InitialContext();
Context ctx =(Context)initCtx.lookup("java:comp/env");
DataSource ds =(DataSource)ctx.lookup(dsName);
conn = ds.getConnection();
}
catch(Exception e)
{
System.out.print(e.toString());
}
}
public synchronized Statement getStmt()throws Exception
{
stmt=conn.createStatement();
return stmt;
}
public synchronized PreparedStatement getPstmt(String sql)throws Exception
{
pstmt=conn.prepareStatement(sql);
return pstmt;
}
public void DBclose(){
try{
conn.close(); :重点是这里.这个conn.close 到底有没有被执行到.
}catch(Exception e){
System.out.print(e.toString());
}
}
}

第二个TitleList.java
/*
* 显示帖子列表只显示前10条.
* 使用数据源连接.
*
*/
package mybean;

import java.sql.*;

import mybean.DBConnSource;

public class TitleList {

private String tableName="";
private Statement stmt;

public TitleList(){}

public void setTableName(String n){
this.tableName=n;
}

public StringBuffer getBuffer(){
StringBuffer buffer=new StringBuffer();
try{
DBConnSource dbc=new DBConnSource("jdbc/myweb");
stmt=dbc.getStmt();
}catch(Exception e){
System.out.print("不能连接到数据源"+e.toString());
}

try{
String strSql="SELECT * FROM "+tableName+" ORDER BY id DESC LIMIT 10";
ResultSet rs = stmt.executeQuery(strSql);

rs.first();
do{
String title=rs.getString("title");
buffer.append("<a href='cont.jsp?nid="+rs.getInt("id")+"' target=_blank>"+title+"</a></BR>");
}while(rs.next());
rs.close();
stmt.close();
}
catch(SQLException e){
System.out.print("数据连接错误."+e.toString());
}
return buffer;
}
}

这两段代码.就是定义一个连接数据库的JAVABEAN,然后在每个需要使用动态数据的JAVABEAN里调用这个JAVABEAN.
象上述写法.那个conn.close(),有没有被执行到.
另外我的TOMCAT每隔一段时间就需要重启一下.还可能是什么原因?
谢谢
只有20分了.希望大家多多帮忙.
...全文
246 点赞 收藏 27
写回复
27 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dryZeng 2012-03-16
DBConnSource dbc=new DBConnSource("jdbc/myweb");

这个声明像private Statement stmt;这个声明一样,放于类的上面变量声明区域。

然后你可以在最后去调用dbc.DBclose()方法了。
回复
javamyself 2012-03-16
[Quote=引用 8 楼 xuwei1008 的回复:]
回winneer200,TOMCAT启动报错,但是为什么每隔一段时间就会报错呢.每次重启以后顶多过几个小时就要重启.如果程序没有问题,远程主机的内存不可能这么一点点.
[/Quote]

应用服务器运行一段时间就关闭,肯定是资源没有释放,给服务器拖挂了。
回复
yy365070666 2012-03-15
你的代码写得让人看了很是蛋疼
回复
yy365070666 2012-03-15
public void DBclose(){
try{
conn.close(); :重点是这里.这个conn.close 到底有没有被执行到.
}catch(Exception e){
System.out.print(e.toString());
}
}
你这个方法没有调用,conn.close什么可能被执行?
回复
xuwei1008 2012-03-15
重新修改代码.

/*
* 网站JAVABEAN
* 所有帖子分类列表.
* 使用数据源连接.
* 前后台共用JAVABEAN.
*/
package mybean;

import java.sql.*;

import mybean.DBConnSource;

public class StyleList {


private String tableName;
private Statement stmt;
private ResultSet rs;

public StyleList(){}

public void setTableName(String n){
this.tableName=n;
}

public StringBuffer getBuffer(){
StringBuffer buffer=new StringBuffer();
try{
DBConnSource dbc=new DBConnSource("jdbc/myweb");
stmt=dbc.getStmt();
}catch(Exception e){
System.out.print("不能连接到数据源");
}

try{
String strSql="SELECT * FROM "+tableName;
rs = stmt.executeQuery(strSql);

while(rs.next()){
buffer.append("<a href='style.jsp?style="+rs.getString("style")+"' target=_blank>"+rs.getString("style")+"</a>");
buffer.append("   ");
}
}catch(SQLException e){
System.out.print(e.toString());
}finally{
try{ //关闭 ResultSet rs.
if(rs!= null){
rs.close();}
}catch(SQLException ex){
System.out.print(ex.toString());
}finally{
rs=null;
}

try{ // 关闭 Statement stmt.
if(stmt!= null){
stmt.close();}
}catch(SQLException ex){
System.out.print(ex.toString());
}finally{
stmt=null;
}

try{
if(conn != null){ //这里报错无法解析conn;
conn.close();} //这里也报错无法解析conn;

}catch(SQLException ex){
System.out.print(ex.toString());
}finally{
conn=null; //这里也报错无法解析conn;
}
}

return buffer;
}
}

请问是怎么回事?
我要怎么样才能关闭引用的数据连接封装JAVABEAN里的数据连接.
谢谢
回复
xuwei1008 2012-03-15
回楼上.蛋疼是什么意思?太复杂?
回复
昨日凡阳 2012-03-14
你这样参考着做,我说个思路:

DBConnSource.java中,DBclose这个方法不要。

在StyleList.java中,来关闭这些资源。

finally{
if(rs != null){
rs.close();
}

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

if(dbc.getConn != null){
conn.close();
}
}

}
回复
xuwei1008 2012-03-14
请问.我修改的是否正确.
按照这种写法.我要怎么调用DBConnSource.java里的DBclose();
另外我还有一个问题.关于这个 stmt,我在第一个JAVABEAN里已经关闭了stmt.在第二个DBConnSource.java里是否还需要再关闭一次.那个pstmt也是同样的问题.在用到pstmt的地方关闭了pstmt以后,是否还需要通过这个DBclose()再关闭一次.
谢谢.
回复
xuwei1008 2012-03-14
感谢iisgirl;
重新修改了代码;

package mybean;
import java.sql.*;
import mybean.DBConnSource;
public class StyleList {

private String tableName;
private Statement stmt;
private ResultSet rs;

public StyleList(){}

public void setTableName(String n){
this.tableName=n;
}

public StringBuffer getBuffer(){
StringBuffer buffer=new StringBuffer();
try{
DBConnSource dbc=new DBConnSource("jdbc/myweb");
stmt=dbc.getStmt();
}catch(Exception e){
System.out.print("不能连接到数据源");
}

try{
String strSql="SELECT * FROM "+tableName;
rs = stmt.executeQuery(strSql);

while(rs.next()){
buffer.append("<a href='style.jsp?style="+rs.getString("style")+"' target=_blank>"+rs.getString("style")+"</a>");
buffer.append("   ");
}
}catch(SQLException e){
System.out.print(e.toString());
}finally{
try{ //关闭 ResultSet rs.
if(rs!= null){
rs.close();}
}catch(SQLException e){
System.out.print(e.toString());
}finally{
rs=null;
}

try{ // 关闭 Statement stmt.
if(stmt!= null){
stmt.close();}
}catch(SQLException e){
System.out.print(e.toString());
}finally{
stmt=null;
}

}

return buffer;
}
}


另外我在DBConnSource.java中重新修改了DBclose().

/*
* 数据源连接BEAN
*/
package mybean;

import java.sql.*;
import javax.sql.*;
import javax.naming.*;

public class DBConnSource {
private Connection conn;
private Statement stmt;
private PreparedStatement pstmt;
public DBConnSource(String dsName){
try{
Context initCtx = new InitialContext();
Context ctx =(Context)initCtx.lookup("java:comp/env");
DataSource ds =(DataSource)ctx.lookup(dsName);
conn = ds.getConnection();
}
catch(Exception e)
{
System.out.print(e.toString());
}
}
public synchronized Statement getStmt()throws Exception
{
stmt=conn.createStatement();
return stmt;
}
public synchronized PreparedStatement getPstmt(String sql)throws Exception
{
pstmt=conn.prepareStatement(sql);
return pstmt;
}
public void DBclose(){
try{ //关闭 Connection conn;
if(conn!=null){
conn.close();
}
}catch(Exception e){
System.out.print(e.toString());
}finally{
conn=null;
}

try{ //关闭Statement stmt;
if(stmt!=null){
stmt.close();
}
}catch(Exception e){
System.out.print(e.toString());
}finally{
stmt=null;
}

try{ //关闭 PreparedStatement pstmt;
if(pstmt!=null){
pstmt.close();
}
}catch(Exception e){
System.out.print(e.toString());
}finally{
pstmt=null;
}
}
}

回复
昨日凡阳 2012-03-13
你用的同步,synchronized,那么,如果一旦有一个线程拿着conn没有释放,有没有空闲的conn,那web application肯定就僵死了。



while(rs.next());
rs.close();
stmt.close();
}

这块不对。


应该是,在最后,catch后,给个finally{
if(rs != null){
rs.close();
}

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

if(rs != null){
rs.close();
}
}
回复
xuwei1008 2012-03-13
回楼上.那我要怎么正确关闭数据库连接呢?
回复
昨日凡阳 2012-03-13
[Quote=引用 10 楼 xuwei1008 的回复:]

还是老问题.
做了许多测试后.在远程空间的stdout日志里找到"org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object不能连接到数据源"这个提示.
看来还是代码出了问题.请大家再帮我看看上面的代码.谢谢.
[/Quote]


没有空闲的conn了,之前的conn没有释放掉。
回复
xuwei1008 2012-03-13
看来是我的数据连接没有正确关闭.
我在DBConnSource里定义的那个close()要怎么正确调用呢?
另外,还有一个问题.象我这样定义了一个连接数据库的JAVABEAN,然后在数据操作的JAVABEAN里调用的方式,要怎么关闭数据库连接比较合适.是否需要写一个专门依次关闭ResultSet rs, Statement stmt, connection conn 的JAVABEAN 然后在每个数据操作的页面里调用.
回复
dryZeng 2012-03-12
好像你并没有在任何地方调用DBclose()这个方法。
回复
jumpheightway 2012-03-12
javabean设计问题
回复
xuwei1008 2012-03-11
还是老问题.
做了许多测试后.在远程空间的stdout日志里找到"org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object不能连接到数据源"这个提示.
看来还是代码出了问题.请大家再帮我看看上面的代码.谢谢.
回复
lynnlovemin 2012-03-10
....
半年没写这样的了 蛋疼
回复
gaoruixin 2012-03-10
还没学呢
回复
xuwei1008 2012-03-10
回winneer200,TOMCAT启动报错,但是为什么每隔一段时间就会报错呢.每次重启以后顶多过几个小时就要重启.如果程序没有问题,远程主机的内存不可能这么一点点.
回复
wineer200 2012-03-10

Connection conn;
private Statement stmt;
private PreparedStatement pstmt;
这一系列组合本身就是一个事务处理,放在一个try ,catch里边就可以,统一完成一个事务,如果抛异常都差不多,最后写关闭conn,java是一个比较神奇的东西,谁也不知道下一秒钟它会干点啥!
还有你的tom是启动报错,不是运行报错,建议你清一下tom内部缓存,tomcat是一个更神寄的东西,代码组合一下。tom缓存清理一下


回复
加载更多回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2012-03-09 10:11
社区公告
暂无公告