前几天在服务器上部署了一个应用,运行一段时间后发现打开页面速度变慢,数据库使用sql server 2000,用下面代码查看性能后发现连接数有300多个,但此时并没有人在访问该系统,
use master
select count(*) from sysprocesses where dbid in 
(select dbid from sysdatabases where name='mhbdb')
代码是由strut、Hibernate、spring三个框架编写,session是由spring控制,按理说spring会在数据库操作完成后自动关闭连接,但是我查看数据库连接数时,连接数并没有减少,数据库连接使用连接池实现,希望高手不吝赐教,在此先谢过了,如下
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass"
value="com.microsoft.jdbc.sqlserver.SQLServerDriver">
</property>
<property name="jdbcUrl"
value="jdbc:microsoft:sqlserver://localhost:1433;databaseName=APTECH_NBQN">
</property>
<property name="user" value="sa"></property>
<property name="password" value=""></property>
<!--连接池中保留的最小连接数。-->
<property name="minPoolSize">
            <value>50</value>
        </property>
        <!--连接池中保留的最大连接数。Default: 15 -->
        <property name="maxPoolSize">
            <value>1000</value>
        </property>
        <!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
        <property name="initialPoolSize">
            <value>20</value>
        </property>
         <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
        <property name="maxIdleTime">
            <value>30</value>
        </property>
        <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
        <property name="acquireIncrement">
            <value>20</value>
        </property>
        <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个connection而不是整个连接池。
           所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
        <property name="maxStatements">
            <value>0</value>
        </property>
        <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
        <property name="idleConnectionTestPeriod">
            <value>60</value>
        </property>
        <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
        <property name="acquireRetryAttempts">
            <value>5</value>
        </property>
        <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接。
           如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。Default: false-->
        <property name="breakAfterAcquireFailure">
            <value>true</value>
        </property>
</bean>

