首页 新闻 赞助 找找看

谁能帮我解决这个问题 我就发五十块钱红包!!!

0
悬赏园豆:5 [已解决问题] 解决于 2016-03-19 17:33
private readonly object _thislock = new object();
        /// <summary>
        /// 
        /// </summary>
        /// <param name="HdlLevel"></param>
        /// <param name="HdlPersonDep">检查人</param>
        /// <param name="ApprovalType"></param>
        /// <param name="HdlResponsibleDep"></param>
        /// <returns></returns>
public POCO.SysMang.AplStrate GetAplStrateInHdlLevelAndHdlPersonDep(long? HdlLevel, string HdlPersonDep, long ApprovalType, long HdlResponsibleDep)
        {
            lock (_thislock)
            {
                long dengji = 0;
                //获得字典级别对应的关系
                string LevelRl = CommonUtils.ConstObj.HdlLevelAndApprovalLevel;
                string[] LevelStrA = LevelRl.Split(';');
                lock (LevelStrA)
                {
                    foreach (string strA in LevelStrA)
                    {
                        if (HdlLevel != null && strA.Split(',')[0] == HdlLevel.Value.ToString())
                        {
                            if (strA.Split(',').Length > 1)
                            {
                                bool typ = long.TryParse(strA.Split(',')[1], out dengji);
                                if (!typ)
                                {
                                    dengji = CommonUtils.ConstObj.ApprovalLevelC;
                                }
                            }
                        }
                    }
                }
                POCO.BaseInfo.DepMang newdep = new DepMang();
                if (!string.IsNullOrEmpty(HdlPersonDep))
                {
                    string[] HdlPersonDepAll = HdlPersonDep.Split(',');
                    lock (newdep)
                    {
                        if (HdlPersonDepAll.Length == 1)
                        {
                            if (HdlPersonDepAll[0] != null)
                            {
                                newdep = cmsMipBaseObjImp.Get<POCO.BaseInfo.DepMang, long>(Convert.ToInt64(HdlPersonDepAll[0]));
                            }

                        }
                        if (HdlPersonDepAll.Length > 1)
                        {
                            //newdep = GetFunBaseDepMang(depMang);
                            //获得部门中那个最短的部门
                            IList<POCO.BaseInfo.DepMang> GList = new List<POCO.BaseInfo.DepMang>();

                            foreach (string var in HdlPersonDepAll)
                            {
                                POCO.BaseInfo.DepMang one =
                                    cmsMipBaseObjImp.Get<POCO.BaseInfo.DepMang, long>(Convert.ToInt64(var));
                                GList.Add(one);
                            }
                            if (GList.Count > 0)
                            {
                                IList<POCO.BaseInfo.DepMang> Alist =
                                    GList.OrderByDescending(m => m.DepCode.Length).ToList();
                                newdep = Alist[0];
                            }
                        }
                    }
                    lock (newdep)
                    {
                        if (newdep != null)
                        {
                            POCO.SysMang.AplStrate strates = new AplStrate();
                            if (newdep.EntityDepMangByTopDepId.DepLevel == 113008)
                            {
                                strates = FunJituanAplStrate(dengji, newdep, ApprovalType, HdlResponsibleDep);
                            }
                            else
                            {
                                strates = FunAplStrate(dengji, newdep, ApprovalType, HdlResponsibleDep);
                            }
                            if (strates == null)
                            {
                                string hql = "from AplStrate where ";
                                if (dengji != 0)
                                    hql += "ApprovalLevel = " + dengji + " and ";
                                if (newdep.DepLevel == CommonUtils.ConstObj.DepLevelJiTuan)
                                {
                                    hql += "ApprovalMain=" + CommonUtils.ConstObj.ApprovalZhuTiJiTuan;
                                }
                                else if (newdep.DepLevel == CommonUtils.ConstObj.DepLevelKuang)
                                {
                                    hql += "ApprovalMain=" + CommonUtils.ConstObj.ApprovalZhuTiKuang;
                                }
                                else
                                {
                                    POCO.BaseInfo.DepMang topdep = cmsMipDepMangLogic.GetTopDepMang(newdep);
                                    if (topdep.DepLevel == CommonUtils.ConstObj.DepLevelJiTuan)
                                        hql += "ApprovalMain=" + CommonUtils.ConstObj.ApprovalZhuTiJiTuan;
                                    else if (topdep.DepLevel == CommonUtils.ConstObj.DepLevelKuang)
                                        hql += "ApprovalMain=" + CommonUtils.ConstObj.ApprovalZhuTiKuang;
                                    else
                                        hql += "ApprovalMain=" + CommonUtils.ConstObj.ApprovalZhuTiJiTuan;
                                }
                                hql += " and ApprovalType=" + ApprovalType + "and ApprovalDep is null or ApprovalDep=0";
                                POCO.SysMang.AplStrate aplStrate = cmsMipBaseObjImp.Find<POCO.SysMang.AplStrate>(hql, null);
                                return aplStrate;
                            }
                            else
                            {
                                return strates;
                            }
                        }
                    }
                }
                else
                {
                    string hql = "from AplStrate where ApprovalType=" + ApprovalType;
                    if (dengji != 0)
                    {
                        hql += " and  ApprovalLevel = " + dengji + " and ";
                    }
                    if (HdlResponsibleDep == 0)
                    {
                        hql += " and ApprovalDep is null or ApprovalDep=0 ";
                    }
                    else
                    {
                        hql += " and ApprovalDep=" + HdlResponsibleDep;
                    }
                    POCO.SysMang.AplStrate aplStrate = cmsMipBaseObjImp.Find<POCO.SysMang.AplStrate>(hql, null);
                    if (aplStrate == null)
                    {
                        string hqlA = "from AplStrate where ApprovalType=" + ApprovalType;
                        if (dengji != 0)
                        {
                            hqlA += " and  ApprovalLevel = " + dengji + " and ";
                        }
                        if (HdlResponsibleDep == 0)
                        {
                            hqlA += " and ApprovalDep is null or ApprovalDep=0 ";
                        }
                        else
                        {
                            POCO.BaseInfo.DepMang HdlResponsibleDepMang =
                                cmsMipBaseObjImp.Get<POCO.BaseInfo.DepMang, long>(HdlResponsibleDep);
                            lock (HdlResponsibleDepMang)
                            {
                                POCO.BaseInfo.DepMang HdlResponsibleTopDep =
                                    cmsMipDepMangLogic.GetTopDepMang(HdlResponsibleDepMang);
                                hqlA += " and ApprovalDep=" + HdlResponsibleTopDep.Id;
                            }
                        }
                        return cmsMipBaseObjImp.Find<POCO.SysMang.AplStrate>(hqlA, null);
                    }
                    return aplStrate;

                }
                return null;
            }
}

