类型:转载 责任编辑:asp.net 日期:2007/05/23
热门软件下载:
如果在线人数有上百人的话,就会当掉。
为了防止程序中有连接没有关闭,
我在代码中加了一个连接的管理,
如果连接数超过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 () ;
}
}
}
网友回答:
当机的可能原因会是你的应用服务器 承受能力有限 导致的!
你没有写进程,
考虑你的机器配置,考虑你的应用服务器,重要的是考虑你的程序。
weblogic 提供的连接池程序应该够用了。
你的并发用户有几百个 那么建议你的最大连接数还是大一点好,程序容易当机那么有些耗时的操作你可以
放在其他的机器上处理。
其实我们应用程序优化的最终问题都会集中在数据库操作上!
通常用 tomcat 的时候可能出现你说的问题,但是最先考虑的是 程序问题, 检查检查你的程序估计程序哪里
没有优化好,负载大的地方应该想象用一些特殊的方法处理,如果这些数据只是读取性数据那么你就没有必要
经常读取数据库,你可以在服务器启动的时候最先读入存入hashtable 里面或者其他对象池,这样就减轻了
数据库的负载。
你说的问题不是很清楚,所以没有办法给你说的再具体点,当然我的能力也有限,共同进步 :)!
我发现weblogic在用户多的时候容易死,以前用tomcat反而不会
gz
你的用法很古怪,而且过时,用weblogic自己带的连接池就可以了啊
我的web检索应用刚刚通过了400并发测试,不理解你为什么不用通用的做法
dataSource = (DataSource) ic.lookup(dataSourceName);
非常简单
static private Hashtable pools = new Hashtable(); //存放DB连接
static private ArrayList vector = new ArrayList(); //存放标志
你存放这些干嘛,连接都在weblogic管理的连接池中啊
建议直接用weblogic的连接池。
^_^
还有就是weblogic是不是没有问题,
还是???
能吧Log贴出来么
synchronized(this){
这个写了又没用的
你是new一个的,this又不一样
取连接的代码呢。