Chinaunix

标题: 关于Tomcat的MySQL连接池的问题,求救! [打印本页]

作者: 我是好人    时间: 2003-12-18 10:22
标题: 关于Tomcat的MySQL连接池的问题,求救!
我的系统为:
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,但问题依旧。

那么我到底错在哪里?该怎么解决呢?请各位指点!
作者: elgs    时间: 2003-12-18 13:14
标题: 关于Tomcat的MySQL连接池的问题,求救!
你的程序的Connection的实例没有在 finally里用 close() 方法关闭。 这是必须的, 因为容器维护的连接池分配给你的都是逻辑连接, 如果不认为关闭逻辑连接, 容器就会始终维护这个连接状态和不释放。
作者: bluesjsp    时间: 2003-12-18 13:46
标题: 关于Tomcat的MySQL连接池的问题,求救!
elgs说得很对
补充一点:你要看一下你的数据库最大支持多少个连接,假设支持20个连接,而你的maxActive设为1000,当连接超过20个的时候,就不会得到连接了
作者: 我是好人    时间: 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"”这样的连接,怎么关闭呢?
作者: 我是好人    时间: 2003-12-19 09:14
标题: 关于Tomcat的MySQL连接池的问题,求救!
to bluesjsp:我怎样才能知道“数据库最大支持多少个连接”呢?
作者: 我是好人    时间: 2003-12-22 18:11
标题: 关于Tomcat的MySQL连接池的问题,求救!
请大家帮帮我吧!
作者: elgs    时间: 2003-12-22 22:59
标题: 关于Tomcat的MySQL连接池的问题,求救!
你有try和catch块, 再catch后增加finally块调用close()方法关闭。
作者: 我是好人    时间: 2003-12-23 09:56
标题: 关于Tomcat的MySQL连接池的问题,求救!
to elgs:不行呀!
如果在“public DBConnection()”中加“close()”,那一连接就关闭了;
如果在“public ResultSet executeQuery(String sql) ”中加“close()”,那就无法返回记录集了;

我在尝试在JSP中每次连接后立即手动调用“close()”,不知是否可行?
作者: 无法激活    时间: 2003-12-24 02:08
标题: 关于Tomcat的MySQL连接池的问题,求救!
看tomcat的文档,有关于如何用data source的
作者: 我是好人    时间: 2003-12-29 15:22
标题: 关于Tomcat的MySQL连接池的问题,求救!
请继续
作者: zjkdc    时间: 2003-12-29 16:13
标题: 关于Tomcat的MySQL连接池的问题,求救!
你这个bean是被什么调用的?如果是jsp的话,那在jsp中等你处理完rs后,调用这个bean的close方法不就可以了么
作者: elgs    时间: 2003-12-29 19:20
标题: 关于Tomcat的MySQL连接池的问题,求救!
你对数据库操作不是要catch 诸如 NamingException SQLException等等的Exceptions吗? 如果我说得没错, 那就在你的catch候加上一个finally块, 在finnally块里关闭连接, 这是你的业务逻辑肯定已经结束了, 如果这个bean里的另外一个方法还需要连接, 那让它再去获取连接, 这是标准操作, 获取的连接池里的空闲连接。
作者: elgs    时间: 2003-12-29 19:22
标题: 关于Tomcat的MySQL连接池的问题,求救!
不是再jsp里关闭, 再bean里就要关闭。
作者: zjkdc    时间: 2003-12-30 08:46
标题: 关于Tomcat的MySQL连接池的问题,求救!
楼上的,他的bean里那个方法是返回rs的,如果来个finally,那rs就没用了。
作者: elgs    时间: 2003-12-30 11:24
标题: 关于Tomcat的MySQL连接池的问题,求救!
返回rs的做法不对, 那样又把很多java代码弄到页面里来了,最好放回一个数组, 或者另外一个bean
作者: 我是好人    时间: 2004-01-04 07:57
标题: 关于Tomcat的MySQL连接池的问题,求救!
to elgs:请具体讲讲好吗?
作者: elgs    时间: 2004-01-05 00:26
标题: 关于Tomcat的MySQL连接池的问题,求救!

  1. package something;

  2. import java.sql.*;
  3. import javax.naming.NamingException;


  4. public class RsBean
  5. {
  6.         private ConnMaker connMaker;
  7.         private Connection connection;
  8.         private Statement statement;
  9.         private ResultSet rs;

  10.         private int rows;
  11.         private int cols;
  12.         private String[][] data;

  13.         public int getRows()
  14.         {
  15.                 return this.rows;
  16.         }
  17.         public void setRows(int rows)
  18.         {
  19.                 this.rows = rows;
  20.         }

  21.         public int getCols()
  22.         {
  23.                 return this.cols;
  24.         }
  25.         public void setCols(int cols)
  26.         {
  27.                 this.cols = cols;
  28.         }

  29.         public RsBean()
  30.         {
  31.                 connMaker = new ConnMaker();
  32.         }

  33.         public double getSum(int col) throws NumberFormatException
  34.         {
  35.                 if(data != null)
  36.                 {
  37.                         double sum = 0D;
  38.                         for(int i = 0; i < getRows(); ++i)
  39.                                 sum += Double.parseDouble(data[col][i]);
  40.                         return sum;
  41.                 }
  42.                 else
  43.                         return 0D;
  44.         }
  45.       public void setData(String sql) throws NamingException, SQLException
  46.       {
  47.             try
  48.             {
  49.                   connection = connMaker.getConnection();
  50.                   statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
  51.                   rs = statement.executeQuery(sql);
  52.                   rs.last();
  53.                   setRows(rs.getRow());
  54.                   rs.beforeFirst();
  55.                   ResultSetMetaData rsMetaData = rs.getMetaData();
  56.                   setCols(rsMetaData.getColumnCount());
  57.                   data = new String[cols][rows];
  58.                   while(rs.next())
  59.                   {
  60.                         int row = rs.getRow() - 1;
  61.                         for(int col = 0; col < cols; ++col)
  62.                               data[col][row] = rs.getString(col + 1);
  63.                   }
  64.             }
  65.             finally
  66.             {
  67.                   if(rs != null)
  68.                   {
  69.                         rs.close();
  70.                   }
  71.                   if(statement != null)
  72.                   {
  73.                         statement.close();
  74.                   }
  75.                   if(connection != null)
  76.                   {
  77.                         connection.close();
  78.                   }
  79.             }

  80.       }
  81.       public String[][] getData()
  82.       {
  83.             return data;
  84.       }
  85. }

复制代码

作者: elgs    时间: 2004-01-05 00:27
标题: 关于Tomcat的MySQL连接池的问题,求救!

  1. package something;

  2. import java.sql.*;
  3. import javax.sql.*;
  4. import javax.naming.*;

  5. public class ConnMaker
  6. {
  7.         Context context = null;
  8.         public ConnMaker()
  9.         {
  10.         }
  11.         public Connection getConnection() throws NamingException,SQLException
  12.         {       
  13.                 try
  14.                 {
  15.                         context = new InitialContext();
  16.                         DataSource dataSource = (DataSource)context.lookup("java:comp/env/jdbc/hd31DB");
  17.                         return dataSource.getConnection();
  18.                 }
  19.                 finally
  20.                 {
  21.                         if(context == null)
  22.                                 context.close();
  23.                 }
  24.         }
  25. }
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2