收录日期:2018/08/16 06:40:49 时间:2016/05/20 18:27:38 标签:Web 开发
我用DB27.1+WAS3.5做了一个图书检索网站
对一个8万条数据的表进行检索,我得JAVA BEAN中调用完连接都是及时关闭的,WAS数据源的最大连接数设了20,而且网站访问量也不是很大,可不到几分钟,连接池就会爆满,出现无法连接数据库的故障!
哪位遇到过此类问题,或者帮我推断一下可能性也好啊~
再次感谢!!!
领分!!!
为什么不清楚。
以前也遇到过这样的情况,不过是weblogic+oracle。后来发现是程序设计的问题——正常的调用还是对连接发生了关闭,但是异常发生以后就没有关闭。
如果楼主确信在各种情况下已经关闭了连接,我就不知道为什么了。
没有试过.
你用完以后释放到连接池去了没?

我不知道你是不是按照连接池的定义去操作数据库连接的?
会不会是没有将用过的连接还给连接池而直接关闭?
还是经常出现异常而没有正常结束(这个应该不会吧?)?
爱莫能助
没有试过,帮你顶~`````
没做过。
顶~
回答不了就顶
Initial Capacity: 200

Maximum Capacity: 2000

试试 先!

这问题我也遇到过
关注
早上好啊~

呵呵

按你这种说法。。。。

难道是释放的时候出错?然后导致无效的连接占用了资源?
不知道!
帮你UP!
如果你的结果集调用的是 resultset 那就是问题的关键了!
rs.close();
rs=null;

呵呵,试试看吧!!
用ondemand吧!
TO:无名
应该是无效的连接占用资源,但我已经确确实实释放了啊~~
:(

TO flyshp(天堂雨) 
是BEAN里用的的确是resultset 

TO:sgdb(神天月晓)
有加这句啊·~
:(

TO:无名
应该是无效的连接占用资源,但我已经确确实实释放了啊~~
:(

TO flyshp(天堂雨) 
是BEAN里用的的确是resultset 

TO:sgdb(神天月晓)
有加这句啊·~
:(

up一下
package book;


import book.DBJ;
import java.util.*;

public final class General {
/**
 * 定义一个数据库句柄,还未实例化。
 */
private static DBJ dbinst;
private static int SOURCE_NUM = 0;

/**
* 初始化数据库对象实例,还未连接指定数据库。
* @roseuid 3DE57EFA02B9
*/
private static void initDbinst() {
if (SOURCE_NUM == 0) {
dbinst = null;
dbinst = new DBJ();
} else {
dbinst = null;
dbinst = new DBJ(SOURCE_NUM);
}
}

/**
* 构造函数,带参数。
* @roseuid 3DE57EFA02B9
*/
public General()
{
}
public General(int i_source)
{
SOURCE_NUM = i_source;
}

/*
* 设置数据源编号
*
*/
public static void setSource(int i_source_num)
{
SOURCE_NUM = i_source_num;
}

/**
* 连接数据库。
* @roseuid 3DE57EFA02B9
*/
public static void connDB() {
initDbinst();
dbinst.setConnection();
}

/**
* 提交数据库操作。
* @roseuid 3DE57EFA02B9
*/
public static void commit() {
if (dbinst != null) {
dbinst.setCommit();
}
}

/**
* 回滚数据库操作。
* @roseuid 3DE57EFA02B9
*/
public static void rollback() {
if (dbinst != null) {
dbinst.setRollback();
}
}

/**
* 关闭数据库连接。
* @roseuid 3DE57EFA02B9
*/
public static void closeDB() {
if (dbinst != null) {
dbinst.closeConnection();

}
}

/**
* 根据传进来的sql获取数据库纪录。
* @return ArrayList
* @roseuid 3DE57F6A0093
*/
public static ArrayList getPageQueryList(
String s_sql,
int pagecount,
int pagenum) {
ArrayList alist_data = null;
if (s_sql == null || s_sql.equals("")) {
alist_data = new ArrayList(1);
ArrayList alist_line = new ArrayList(2);
alist_line.add(0, "0");
alist_line.add(1, "0");
alist_data.add(0, alist_line);
return alist_data;
}
try {
connDB();
alist_data = dbinst.doPageQueryList(s_sql, pagecount, pagenum);
//closeDB();
} catch (Exception e) {
//closeDB();
System.out.println("DB error:" + e);
} finally {
if (alist_data == null) {
alist_data = new ArrayList(1);
ArrayList alist_line = new ArrayList(2);
alist_line.add(0, "0");
alist_line.add(1, "0");
alist_data.add(0, alist_line);
                          closeDB();
}
return alist_data;
}
}

/**
* 根据传进来的sql获取数据库纪录。
* @return ArrayList
* @roseuid 3DE57F6A0093
*/
public static Vector getPageQueryVector(
String s_sql,
int pagecount,
int pagenum) {
Vector vec_data = null;
if (s_sql == null || s_sql.equals("")) {
vec_data = new Vector(1);
Vector vec_line = new Vector(2);
vec_line.addElement("0");
vec_line.addElement("0");
vec_data.addElement(vec_line);
return vec_data;
}
try {
connDB();
vec_data = dbinst.doPageQueryVector(s_sql, pagecount, pagenum);
closeDB();
} catch (Exception e) {
closeDB();
System.out.println("DB error:" + e);
} finally {
if (vec_data == null) {
vec_data = new Vector(1);
Vector vec_line = new Vector(2);
vec_line.addElement("0");
vec_line.addElement("0");
vec_data.addElement(vec_line);
}
return vec_data;
}
}

/**
* 根据传进来的sql获取数据库纪录。
* @return ArrayList
* @roseuid 3DE57F6A0093
*/
public static ArrayList getQueryList(String s_sql) {
ArrayList alist_data = null;
if (s_sql == null || s_sql.equals("")) {
alist_data = new ArrayList(0);
return alist_data;
}
try {
connDB();
alist_data = dbinst.doQueryList(s_sql);
closeDB();
} catch (Exception e) {
closeDB();
System.out.println("DB error:" + e);
} finally {
if (alist_data == null) {
alist_data = new ArrayList(0);
}
return alist_data;
}
}

/**
* 根据传进来的sql获取数据库纪录。
* @return ArrayList
* @roseuid 3DE57F6A0093
*/
public static Vector getQueryVector(String s_sql) {
Vector vec_data = null;
if (s_sql == null || s_sql.equals("")) {
vec_data = new Vector(0);
return vec_data;
}
try {
connDB();
vec_data = dbinst.doQueryVector(s_sql);
closeDB();
} catch (Exception e) {
closeDB();
System.out.println("DB error:" + e);
} finally {
if (vec_data == null) {
vec_data = new Vector(0);
}
return vec_data;
}
}

/**
* 根据传进来的sql获取一条数据库纪录中的单个数据值。
* @return String
* @roseuid 3DE57F6A0093
*/
public static String getOneValue(String s_sql) {
String s_return = "";
if (s_sql == null || s_sql.equals("")) {
return s_return;
}
ArrayList alist_data = null;
try {
connDB();
alist_data = dbinst.doQueryList(s_sql);
closeDB();
} catch (Exception e) {
closeDB();
System.out.println("DB error:" + e);
} finally {
if (alist_data != null && !alist_data.isEmpty()) {
ArrayList alist_line = (ArrayList) alist_data.get(0);
s_return = (String) alist_line.get(0);
}
if (s_return == null) {
s_return = "";
}
return s_return;
}
}
/**
* 连接数据库,根据传进来的sql对数据库纪录进行更新操作,直接提交操作并关闭连接。
* @return int
* @roseuid 3DE57F6A0093
*/
public static int setUpdate(String s_sql) {
int affect_num = 0;
if (s_sql == null || s_sql.equals("")) {
return affect_num;
}
try {
connDB();
affect_num = dbinst.doUpdate(s_sql);
closeDB();
} catch (Exception e) {
closeDB();
System.out.println("DB error:" + e);
} finally {
return affect_num;
}
}

/**
* 对数据库同时进行多次增加、删除、修改操作
* @return int
* @roseuid 3DE57F6A0093
*/
public static int setUpdate(ArrayList alist_sql) {
int affect_num = 0;
if (alist_sql == null) {
return affect_num;
} else
if (alist_sql.isEmpty()) {
return affect_num;
}
try {
connDB();
affect_num = dbinst.doUpdate(alist_sql);
closeDB();
} catch (Exception e) {
closeDB();
System.out.println("DB error:" + e);
} finally {
return affect_num;
}
}

/**
* 根据传进来的sql对数据库纪录进行更新操作,不提交操作。
* @return int
* @roseuid 3DE57F6A0093
*/
public static int setUpdateAble(String s_sql) {
int affect_num = 0;
if (s_sql == null || s_sql.equals("")) {
return affect_num;
}
try {
if (dbinst == null) {
System.out.println("Please init dbinst first!");
} else {
affect_num = dbinst.doUpdateAble(s_sql);
}
} catch (Exception e) {
System.out.println("DB error:" + e);
} finally {
return affect_num;
}
}

/**
* 根据传进来的sql对数据库纪录进行更新操作,不提交操作。
* @return int
* @roseuid 3DE57F6A0093
*/
public static int setUpdateAble(ArrayList alist_sql) {
int affect_num = 0;
if (alist_sql == null) {
return affect_num;
} else
if (alist_sql.isEmpty()) {
return affect_num;
}
try {
if (dbinst == null) {
System.out.println("Please init dbinst first!");
} else {
affect_num = dbinst.doUpdateAble(alist_sql);
}
} catch (Exception e) {
System.out.println("DB error:" + e);
} finally {
return affect_num;
}
}

/**
* 根据传进来的sql获取一条数据库纪录中的单个数据值。
* @return String
* @roseuid 3DE57F6A0093
*/
public static String getOneValueAble(String s_sql) {
String s_return = "";
if (s_sql == null || s_sql.equals("")) {
return s_return;
}
ArrayList alist_data = null;
try {
if (dbinst == null) {
System.out.println("Please init dbinst first!");
} else {
alist_data = dbinst.doQueryList(s_sql);
}
} catch (Exception e) {
closeDB();
System.out.println("DB error:" + e);
} finally {
if (alist_data != null && !alist_data.isEmpty()) {
ArrayList alist_line = (ArrayList) alist_data.get(0);
s_return = (String) alist_line.get(0);
}
return s_return;
}
}

/**
* 根据传进来的sql获取一条数据库纪录中的单个数据值。
* @return String
* @roseuid 3DE57F6A0093
*/
public synchronized static int setUpdateByCheck(
String s_select_sql,
String s_update_sql,
boolean b_next) {
int affect_num = 0;
if (s_select_sql == null
|| s_select_sql.equals("")
|| s_update_sql == null
|| s_update_sql.equals("")) {
return affect_num;
}
try {
connDB();
ArrayList alist_data = dbinst.doQueryList(s_select_sql);
if (!alist_data.isEmpty() == b_next) {
affect_num = dbinst.doUpdate(s_update_sql);
}
closeDB();
} catch (Exception e) {
closeDB();
System.out.println("DB error:" + e);
} finally {
return affect_num;
}
}

/**
* 根据传进来的sql获取一条数据库纪录中的单个数据值。
* @return String
* @roseuid 3DE57F6A0093
*/
public synchronized static int setUpdateByCheck(
String s_select_sql,
ArrayList alist_update_sql,
boolean b_next) {
int affect_num = 0;
if (s_select_sql == null
|| s_select_sql.equals("")
|| alist_update_sql == null
|| alist_update_sql.isEmpty()) {
return affect_num;
}
try {
connDB();
ArrayList alist_data = dbinst.doQueryList(s_select_sql);
if (!alist_data.isEmpty() == b_next) {
affect_num = dbinst.doUpdate(alist_update_sql);
}
closeDB();
} catch (Exception e) {
closeDB();
System.out.println("DB error:" + e);
} finally {
return affect_num;
}
}

...................

好多。。。

感觉try,catch这么写很容易漏掉的,你可以在:

/**
* 连接数据库。
* @roseuid 3DE57EFA02B9
*/
public static void connDB() {
initDbinst();
dbinst.setConnection();
}

里面就用try,catch,这样子在外面可以直接用connDB(),其它的也是这样,这样检查也比较方便的。
5555
时间紧迫啊~
晕,我总觉得不是程序的问题……
你用的是ejb 还是 javabean

程序里 有没有 return.resultset;的方法,然后再jsp 里调用了??
你一下贴这么多,一看就有点晕,而且你的closeDB()哪里都有,查起来好累的。

尤其是你现在都做完了,测试起来更不容易。

你可以查的到连接池的连接数吧?先把最大连接设成5,然后测试你的页面,记录下哪个操作占用了连接(能不能给个标志?呵呵),然后到释放的时候看看连接数有没有减一,这样查查看。就知道哪里出问题了的,然后才能解决啊~
to : acefr()

  你说他能不能是 用的结果集虽然在jsp 和别的web页里用了.close ,但内部实际并没有真正的关掉与数据库的连接
在程序里有没有关掉数据库连接池
建议先好好测试,找到问题在哪,
不然很难的,未必就是程序问题,
也有可能是数据库设置问题。


只可惜我太菜!
建议先好好测试,找到问题在哪,
不然很难的,未必就是程序问题,
也有可能是数据库设置问题。


只可惜我太菜!
不太明白
up
up
看看你的这两个函数:
DBG.setConnection();
DBG.closeConnection();
public static void closeDB() {
if (dbinst != null) {
dbinst.closeConnection();
                           dbinst=null; 
}
}
呵呵,要是你有耐心的话在每个finally里加上System.gc();
9.9成是调用连接完毕后,程序没有关闭连接...........
感谢各位,问题应该基本水落石出了……
 lynx1111(人生不如意十有八九!) ——估计的没错~
数据库配置的问题~
唉,谁让我是第一次用DB2呢?
接分
UP
接!学习ing
..........

居然是这个问题??

服了。。。

结帖的时候记得把解决方案贴一下啊~

呵呵
^_^
也没什么神奇的,
你熟悉DB2,对你来说不值一晒,如果不熟悉,说了也没用阿~~
全是没有技术含量的东东……
叫了一个DBA,三下五除二就搞定了,关键是帮朋友做的一个特别急得项目,4天4夜,一个小型的电子商务网站,还在我不熟得架构上……
快累死了,TNND~
(请大家允许我骂骂人,实在太晕)