读书人

大家帮小弟我看一下这个链接问什么取不

发布时间: 2012-01-03 22:16:06 作者: rapoo

大家帮我看一下这个链接问什么取不到了?连接池的问题

用的是C3P0连接池(初学者,有点打击了...)

下面是我测试的代码,最大链接是20,带我在同一个jsp页面中重复刷新到第21次的时候,这个链接就取不到了,页面一直处于加载状态,只有重启服务才能进行其他操作,还有请教大家的是,我这样获取链接和释放链接的方法对么?

这个代码是不是存在很多问题,还请各位指教,最好有实例代码参考一下,共同进步

谢谢大家!
-------------------------


import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import org.apache.log4j.Logger;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DBPoolManager {

public static DBPoolManager dbm= null;

// LOG4J的日志记录,推荐使用,主要调试错误信息,重要的日志记录
private static Logger log = Logger.getLogger(DBPoolManager.class);

private Connection conn = null;
private PreparedStatement ps= null;
private ResultSet rs= null;


private static InitialContext ctx = null;
private ComboPooledDataSource cpds = null;

/**
* 创建该类时初始化
*
*/
public DBPoolManager(){
getDataSource();
}


/**
* 获取数据库操作实例
* @return
*/
public static DBPoolManager getInstance(){
if(dbm == null)
dbm = new DBPoolManager();
return dbm;
}


/**
* 创建静态方法,实现JDBC定义的连接池接口
* @throws SQLException
* @throws ClassNotFoundException
*/
public void getDataSource() {
cpds = new ComboPooledDataSource();
try {
cpds.setDriverClass( "com.mysql.jdbc.Driver " );//loads the jdbc driver
cpds.setJdbcUrl( "jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8 " );
cpds.setUser( "root ");
cpds.setPassword( "test ");
cpds.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(20);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
// 记录日志信息,说明已经成功建立连接池
log.info( " init c3p0 datasource ...22... ");
}


/**
* 获得连接
* @return
* @throws SQLException
*/
public Connection getConnection() throws SQLException{
if(cpds == null)
getDataSource();
return cpds.getConnection();
}


/**
* 获得记录集,不分页,该方法中可以获得总记录数
* @param sqlSQL预编译语句
* @param pv参数集
* @returnResultSet结果集
* @throws SQLException
*/
public ResultSet query(String sql,ParameterValues pv) throws SQLException{
conn = getConnection();


ps = conn.prepareStatement(sql);
if(pv!=null){
// 获取参数
List list = pv.getParameters();
// 循环设置参数
for(int i=0;i <pv.getSize();i++){
ps.setString(i+1, list.get(i).toString());
}
}
return ps.executeQuery();
}


/**
* 对数据库进行增、删、改操作
* @param sqlSQL预编译语句
* @return修改成功的记录数
* @throws SQLException
*/
public int update(String sql) throws SQLException{
conn= getConnection();
ps = conn.prepareStatement(sql);
int rows = ps.executeUpdate();
System.out.println(conn);
return rows;
}


/**
* 释放连接
* @throws SQLException
*/
public void releaseConnection() throws SQLException{
if(rs!=null){
rs.close();// 关闭结果集
}
if(ps!=null){
ps.close();// 关闭载体
}
if(conn!=null){
conn.close();// 关闭连接
}
}
}


—————————————————————————————————————

jsp页面中是这样调用的


<%@ page language= "java " import= "java.util.*,java.sql.* " pageEncoding= "UTF-8 "%>
<jsp:directive.page import= "vdo.test.DBPoolManager "/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN ">
<html>
<head>
<title> My JSP 'MyC3P0Demo.jsp ' starting page </title>
</head>

<body>
<%
DBPoolManager dbm = DBPoolManager.getInstance();
String sql = "select * from user ";
ResultSet rs = dbm.query(sql);
while(rs.next())
{
out.print( " <P> "+rs.getString(2));
}

dbm.releaseConnection();
%>


</body>
</html>



[解决办法]
先顶了再看
[解决办法]
楼主以上的代码根本就没有体现任何连接池的思想,建议楼主先把连接池的思想搞清楚.

既然是连接池,肯定需要一个集合对象(列表也好,数组也好,自定义对象也好)来对生成的连接进行统一管理,体现在池中连接的创建,使用,消亡的整个生命周期,由于初始化连接是很消耗资源的,所以连接池的好处就是初始创建一定数量的连接,从而省去了每次请求创建的时间,同时由于是连接池统一管理所有的连接,也使得连接能够被统一规范的管理和分配
[解决办法]
顶了再看
[解决办法]
如果你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了。
但是如果你使用连接池,那么请注意,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement和ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。

------解决方案--------------------


学习

读书人网 >Java Web开发

热点推荐