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日志有这样的记录:
naming
BCP 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连接池的问题,求救!
package something;
import java.sql.*;
import javax.naming.NamingException;
public class RsBean
{
private ConnMaker connMaker;
private Connection connection;
private Statement statement;
private ResultSet rs;
private int rows;
private int cols;
private String[][] data;
public int getRows()
{
return this.rows;
}
public void setRows(int rows)
{
this.rows = rows;
}
public int getCols()
{
return this.cols;
}
public void setCols(int cols)
{
this.cols = cols;
}
public RsBean()
{
connMaker = new ConnMaker();
}
public double getSum(int col) throws NumberFormatException
{
if(data != null)
{
double sum = 0D;
for(int i = 0; i < getRows(); ++i)
sum += Double.parseDouble(data[col][i]);
return sum;
}
else
return 0D;
}
public void setData(String sql) throws NamingException, SQLException
{
try
{
connection = connMaker.getConnection();
statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = statement.executeQuery(sql);
rs.last();
setRows(rs.getRow());
rs.beforeFirst();
ResultSetMetaData rsMetaData = rs.getMetaData();
setCols(rsMetaData.getColumnCount());
data = new String[cols][rows];
while(rs.next())
{
int row = rs.getRow() - 1;
for(int col = 0; col < cols; ++col)
data[col][row] = rs.getString(col + 1);
}
}
finally
{
if(rs != null)
{
rs.close();
}
if(statement != null)
{
statement.close();
}
if(connection != null)
{
connection.close();
}
}
}
public String[][] getData()
{
return data;
}
}
复制代码
作者:
elgs
时间:
2004-01-05 00:27
标题:
关于Tomcat的MySQL连接池的问题,求救!
package something;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
public class ConnMaker
{
Context context = null;
public ConnMaker()
{
}
public Connection getConnection() throws NamingException,SQLException
{
try
{
context = new InitialContext();
DataSource dataSource = (DataSource)context.lookup("java:comp/env/jdbc/hd31DB");
return dataSource.getConnection();
}
finally
{
if(context == null)
context.close();
}
}
}
复制代码
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2