DBconnection.java
/*****************************
 * 数据库连接 bean ,用来连接 resin 的连接池
 *****************************/
package zhl.database.mysql;import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import javax.naming.Context;
import javax.naming.InitialContext;public class DBConnection {
    private Connection conn = null;
    private Statement stmt = null;
    private ResultSet rs = null;
    private int resultNum = 0;    /**
     * 构造函数
     * 找到数据源,并用这个数据源创建连接
     */
    public DBConnection() {
        try {
            Context env = new InitialContext();
            DataSource pool = (DataSource) env.lookup("java:comp/env/jdbc/test");//其中java:comp/env/jdbc/是固定的,后面跟在resin或tomcat中配置的名字
            if (pool == null)
               throw new Exception("jdbc/test is an unknown DataSource");
            conn = pool.getConnection();
            stmt = conn.createStatement();
        } catch (Exception e) {
            System.out.println("naming:" + e.getMessage());
        }
    }
public Connection getConnection()
{
return conn;
}    /**
     * 执行SQL语句:查询记录
     * @param sql SQL语句
     * @return ResultSet 记录集
     */
    public ResultSet executeQuery(String sql) {
        rs = null;
        try {
            rs = stmt.executeQuery(sql);
        } catch(SQLException se) {
            System.out.println("Query error:" + se.getMessage());
        }
        return rs;
    }    /**
     * 执行SQL语句 :插入与更新记录
     * @param sql SQL语句
     * @return int resultNum 更新的记录数
     */
    public int executeUpdate(String sql) {
        resultNum=0;
        try {
            resultNum = stmt.executeUpdate(sql);
        } catch (SQLException se) {
            System.err.println("Update error:" + se.getMessage());
        }
        return resultNum;
    }    /**
     * 关闭连接
     */
    public void close() {
System.out.println("aaa");
if(null!=rs){
try{
rs.close();   //关闭结果集
}catch(SQLException se){
System.out.println("close error: " + se.getMessage());
}
}
if(null!= stmt){
try{
stmt.close();    //关闭SQL语句对象
}catch(SQLException se){
System.out.println("close error: " + se.getMessage());
}
}
if(null!=conn){
try{
System.out.println("bbbbbb");
if(!conn.isClosed()){
System.out.println("ccccccc");
conn.close();   //关闭数据库
}
}catch(SQLException se){
System.out.println("close error: " + se.getMessage());
// application.log()//是写到日志
}
}
}
}
我在tomcat控制台看到每刷新一次页面就输出
aaa
bbbbbb
ccccccc
证明close()已经正常执行了。
五次后连接池满了(测试目的只设成5,在tomcat5的server.xml中设置)
用resin页做了测试,一样是刷新5次就不能访问了。
以上连接池的问题是第一个问题,还有。我的分页,无论显示的试哪一页,
都显示线两条数据。 rs.absolute((intPage-1) * intPageSize + 1);这行上面我加了输出显示从第几条开始,是正确的,而且rs.absolute((intPage-1) * intPageSize + 1);这句应该也是正常执行了。不知怎么没有效果。
我的环境是tomcat5.0.25+jdk1.4应该是支持这个语句的,而且也没有出错啊。以上两个问题,我弄了一个双休日。高手帮我看看。

解决方案 »

  1.   

    在关闭完以后加一句rs=null;
    stmt=null;
    conn=null;
      

  2.   

    删除
    <jsp:useBean id="filelistbean" scope="page" class="zhl.database.mysql.DBConnection" />
      

  3.   

    你没用到连接池//装载JDBC驱动程序Class.forName("org.gjt.mm.mysql.Driver").newInstance();//连接数据库sqlCon = java.sql.DriverManager.getConnection("jdbc:mysql://localhost/test","","");
    从上面可以看出,每次当有页面请求时都进行了数据库的连接
      

  4.   

    ningIII(小宁) 你说的我用过,没用。
     bdsc() 删除还怎么用连接池类啊
     shuqianlz(大个) 这段代码在/* */中间使注销的,你没看仔细吧。
      

  5.   

    bdsc() 分是你的了。能告诉我为什么吗?
      

  6.   

    你需要用连接池获取连接,如下:
    //----------------------------------------------------------
        Context initCtx = new InitialContext();
        Context ctx = (Context) initCtx.lookup("java:comp/env");
        ds = (DataSource) ctx.lookup("jdbc/Test");
        initCtx.close();
        //此时,你就可以用return ds.getConnection();来返回连接
      

  7.   

    我也遇到了同样的问题!!!看楼住似乎解决了问题,难道真的是把
    <jsp:useBean id="filelistbean" scope="page" class="zhl.database.mysql.DBConnection" />去掉么????去掉了怎么编译?怎么使用???
      

  8.   

    bdsc() 删除还怎么用连接池类啊
    我来答一下啦,
    你在程序里根本就没用到这你定义的bean,你是直接用的全名.
    这是你写的哦:
    zhl.database.mysql.DBConnection Conn = new zhl.database.mysql.DBConnection();//生成连接池对象
      

  9.   

    >bdsc() 分是你的了。能告诉我为什么吗?
    <jsp:useBean id="filelistbean" scope="page" class="zhl.database.mysql.DBConnection" />
    上面的代码已经生成了一个DBConnection对象,
    在你的DBConnection的构造器中已经从连接池获取了
    一个对象,但是在你的jsp中并没有调用filelistbean.close();也就是说在整个过程中并没有把获取的连接归还给
    pool,有借无还,pool有再多的连接也总会有用完的时候呀。
      

  10.   

    有什么区别吗?
    另外分页每页都一样是怎么回事
    第一页
    >> 首 页 下一页   尾 页 页次:1/3页, 5条 2条/页  

    tom - 【1】 
    jack - 【2】 
     
    执行时间 (毫秒): 1222 第二页
    >> 首 页 下一页   尾 页 页次:1/3页, 5条 2条/页  

    tom - 【1】 
    jack - 【2】 
     
    执行时间 (毫秒): 1222 
    第三页
    >> 首 页 上一页 尾 页 页次:3/3页, 5条 2条/页  

    tom - 【1】 
    jack - 【2】 
     
    执行时间 (毫秒): 210 我共有五条数据,每一页都显示头两条,为什么后面三条看不到呢,如果我每页显示5条,则
    >> 首 页 尾 页 页次:1/1页, 5条 5条/页  

    tom - 【1】 
    jack - 【2】 
    mary - 【3】 
    lisa - 【4】 
    me - 【5】 
     
    执行时间 (毫秒): 60
    也就是说分页时rs.absolute((intPage-1) * intPageSize + 1);这句没起到作用。
    不知我想的对不对。可是为什么不出错呢?
    还有上面bean的问题。
    贴子+10分先。
      

  11.   

    <jsp:useBean id="filelistbean" scope="page" class="zhl.database.mysql.DBConnection" />楼主是不是把代码贴错了!filelistbean是DBConnection的一个实例,但是下面根本没有用到嘛,所以他的连接没有关闭,造成了连接池撑死的情况!你再看看你的代码,好乱阿,赫赫,jsp里面好多重复的,检查一下!
      

  12.   

    到了公司的电脑上,就Ok了。为什么啊。水能说一下,放心,今天(周一)下班前节帖。
    还有使用bean的方法能解释一下吗?