免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4001 | 回复: 17
打印 上一主题 下一主题

关于Tomcat的MySQL连接池的问题,求救! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-12-18 10:22 |只看该作者 |倒序浏览
我的系统为:
Redhat9
Apache2.0.48(jk-1.2.5)
Tomcat5.0.12
MySQL4.0.16
我用下面的方法设置MySQL的连接池:
<Resource name="jdbc/连接池名称" auth="Container" type="javax.sql.DataSource"/>;
<ResourceParams name="jdbc/连接池名称">;
<parameter>;
<name>;factory</name>;
<value>;org.apache.commons.dbcp.BasicDataSourceFactory</value>;
</parameter>;
<parameter>;
<name>;maxActive</name>;
<value>;1000</value>;
</parameter>;
<parameter>;
<name>;maxIdle</name>;
<value>;0</value>;
</parameter>;
<parameter>;
<name>;maxWait</name>;
<value>;10000</value>;
</parameter>;
<parameter>;
<name>;username</name>;
<value>;数据库用户名</value>;
</parameter>;
<parameter>;
<name>;password</name>;
<value>;数据库口令</value>;
</parameter>;
<parameter>;
<name>;driverClassName</name>;
<value>;org.gjt.mm.mysql.Driver</value>;
</parameter>;
<parameter>;
<name>;url</name>;
<value>;jdbc:mysql://localhost:3306/数据库名称?useUnicode=true&characterEncoding=gb2312&autoReconnect=true</value>;
</parameter>;
</ResourceParams>;

原来设置的“maxIdle”为300,但过些时候总出现数据库错误,查看Tomcat日志有这样的记录:
namingBCP could not obtain an idle db connection, pool exhausted
我尝试将“maxIdle”改为0,但问题依旧。

那么我到底错在哪里?该怎么解决呢?请各位指点!

论坛徽章:
0
2 [报告]
发表于 2003-12-18 13:14 |只看该作者

关于Tomcat的MySQL连接池的问题,求救!

你的程序的Connection的实例没有在 finally里用 close() 方法关闭。 这是必须的, 因为容器维护的连接池分配给你的都是逻辑连接, 如果不认为关闭逻辑连接, 容器就会始终维护这个连接状态和不释放。

论坛徽章:
0
3 [报告]
发表于 2003-12-18 13:46 |只看该作者

关于Tomcat的MySQL连接池的问题,求救!

elgs说得很对
补充一点:你要看一下你的数据库最大支持多少个连接,假设支持20个连接,而你的maxActive设为1000,当连接超过20个的时候,就不会得到连接了

论坛徽章:
0
4 [报告]
发表于 2003-12-19 09:10 |只看该作者

关于Tomcat的MySQL连接池的问题,求救!

to elgs:我不太明白,是在连接数据库的Bean中吗?我的Bean是这样的:
/*****************************
* 数据库连接 bean ,用来连接 resin/tomcat 的连接池
*****************************/
package cn.edu.yctc.ebc;

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/ebcpool";
            if (pool == null)
               throw new Exception("jdbc/ebcpool is an unknown DataSource";
            conn = pool.getConnection();
            stmt = conn.createStatement();
        } catch (Exception e) {
            System.out.println("naming:" + e.getMessage());
        }
    }

    /**
     * 执行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() {
        try {
            if (rs != null) {
                rs.close();
                rs = null;
            }
            if (stmt != null) {
               stmt.close();
               stmt = null;
            }
            if (conn != null) {
                conn.close();
                conn = null;
            }
        } catch (SQLException se) {
            System.out.println("close error: " + se.getMessage());
        }
    }
}

我该在什么地方加您说的close()呢?“public void close()”可以吗?怎么调用呢?不是说Java会自动回收资源吗?

另外,如果是“scope="application"”这样的连接,怎么关闭呢?

论坛徽章:
0
5 [报告]
发表于 2003-12-19 09:14 |只看该作者

关于Tomcat的MySQL连接池的问题,求救!

to bluesjsp:我怎样才能知道“数据库最大支持多少个连接”呢?

论坛徽章:
0
6 [报告]
发表于 2003-12-22 18:11 |只看该作者

关于Tomcat的MySQL连接池的问题,求救!

请大家帮帮我吧!

论坛徽章:
0
7 [报告]
发表于 2003-12-22 22:59 |只看该作者

关于Tomcat的MySQL连接池的问题,求救!

你有try和catch块, 再catch后增加finally块调用close()方法关闭。

论坛徽章:
0
8 [报告]
发表于 2003-12-23 09:56 |只看该作者

关于Tomcat的MySQL连接池的问题,求救!

to elgs:不行呀!
如果在“public DBConnection()”中加“close()”,那一连接就关闭了;
如果在“public ResultSet executeQuery(String sql) ”中加“close()”,那就无法返回记录集了;

我在尝试在JSP中每次连接后立即手动调用“close()”,不知是否可行?

论坛徽章:
0
9 [报告]
发表于 2003-12-24 02:08 |只看该作者

关于Tomcat的MySQL连接池的问题,求救!

看tomcat的文档,有关于如何用data source的

论坛徽章:
0
10 [报告]
发表于 2003-12-29 15:22 |只看该作者

关于Tomcat的MySQL连接池的问题,求救!

请继续
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP