WEB应用系统时常在使用几天出现后台数据库无法访问,导致应用系统无法使用;

sxl_88 2017-04-20 04:57:24
有一个经常使用中的WEB应用系统,在使用几天后就出现系统无法访问的现象。打开该系统的某个页面时报如下错误:
页面访问时发生错误: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object

然后自己发现后台数据库无法登录,而且手工重启数据库服务也无法正常启动数据库服务(在手工重启数据库服务时报错),必须手工重启数据库的操作系统后才可以正常访问数据库。

用SQL SERVER Profiler 来查找原因,想看看是程序中那段代码导致数据库死锁最后直数据库服务挂掉。
想使用SQL SERVER Profiler来监测JAVA程序中访问数据库有问题的代码,想根据监控的结果来优化下JAVA的代码后再看看数据库的运行的情况。

请问,如何使用SQL SERVER Profiler来处理该问题或还有其它办法解决此问题吗?谢谢各位!


WEB应用系统的结构如下:
JAVA(SSH架构)+SQLSERVER2008数据库
...全文
577 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2017-05-19
  • 打赏
  • 举报
回复
能看到引起死锁的语句吗?
sxl_88 2017-05-19
  • 打赏
  • 举报
回复
。。。。。。。。
sxl_88 2017-05-03
  • 打赏
  • 举报
回复
能不能再请各位帮忙看看上面的问题,谢谢!
sxl_88 2017-04-21
  • 打赏
  • 举报
回复
引用 4 楼 sinat_28984567 的回复:
检测死锁
exec sp_who_lock
执行exec sp_who_lock 检测死锁的情况时如下情况: “进程号SPID:60被进程号SPID:60阻塞,其当前进程执行的SQL语法如下” 为什么会出现这种阻塞(进程自己阻塞自己的问题),过会再执行exec sp_who_lock 发现没有阻塞和死锁信息。请问这种情况如何解决? 而且目前该数据库中仍然有很多进程信息在运行,会不会将来运行一段时间后进程多了会将SQL SEVER数据库拖跨导致数据库无法访问出现上面的问题?附件图
二月十六 2017-04-20
  • 打赏
  • 举报
回复
试试这个存储过程
CREATE PROCEDURE sp_who_lock
AS
    BEGIN    
        DECLARE @spid INT    
        DECLARE @blk INT    
        DECLARE @count INT    
        DECLARE @index INT    
        DECLARE @lock TINYINT      
        SET @lock = 0      
        CREATE TABLE #temp_who_lock
            (
              id INT IDENTITY(1, 1) ,
              spid INT ,
              blk INT
            )      
        IF @@error <> 0
            RETURN @@error      
        INSERT  INTO #temp_who_lock
                ( spid ,
                  blk
                )
                SELECT  0 ,
                        blocked
                FROM    ( SELECT    *
                          FROM      master..sysprocesses
                          WHERE     blocked > 0
                        ) a
                WHERE   NOT EXISTS ( SELECT *
                                     FROM   master..sysprocesses
                                     WHERE  a.blocked = spid
                                            AND blocked > 0 )
                UNION
                SELECT  spid ,
                        blocked
                FROM    master..sysprocesses
                WHERE   blocked > 0      
        IF @@error <> 0
            RETURN @@error      
        SELECT  @count = COUNT(*) ,
                @index = 1
        FROM    #temp_who_lock      
        IF @@error <> 0
            RETURN @@error      
        IF @count = 0
            BEGIN    
                SELECT  '没有阻塞和死锁信息'    
                RETURN 0      
            END    
        WHILE @index <= @count
            BEGIN    
                IF EXISTS ( SELECT  1
                            FROM    #temp_who_lock a
                            WHERE   id > @index
                                    AND EXISTS ( SELECT 1
                                                 FROM   #temp_who_lock
                                                 WHERE  id <= @index
                                                        AND a.blk = spid ) )
                    BEGIN    
                        SET @lock = 1      
                        SELECT  @spid = spid ,
                                @blk = blk
                        FROM    #temp_who_lock
                        WHERE   id = @index    
                        SELECT  '引起数据库死锁的是: ' + CAST(@spid AS VARCHAR(10))
                                + '进程号,其执行的SQL语法如下'    
                        SELECT  @spid ,
                                @blk    
                        DBCC INPUTBUFFER(@spid)      
                        DBCC INPUTBUFFER(@blk)      
                    END    
                SET @index = @index + 1      
            END    
        IF @lock = 0
            BEGIN    
                SET @index = 1      
                WHILE @index <= @count
                    BEGIN    
                        SELECT  @spid = spid ,
                                @blk = blk
                        FROM    #temp_who_lock
                        WHERE   id = @index    
                        IF @spid = 0
                            SELECT  '引起阻塞的是:' + CAST(@blk AS VARCHAR(10))
                                    + '进程号,其执行的SQL语法如下'    
                        ELSE
                            SELECT  '进程号SPID:' + CAST(@spid AS VARCHAR(10))
                                    + '被' + '进程号SPID:'
                                    + CAST(@blk AS VARCHAR(10))
                                    + '阻塞,其当前进程执行的SQL语法如下'    
                        DBCC INPUTBUFFER(@spid)    
                        DBCC INPUTBUFFER(@blk)      
                        SET @index = @index + 1      
                    END    
            END    
        DROP TABLE #temp_who_lock      
        RETURN 0      
    END          
GO

检测死锁
exec sp_who_lock
sxl_88 2017-04-20
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
在死锁的时候可以先查询一下是哪个表死锁了
谢谢您的回复。还有一个问题,在死锁的时候,我怎么样查询哪个表死锁了呢?
sxl_88 2017-04-20
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
在死锁的时候可以先查询一下是哪个表死锁了
根本查询不了数据库,因为当发现应用系统无法使用时,其实数据库的服务已经挂了,如上面我的描述所示。 所以我才想用SQL SERVER Profiler 来检测程序,想看看相关的执行效果,然后逐一排查问题。 但是我不清楚SQL SERVER Profiler 可以做到检测查看相关程序中的SQL执行问题吗? 请各位帮忙看看此问题。
二月十六 2017-04-20
  • 打赏
  • 举报
回复
在死锁的时候可以先查询一下是哪个表死锁了

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