.net freamwork中 C#写的,如下两段
1.  OracleConnection oraConn1 = new OracleConnection("Data Source= source;User Id= user;Password= user;");
      OracleConnection oraConn2 = new OracleConnection("Data Source= source;User Id= user;Password= user;");
      oraConn1.Open();
      oraConn1.Close();
      oraConn2.Open();
      oraConn2.Close();
2. OracleConnection oraConn1 = new OracleConnection("Data Source= source;User Id= user;Password= user;");
      OracleConnection oraConn2 = new OracleConnection("Data Source= source;User Id= user;Password= user;");
      oraConn1.Open();      
      oraConn2.Open();
   oraConn1.Close();
      oraConn2.Close();如上两段程序,执行第一部分,我看到有一个新的Session;如果换成是执行第二段,发现有六个Session出现,虽然这些都是inactive的,但总觉得这样不好,要多占好几个SessionID。能告诉我这是为什么么?我可以怎么改善解决这个问题呢? 十分感谢!

解决方案 »

  1.   

    使用连接池的话,与数据库的连接(关闭或打开)并不是由应用程序去控制的,当你close的时候其实只是把你使用过的连接放回连接池中,即该连接并不一定真正关闭,而是仍放在池供其它用户共享.你可以尝试一下,执行第二段后,再去执行第一段看看Session的数量?
      

  2.   

    池的作用是加快数据库的连接效率,默认情况下是使用的.
    如果要禁用连接池,在连接字符串里加上:pooling=false .
      

  3.   

    楼上兄弟可能误会我的意思了。我刚刚又试了一下,把结果放上来先。
    我试的是
    oraConn1.Open()~~~~~orcConnN.Open()
    oraConn1.Close()~~~~~orcConnN.Close()
    也就是说,连着打开N个连接,然后又关掉N个连接
    这时的Session数为下
    连接数    Session数
     1       1
     2       6
     6       11
     11       16
      16             21
      21             26
    上面这些值,都是临界值,也就是说,连接数是17或者18个时,Session数也是21个。其实我想问的就是这个是为什么?
      

  4.   

    一个session对应一个连接,但是一个连接未必对应一个session,可能会对应有多个session. 如果你确定多出的几个不是系统自身的会话,可使用select distinct paddr from v$session;看看是否与你的连接数是否一致?
      

  5.   

    这几天要忙于搬家至新大楼办公,在做一系列的工作,来得少了。Session>=连接数,我想可能是.Net或是IIS这么做的。CS模式下一个连接数对应一个Session;
    虽然.Net的WEB服务器连接至Oracle服务器仅一个IP而已,但由于.Net Web服务的开放性,是否可以理解为:增加Session的冗余数可以减少WEB服务器每次连接至Oracle服务器的次数。即每连接Oracle 1次,WEB可能同时处理了1至5个同时访问Web的用户需求。
      

  6.   

    一个连接对应多个session在逻辑也是能够说得过去呀,这很正常,写程序的时候也经常这样处理的如:一个用户登录系统后,某个连接一直打开着,在连接打开期间它可以多次与数据库交互,也相当于有多个session
    这在理论上是说得通的
      

  7.   

    连接池当然有N多连接啦.当然了,如果是并行计算下,也会产生很多session.v$px_session
    v$px_process都可以看看.