这段代码频繁报错 。。。。

Spring.Data.NHibernate.HibernateSystemException: could not load an entity: [HKTD.CMSMIP.POCO.BaseInfo.DepMang#1355] ---> System.IndexOutOfRangeException: 在复制内存时检测到可能的 I/O 争用条件。默认情况下,I/O 包不是线程安全的。在多线程应用程序中,必须以线程安全方式(如 TextReader 或 TextWriter 的 Synchronized 方法返回的线程安全包装)访问流。这也适用于 StreamWriter 和 StreamReader 这样的类。
   在 System.Buffer.InternalBlockCopy(Array src, Int32 srcOffsetBytes, Array dst, Int32 dstOffsetBytes, Int32 byteCount)
   在 System.IO.StreamWriter.Write(Char[] buffer, Int32 index, Int32 count)
   在 System.IO.TextWriter.WriteLine(String value)
   在 System.IO.TextWriter.SyncTextWriter.WriteLine(String value)
   在 NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)
   在 NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session)
   在 NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
   在 NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
   在 NHibernate.Loader.Loader.LoadEntity(ISessionImplementor session, Object id, IType identifierType, Object optionalObject, String optionalEntityName, Object optionalIdentifier, IEntityPersister persister)
   --- 内部异常堆栈跟踪的结尾 ---
   在 NHibernate.Loader.Loader.LoadEntity(ISessionImplementor session, Object id, IType identifierType, Object optionalObject, String optionalEntityName, Object optionalIdentifier, IEntityPersister persister)
   在 NHibernate.Loader.Entity.AbstractEntityLoader.Load(ISessionImplementor session, Object id, Object optionalObject, Object optionalId)
   在 NHibernate.Loader.Entity.AbstractEntityLoader.Load(Object id, Object optionalObject, ISessionImplementor session)
   在 NHibernate.Event.Default.DefaultLoadEventListener.LoadFromDatasource(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)
   在 NHibernate.Event.Default.DefaultLoadEventListener.Load(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)
   在 NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType)
   在 NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType)
   在 NHibernate.Impl.SessionImpl.Get(String entityName, Object id)
   在 NHibernate.Impl.SessionImpl.Get(Type entityClass, Object id)
   在 NHibernate.Impl.SessionImpl.Get[T](Object id)
   在 Spring.Data.NHibernate.Generic.HibernateTemplate.Execute[T](IHibernateCallback`1 action, Boolean exposeNativeSession)
   --- 内部异常堆栈跟踪的结尾 ---
   在 Spring.Data.NHibernate.Generic.HibernateTemplate.Execute[T](IHibernateCallback`1 action, Boolean exposeNativeSession)
   在 HKTD.PL.EnityNhibrenateDao.GetFromDb[T,TPk](TPk tpk, ConfigPara cp)
   在 HKTD.PL.EnityNhibrenateDao.GetMem[T,TPk](TPk tpk)
   在 HKTD.PL.EnityNhibrenateDao.Get[T,TPk](TPk tpk)
   在 CompositionAopProxy_49085370a10d4fa28184bad8969820a7.Get[T,Tpk](Tpk id)
   在 HKTD.CMSMIP.WORKFLOW.BLL.CmsMipAplStrateLogic.GetAplStrateInHdlLevelAndHdlPersonDep(Nullable`1 HdlLevel, String HdlPersonDep, Int64 ApprovalType, Int64 HdlResponsibleDep)
   在 HKTD.CMSMIP.WORKFLOW.BLL.CmsMipWorkFlowImp.GetAplStrateInHdlLevelAndHdlPersonDep(Nullable`1 HdlLevel, String HdlPersonDep, Int64 ApprovalType, Int64 HdlResponsibleDep)
   在 HKTD.CMSMIP.UniSvc.CmsMipWorkFlowLogic.GetAplStrateInHdlLevelAndHdlPersonDep(Nullable`1 HdlLevel, String HdlPersonDep, Int64 ApprovalType, Int64 HdlResponsibleDep)
   在 HKTD.CMSMIP.UI.Areas.SafeCheck.Models.CheckHdlRecordConvert.InsertRecoTestingAplStrate(CheckHdlRecord checkHdlRecord)
多罗贝勒的主页 多罗贝勒 | 初学一级 | 园豆:16
提问于:2016-03-04 11:12
< >
分享
最佳答案
0

这个我不是回复过你了么?你看下你堆栈

在 HKTD.PL.EnityNhibrenateDao.Get[T,TPk](TPk tpk) 在 CompositionAopProxy_49085370a10d4fa28184bad8969820a7.Get[T,Tpk](Tpk id) 在 HKTD.CMSMIP.WORKFLOW.BLL.CmsMipAplStrateLogic.GetAplStrateInHdlLevelAndHdlPersonDep(Nullable`1 HdlLevel, String HdlPersonDep, Int64 ApprovalType, Int64 HdlResponsibleDep)

