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

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
说的有道理!比喻很恰当.

猜你喜欢