并发人数一多的话为什么会当机,以下是关键程序代码,希望各位兄弟能帮忙分析一下,或许互有裨益!谢谢捧场!!

04-10-23 bibiye
并发人数一多的话为什么会当机,以下是关键程序代码,希望各位兄弟能帮忙分析一下,或许互有裨益!谢谢捧场!!

为了防止程序中有连接没有关闭,

我在代码中加了一个连接的管理,

如果连接数超过29个,

就关闭所有连接,

再重新取,

但问题依旧,

所以来这里恳请请各位兄弟的帮忙了!

关键是请各位兄弟分析一下以下代码的缺点,包括逻辑思路,语法的定义使用等哪里还存在问题!

package com.xindeco.common.dbconn ;

import java.sql.* ;

import javax.sql.* ;

import java.util.* ;

import java.io.* ;

import javax.naming.* ;

public class DbConn

{

public ResultSet rs = null ;

public Statement stmt = null ;

private CustomizedResultSet crs = null ;

public Connection conn = null ;

static private Hashtable pools = new Hashtable(); //存放DB连接

static private ArrayList vector = new ArrayList(); //存放标志

static private int x = 0; //存放标志

private long lt ;

private long lt1 ;

public DbConn ()

{

this.getConnByWeblogicPool () ;

}

//根据txdatasource的JNDI取得conn

private void getConnByWeblogicPool ()

{

String url = "" ;

String user = "" ;

String password = "" ;

DataSource ds = null ;

Context ctx = null ;

try

{

//如果正在使用的连接超过29个,将全部关闭

if(x > 29){

for(int i = 0; i<vector.size();){

Object o = pools.get(vector.get(i));

Connection c = (Connection)o;

if(c!=null && !c.isClosed()){

x--;

//System.out.println ("关闭无效连接后还剩下x="+x);

pools.remove(vector.get(i));

vector.remove(i);

c.close () ;

}

}

}

ctx = this.getInitialContext () ;

ds = (javax.sql.DataSource) ctx.lookup ("graduate") ;

synchronized(this){

conn = ds.getConnection () ;

if (conn != null)

{

++x;

//System.out.println ("建立连接个数xxxx=" + (++x)) ;

lt = System.currentTimeMillis();

vector.add(String.valueOf(lt));

pools.put(String.valueOf(lt),conn);

stmt = conn.createStatement

(

ResultSet.TYPE_SCROLL_SENSITIVE,

ResultSet.CONCUR_READ_ONLY

) ;

}

}

}

catch (Exception e)

{

throw e;

}

}

static final private Context getInitialContext ()

throws Exception

{

Properties properties = null ;

try

{

properties = new Properties () ;

properties.put (Context.INITIAL_CONTEXT_FACTORY,

"weblogic.jndi.WLInitialContextFactory") ;

return new InitialContext (properties) ;

}

catch (Exception ex)

{

//ex.printStackTrace () ;

throw ex ;

}

}

synchronized public void close ()

{

try

{

if (stmt != null && !conn.isClosed ())

{

stmt.close () ;

stmt = null ;

}

if (stmt1 != null && !conn.isClosed ())

{

stmt1.close () ;

stmt1 = null ;

}

if (rs != null && !conn.isClosed ())

{

rs.close () ;

rs = null ;

}

if (conn != null && !conn.isClosed ())

{

pools.remove (String.valueOf (lt)) ;

vector.remove (String.valueOf (lt)) ;

conn.close () ;

conn = null ;

--x;

//System.out.println ("关闭后还剩连接个数111xxxx=" + (--x)) ;

}

}

catch (Exception ex)

{

//ex.printStackTrace () ;

}

}

}

banq
2004-10-25 13:52
我反复声明,不建议自己写连接池,使用容器提供的连接池。

我这里做个比喻:

中国通过剑枪打仗,外国已经到了枪炮,如果我们还在研究我还学习如何制造剑枪,很显然是宝贵浪费时间和精力。

廉价劳力
2004-10-27 07:47
呵呵,一看就没有synchronize

古打
2004-10-27 09:33
支持一下

java511
2004-10-27 11:31
说的有道理!比喻很恰当.

猜你喜欢