类的调用问题,对付大量代码中数据库连接未及时释放的代码维护问题 我觉得freeConnection中有问题:你怎么可以把Connection给close掉呢?这不是你该做的事情,这是连接池做的。事实上你把这个Connection给close掉了,那么这个connection对于ConnectionPool就没有用了。我想你的意思大概是con.commit()才对吧?另外,ConnectionPool的代码在哪里? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 为什么不用web服务器的连接池?就不应该有这么多问题了 我上周也解决了一个几乎一模一样的问题。我的解决思路是:1)从连接池获取连接时,将获取时间记录下来。2)这样就可以得到一个连接被使用的时间。3)每次有释放连接的需求产生时,去检查一次有无超时的连接(我自己设定的是10分钟),如果有,就自动释放掉。这样就可以保证不会因为太多的异常连接导致缓冲池被占满。我自己实际还改写了获取连接的页面(我是struts的action里面),多传递一个connUser进去,这样就可以配合监控页面实时显示当前有那个类正在使用那个连接。楼主按照这个思路改改吧,应该不难的,实在不行,可以再联系我。 继承 http lisenter 要是没有 http 请求 自动关闭连接! 你将freeConnection向下面的方式写看看,public void freeConnection(String name, Connection con) { try{ if(con != null){ con.commit(); con.close(); } con == null; }catch(Exception e){ } }如果你不能保证每个JSP页面中都会调到该方法(当然这个页面中有获取连接的语句)那你最好还是改写你的DBConnectionManager,然后开起一个新的线程,然后按照s_phoenix说的思想去解决吧。可能利用AOP方面的一些思想也能解决该问题,但这样可能就把问题复扎花了关键是你们写JSP代码的人,在JSP页面中最终一定会调用到这个方法。这种写JSP的方法,好像以前在新致时大家这么些。唉不说了 搂主的意思,我大概明白,好像是要做一个匹配查找.来找出未施放连接的jsp页面其实就是一个查找是否获得连接或释放连接是匹配的问题.//其中的参数很明白.改个路径运行即可.///////吧以前的一个代码统计类给你改吧了改吧.可以用了..import java.io.*; import java.util.*;public class Untitled1 { public Untitled1() { } public static void main(String[] args) { Untitled1 untitled11 = new Untitled1(); List list=new ArrayList(); list=untitled11.getCodeRows(new File("c:\\test\\"),".jsp,.java,.class",false,list); if(list!=null){ for(int i=0;i<list.size();i++){ System.out.println("没有匹配的文件路径和文件名称:"+list.get(i)); } } } /** *统计代码的行数 * @param file 文件或目录 * @param FileterStr 要统计的文件的后缀名的字符串:例如:".java,.jsp,.html.js,.css" * @param isBlankLie 是否统计空行,true:空行也算一行,false:空行不算 * @return count 统计得到的行数。 */ public List getCodeRows(File file, String FileterStr,boolean isBlankLine,List list) { long count = 0; if (file.isDirectory()) {//如果是目录 System.out.println("path=" + file.getPath()); String[] subfiles = file.list(new FileFileter(FileterStr)); System.out.println("子文件和文件夹的个数="+subfiles.length); if (subfiles != null) { for (int i = 0; i < subfiles.length; i++) { File subfile = new File(file.getPath() + "\\" + subfiles[i]); if (subfile.isDirectory()){ //递归遍历文件目录 this.getCodeRows(subfile, FileterStr,isBlankLine,list); } else //统计一个文件的代码航数 list.add(this.countRows(subfile,isBlankLine)); }//for }//if (subfiles != null) }// else {//如果是文件 //统计一个文件的代码航数 list.add(countRows(file,isBlankLine)); } return list; } /** * 统计一个文件中的行数 * @param file * @return */ private String countRows(File file,boolean isBlankLine) { boolean flag=false; try { java.io.BufferedReader breader = new java.io.BufferedReader(new java.io. FileReader(file)); if (breader != null) { String s=null; while ((s=breader.readLine())!= null) { if (isBlankLine || s.length() > 0)//统计或不统计空行 { if (s.indexOf("getConnection") != -1) flag = true; if (s.indexOf("freeConnection") != -1) flag = false; } s = null; } breader.close();; } } catch (IOException ex) { ex.printStackTrace(); } if(flag) return file.getPath()+"===="+file.getName(); else return null; } /** *内隐类 * <p>Title: 文件名过虑类,主要用于过虑要统计的文件</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2004</p> * <p>Company: 乐开工作室 http://blog.csdn.net/shaokun305 </p> * @author 陈少坤 * @version 1.0 */ class FileFileter implements java.io.FilenameFilter { String filename; FileFileter(String filename){ this.filename=filename; } /** * 实现那个filenameFileter的accept接口 * @param dir * @param name * @return */ public boolean accept(File dir, String name) { boolean flag = false; String filetername[] = filename.split(","); if (filetername != null) {//如果是 for (int i = 0; i < filetername.length; i++) { if (name.indexOf(filetername[i]) != -1) { flag = true; break; } } } else//如果过虑字符串为null,则都统计。 flag=true; if (dir.isDirectory())//如果是目录都需要获得进行统计 flag = true; return flag; } } } 关于使用华为短信开发包发送和接收短信的问题。 struts2 struts2 整合 jquery、ajax 出现这种错误应该是那里出错了 hibernate.cfg.xml文件应放在什么位置 在JAVA3D里,怎么样判断一个类被完全执行完了. tomcat自带例子的问题 Java VS .NET 问俩struts2的问题 jwt 刷新token token登录 “俄罗斯方块” 游戏程序 帮帮忙吧 等着救命的!!!怎么想给多点分都不可以的?! Eclipse中配置Jboss4开发环境时,在Eclipse中为什么保存不了设置??
就不应该有这么多问题了
我的解决思路是:
1)从连接池获取连接时,将获取时间记录下来。
2)这样就可以得到一个连接被使用的时间。
3)每次有释放连接的需求产生时,去检查一次有无超时的连接(我自己设定的是10分钟),如果有,就自动释放掉。
这样就可以保证不会因为太多的异常连接导致缓冲池被占满。
我自己实际还改写了获取连接的页面(我是struts的action里面),多传递一个connUser进去,这样就可以配合监控页面实时显示当前有那个类正在使用那个连接。
楼主按照这个思路改改吧,应该不难的,实在不行,可以再联系我。
继承 http lisenter 要是没有 http 请求 自动关闭连接!
public void freeConnection(String name, Connection con)
{
try{
if(con != null){
con.commit();
con.close();
}
con == null;
}catch(Exception e){
}
}如果你不能保证每个JSP页面中都会调到该方法(当然这个页面中有获取连接的语句)那你最好还是
改写你的DBConnectionManager,然后开起一个新的线程,然后按照s_phoenix说的思想去解决吧。
可能利用AOP方面的一些思想也能解决该问题,但这样可能就把问题复扎花了
关键是你们写JSP代码的人,在JSP页面中最终一定会调用到这个方法。
这种写JSP的方法,好像以前在新致时大家这么些。唉不说了
其实就是一个查找是否获得连接或释放连接是匹配的问题.
//其中的参数很明白.改个路径运行即可.///////吧以前的一个代码统计类给你改吧了改吧.可以用了..
import java.io.*;
import java.util.*;public class Untitled1 {
public Untitled1() {
}
public static void main(String[] args) {
Untitled1 untitled11 = new Untitled1();
List list=new ArrayList();
list=untitled11.getCodeRows(new File("c:\\test\\"),".jsp,.java,.class",false,list);
if(list!=null){
for(int i=0;i<list.size();i++){
System.out.println("没有匹配的文件路径和文件名称:"+list.get(i));
}
} } /**
*统计代码的行数
* @param file 文件或目录
* @param FileterStr 要统计的文件的后缀名的字符串:例如:".java,.jsp,.html.js,.css"
* @param isBlankLie 是否统计空行,true:空行也算一行,false:空行不算
* @return count 统计得到的行数。
*/
public List getCodeRows(File file, String FileterStr,boolean isBlankLine,List list) {
long count = 0;
if (file.isDirectory()) {//如果是目录
System.out.println("path=" + file.getPath());
String[] subfiles = file.list(new FileFileter(FileterStr));
System.out.println("子文件和文件夹的个数="+subfiles.length);
if (subfiles != null) {
for (int i = 0; i < subfiles.length; i++) {
File subfile = new File(file.getPath() + "\\" + subfiles[i]);
if (subfile.isDirectory()){ //递归遍历文件目录
this.getCodeRows(subfile, FileterStr,isBlankLine,list);
}
else //统计一个文件的代码航数
list.add(this.countRows(subfile,isBlankLine)); }//for }//if (subfiles != null) }//
else {//如果是文件
//统计一个文件的代码航数
list.add(countRows(file,isBlankLine)); } return list; } /**
* 统计一个文件中的行数
* @param file
* @return
*/
private String countRows(File file,boolean isBlankLine) {
boolean flag=false;
try {
java.io.BufferedReader breader = new java.io.BufferedReader(new java.io.
FileReader(file));
if (breader != null) {
String s=null;
while ((s=breader.readLine())!= null) {
if (isBlankLine || s.length() > 0)//统计或不统计空行
{
if (s.indexOf("getConnection") != -1)
flag = true;
if (s.indexOf("freeConnection") != -1)
flag = false;
}
s = null;
}
breader.close();;
}
}
catch (IOException ex) {
ex.printStackTrace();
}
if(flag)
return file.getPath()+"===="+file.getName();
else
return null; } /**
*内隐类
* <p>Title: 文件名过虑类,主要用于过虑要统计的文件</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: 乐开工作室 http://blog.csdn.net/shaokun305 </p>
* @author 陈少坤
* @version 1.0
*/
class FileFileter implements java.io.FilenameFilter
{
String filename;
FileFileter(String filename){
this.filename=filename;
} /**
* 实现那个filenameFileter的accept接口
* @param dir
* @param name
* @return
*/
public boolean accept(File dir, String name) {
boolean flag = false;
String filetername[] = filename.split(",");
if (filetername != null) {//如果是
for (int i = 0; i < filetername.length; i++) {
if (name.indexOf(filetername[i]) != -1) {
flag = true;
break;
}
}
}
else//如果过虑字符串为null,则都统计。
flag=true;
if (dir.isDirectory())//如果是目录都需要获得进行统计
flag = true;
return flag; } } }