Nhibernate 的Session和Asp.net 的线程

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

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

InBlock.gif                
InBlock.gif                                
ExpandedBlockEnd.gif            }

None.gif            
else
ExpandedBlockStart.gifContractedBlock.gif            
dot.gif {
InBlock.gif                
return ValidateSn(snId,out balance,out useDay,out business);
ExpandedBlockEnd.gif            }

None.gif            
None.gif            
None.gif
None.gif        }

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

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

InBlock.gif
InBlock.gif    
InBlock.gif
ExpandedBlockEnd.gif            }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值