这里很类似用到了单例

在 NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) 在 NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) 在 NHibernate.Loader.Loader.LoadEntity(ISessionImplementor session, Object id, IType identifierType, Object optionalObject, String optionalEntityName, Object optionalIdentifier, IEntityPersister persister)

这里一直在把session实例往里面传递。

反推过来这个ISessionImplementor就不是线程安全的啊,你要么在

HKTD.PL.EnityNhibrenateDao.Get[T,TPk](TPk tpk)这个方法里面每次去构建实例session对象,要么就把你当前这个方法的那个同步object申明为static

收获园豆:5
Daniel Cai | 专家六级 |园豆:10424 | 2016-03-04 14:01
其他回答(6)
0

代码太长,没有看太懂,不过你这里面为什么要用这么多lock,直接顶部一个lock不就已经保证了线程安全吗,我看你这里lock里面套lock

Rich.T | 园豆:3440 (老鸟四级) | 2016-03-04 11:25

lock 也是后来才加的,但是没有效果,还是报错。

支持(0) 反对(0) 多罗贝勒 | 园豆:16 (初学一级) | 2016-03-04 11:34

@多罗贝勒: 仔细看这里的报错,could not load an entity,想想为什么不能加载这个entity

支持(0) 反对(0) Rich.T | 园豆:3440 (老鸟四级) | 2016-03-04 11:36

@多罗贝勒: 一行一行代码排查,定位到哪行代码的问题,静下心来排查,总能解决的

支持(0) 反对(0) Rich.T | 园豆:3440 (老鸟四级) | 2016-03-04 11:39

@Rich.T: 我看他报的是线程访问时候复制内存出错。所以我就做了线程测试 ,也通过了。然后执行测试也通过了。但是发布之后还是报错。

支持(0) 反对(0) 多罗贝勒 | 园豆:16 (初学一级) | 2016-03-04 11:40
0

保留最外层的lock,里面try--catch异常到文本,重新发布,看看具体异常信息

jello chen | 园豆:7306 (大侠五级) | 2016-03-04 13:04
0

代码写得太烂

公羊天纵 | 园豆:203 (菜鸟二级) | 2016-03-04 13:35
0

听我说句有用的,这块代码你都研究这么久了,估计问题不是出在这里了,你现在好好研究下是不是服务器的问题

比如换一台服务器发布一下试试

刘宏玺 | 园豆:14020 (专家六级) | 2016-03-04 14:13
0

too long to see.

你加这么多lock是什么意思?lock只是用来处理临界资源。一般一个方法里面都只用一个,而且很少嵌套。

先去研究通lock,再把这个方法调整一下,如果太复杂了,可以拆分成几个方法。

gw2010 | 园豆:1487 (小虾三级) | 2016-03-04 15:27
0

代码太长,我实在是看不下去哈。而且大量sql拼接,你是要干嘛?先把代码优化下,问题就很容易暴露了~

命名空间全部写在代码了里,看着不心烦么。。。

幻天芒 | 园豆:37175 (高人七级) | 2016-03-05 09:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册