解决方案 »

  1.   

    数据库连接,用完了没断开造成的。
    --用完了应该,SET 数据库连接=nothing
      

  2.   

    楼主也可以用这个查看有哪些连接。
    sp_who 
    --活动
    sp_who 'active'
      

  3.   

    谢谢各位
    我用楼上方法运行
    结果如下
    1 0 background   sa 0 NULL LAZY WRITER     
    2 0 sleeping sa 0 NULL LOG WRITER      
    3 0 background   sa 0 NULL LOCK MONITOR    
    4 0 background   sa 0 master SIGNAL HANDLER  
    5 0 background   sa 0 master TASK MANAGER    
    6 0 background   sa 0 master TASK MANAGER    
    7 0 sleeping sa 0 NULL CHECKPOINT SLEEP
    8 0 background   sa 0 master TASK MANAGER    
    9 0 background   sa 0 master TASK MANAGER    
    10 0 background   sa 0 master TASK MANAGER    
    11 0 background   sa 0 master TASK MANAGER    
    12 0 background   sa 0 master TASK MANAGER    
    13 0 background   sa 0 master TASK MANAGER    
    53 0 runnable MHBLOVEWHY\Administrator MHBLOVEWHY       0 master SELECT 
    这段结果说明什么?请指教
      

  4.   

    谢谢各位
    我用楼上方法运行
    结果如下
    1 0 background   sa 0 NULL LAZY WRITER     
    2 0 sleeping sa 0 NULL LOG WRITER      
    3 0 background   sa 0 NULL LOCK MONITOR    
    4 0 background   sa 0 master SIGNAL HANDLER  
    5 0 background   sa 0 master TASK MANAGER    
    6 0 background   sa 0 master TASK MANAGER    
    7 0 sleeping sa 0 NULL CHECKPOINT SLEEP
    8 0 background   sa 0 master TASK MANAGER    
    9 0 background   sa 0 master TASK MANAGER    
    10 0 background   sa 0 master TASK MANAGER    
    11 0 background   sa 0 master TASK MANAGER    
    12 0 background   sa 0 master TASK MANAGER    
    13 0 background   sa 0 master TASK MANAGER    
    53 0 runnable MHBLOVEWHY\Administrator MHBLOVEWHY       0 master SELECT 
    这段结果说明什么?请指教
      

  5.   

    谢谢各位
    我用楼上方法运行
    结果如下
    1 0 background   sa 0 NULL LAZY WRITER     
    2 0 sleeping sa 0 NULL LOG WRITER      
    3 0 background   sa 0 NULL LOCK MONITOR    
    4 0 background   sa 0 master SIGNAL HANDLER  
    5 0 background   sa 0 master TASK MANAGER    
    6 0 background   sa 0 master TASK MANAGER    
    7 0 sleeping sa 0 NULL CHECKPOINT SLEEP
    8 0 background   sa 0 master TASK MANAGER    
    9 0 background   sa 0 master TASK MANAGER    
    10 0 background   sa 0 master TASK MANAGER    
    11 0 background   sa 0 master TASK MANAGER    
    12 0 background   sa 0 master TASK MANAGER    
    13 0 background   sa 0 master TASK MANAGER    
    53 0 runnable MHBLOVEWHY\Administrator MHBLOVEWHY       0 master SELECT 
    这段结果说明什么?请指教
      

  6.   

    sp_who
    提供关于当前 Microsoft® SQL Server™ 用户和进程的信息。可以筛选返回的信息,以便只返回那些不是空闲的进程。语法
    sp_who [[@login_name =] 'login']参数
    [@login_name =] 'login'是 SQL Server 上的用户登录名。login 的数据类型为 sysname,默认值是 NULL。如果没有指定名称,过程将报告全部活动的 SQL Server 用户。login 也可以是特定进程标识号码 (SPID)。若要返回有关活动进程的信息,请指定 ACTIVE。ACTIVE 从报告中排除等待用户下一个命令的进程。返回代码值
    0(成功)或 1(失败)结果集
    sp_who 返回包含以下信息的结果集。 列 数据类型 描述 
    spid smallint 系统进程 ID。 
    ecid smallint 与指定 SPID 相关联的给定线程的执行上下文 ID。 
    ECID = {0, 1, 2, 3, ...n},其中 0 始终表示主或父线程,并且 {1, 2, 3, ...n} 表示子线程。
     
    status nchar(30) 进程状态。 
    loginame nchar(128) 与特定进程相关联的登录名。 
    hostname nchar(128) 每个进程的主机或计算机名。 
    blk char(5) 如果存在阻塞进程,则是该阻塞进程的系统进程 ID。否则该列为零。 
    当与给定的 spid 相关联的事务受到孤立分布式事务的阻塞时,该列将对阻塞孤立事务返回 '-2'。
     
    dbname nchar(128) 进程使用的数据库。 
    cmd nchar(16) 为此进程执行的 SQL Server 命令(Transact-SQL 语句、SQL Server 内部引擎处理等)。 
    sp_who 结果集将根据 spid 值按升序排序。如果是并行处理,则会为特定的 spid 创建子线程。主线程表示为 spid =xxx,并且 ecid =0。其余的子线程同样也是 spid = xxx,但 ecid > 0。这样,将会为该 spid 编号返回多行 — 它们在整个列表中放置该 spid 的位置组合在一起。子线程将随机排列,但父线程除外 (ecid = 0);在该 spid 中,父线程被首先列出。注释
    阻塞进程(可能含有排它锁)是控制其它进程所需要的资源的进程。在 SQL Server 2000 中,所有孤立 DTC 事务的 SPID 都被赋予值 '-2'。孤立 DTC 事务就是不与任何 SPID 相关联的分布式事务。这样,当某一孤立事务阻塞其它进程时,可由其特殊的 '-2' SPID 值来识别该孤立分布式事务。有关更多信息,请参见 KILL。SQL Server 2000 保留从 1 到 50 的 SPID 值以便内部使用,而 51 或更大的 SPID 值则代表用户会话。权限
    执行权限默认授予 public 角色。示例
    A. 列出全部当前进程
    此示例使用没有参数的 sp_who 报告所有当前用户。 USE master
    EXEC sp_who下面是结果集:spid ecid status     loginame       hostname  blk dbname cmd                  
    ---- ---- ------     ------------   --------  --- ------ -----                
    1    0    background sa                       0   pubs   LAZY WRITER          
    2    0    sleeping   sa                       0   pubs   LOG WRITER           
    3    0    background sa                       0   master SIGNAL HANDLER       
    4    0    background sa                       0   pubs   RA MANAGER           
    5    0    background sa                       0   master TASK MANAGER         
    6    0    sleeping   sa                       0   pubs   CHECKPOINT SLEEP     
    7    0    background sa                       0   master TASK MANAGER         
    8    0    background sa                       0   master TASK MANAGER         
    9    0    background sa                       0   master TASK MANAGER         
    10   0    background sa                       0   master TASK MANAGER         
    11   0    background sa                       0   master TASK MANAGER         
    51   0    runnable   DOMAIN\loginX  serverX   0   Nwind  BACKUP DATABASE      
    51   2    runnable   DOMAIN\loginX  serverX   0   Nwind  BACKUP DATABASE      
    51   1    runnable   DOMAIN\loginX  serverX   0   Nwind  BACKUP DATABASE      
    52   0    sleeping   DOMAIN\loginX  serverX   0   master AWAITING COMMAND     
    53   0    runnable   DOMAIN\loginX  serverX   0   pubs   SELECT               
    (16 row(s) affected)B. 列出特定用户的进程
    此示例显示如何通过登录名查看有关单个当前用户的信息。USE master
    EXEC sp_who 'janetl'C. 显示所有活动进程
    USE master
    EXEC sp_who 'active'D. 通过进程 ID 显示特定进程
    USE master
    EXEC sp_who '10' --specifies the process_id
      

  7.   

    use 数据库
    --再执行?
      

  8.   

    你只是配置了连接池,可能你的数据库在DAO层的操作并没有做关闭操作(没有手动的关闭操作,也可以选择Spring的事务管理进行配置)。另外,说明下,连接池本身不会马上释放连接,连接没有马上释放造成了你的问题。我想应该是这样。