首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

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

2012-01-03 
大家帮我看一下这个链接问什么取不到了?连接池的问题 用的是C3P0连接池(初学者,有点打击了...)下面是我测

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

用的是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都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。

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


学习

热点排行