dinghao

记录成长点滴

 

Nhibernate 的Session和Asp.net 的线程

有个问题困扰了好久:
同样的程序,有时成功有时失败,怀疑和ASP的线程有关系
程序:


        
public int Deposit(Guid AccountID, string sn)
        
{
            
decimal balance = 0;
            
int useDay = 0;
            
string business;
            Account account 
= 
                (Account)_coreRepository.GetObjectById(
typeof(Account),AccountID);
            Guid snId;
            GetSnID(sn,
out snId);//调用Hql
            if(ValidateSn(snId,out balance,out useDay,out business) == 0)//用到NH的HQL
            {
                    
//省略
                    
                    _coreRepository.UpdateObject(account);
                    SetOperateLog(
"DepositBySn",balance.ToString(),"","",account);//用到Save
                    return 0;


                }

                
                                
            }

            
else
            
{
                
return ValidateSn(snId,out balance,out useDay,out business);
            }

            
            

        }

_coreRespository的源代码我的Blog上有,封装了一些简单的CRUD操作
以上代码,昨天突然运行不正常,运行到GetSnID时出错。可是单独调用GetSnID能正常运行。怀疑是Session的问题,检查Corespoitory的封装,发现他没有在每次操作中关闭Session而是让HttpModuel来处理的。
可跟踪程序发现Session是Open的,因此与Session的OPen,Close 无关
现在改代码如下:
public int Deposit(Guid AccountID, string sn)
        
{
            
decimal balance = 0;
            
int useDay = 0;
            
string business;
            Account account 
= (Account)_coreRepository.GetObjectById(typeof(Account),AccountID);
            Guid snId;
            _coreRepository.CloseSession();
            _coreRepository.OpenSession();

            GetSnID(sn,
out snId);
            
if(ValidateSn(snId,out balance,out useDay,out business) == 0)
            
{
    _coreRepository.CloseSession();
                    _coreRepository.OpenSession();
                    ISession s 
= _coreRepository.ActiveSession;
                    s.Update(account);
                    s.Close();
                    
                    
                    
if(_coreRepository.ActiveSession.IsOpen == false)
                    
{
                        _coreRepository.OpenSession();
                    

                    }

                    SetOperateLog(
"DepositBySn",balance.ToString(),"","",account);
                    
//_coreRepository.CloseSession();
                    return 0;

                }


    

            }

能正常运行。
认为问题已经解决。
可是晚上再运行以前出问题的代码(第一段),竟然又能正常工作了。
因为Session不是线程安全的,怀疑和Asp的线程有关。
第二段能解决问题,应该是再每次函数调用中都用到了新的Session,而没有用旧的。
有高手指教一下??

posted on 2006-06-01 10:12  思无邪  阅读(701)  评论(2编辑  收藏  举报

导航