首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

[系统出现重复的业务数据-困扰已久的有关问题,求解救啊

2013-06-19 
[系统出现重复的业务数据--困扰已久的问题,求解救啊!!!本帖最后由 zhlin118 于 2013-05-21 15:15:37 编辑

[系统出现重复的业务数据--困扰已久的问题,求解救啊!!!
本帖最后由 zhlin118 于 2013-05-21 15:15:37 编辑 系统使用几年,最近偶发性的在某一两个核心方法上会出现重复的结算记录(频率从原先1年几次到最近一个月几次),始终不知道问题出在哪里,我把数据库操作类贴出来,大家帮我分析一下,看看问题出在哪里~ 同事猜测是不是因为静态方法导致线程安全引起的?


    /// <summary>
    /// 业务逻辑基本操作类,实现对实体‘T’的基本操作(增、删、查、改、检查)
    /// </summary>
    public static class DBHelper
    {
        /// <summary>
        /// 新增(含事务)
        /// </summary>
        /// <typeparam name="T">Entities对象</typeparam>
        /// <param name="entity">将保存的实体</param>
        /// <returns>执行成功影响的行数,否则抛出异常</returns>
        public static int Insert<T>(T entity, DbTransaction trans) where T : Entity, new()
        {

            return ORMHelper.GetGateway(trans).Save<T>(entity, trans);

        }

        /// <summary>
        /// 根据实体修改(含事务)
        /// </summary>
        /// <typeparam name="T">Entities对象</typeparam>
        /// <param name="entity">将修改的实体</param>
        /// <returns>执行成功影响的行数,否则抛出异常</returns>
        public static int Update<T>(T entity, DbTransaction trans) where T : Entity, new()
        {

            ReflectionBase.SetValue(entity, "SyncTime", DateTime.Now);
            return ORMHelper.GetGateway(trans).Save<T>(entity, trans);

        }
}

//------------------------------------


    /// <summary>
    /// 数据访问层代理实现类
    /// </summary>
    public class ORMHelper
    {
        //连接池的最大值和最小值(默认为1)
        private const int MaxPool = 50;

        public static List<Connection> ConnectionList = new List<Connection>(MaxPool);

        public static Gateway GetGateway(DbTransaction trans)
        {
            Gateway gateway = null;
            foreach (Connection conn in ConnectionList)
            {


                if (conn.Tran == trans)
                {
                    gateway = conn.Conn;
                    conn.CallTime = DateTime.Now;
                    break;
                }
            }

            if (gateway == null)
            {
                if (ConnectionList.Count == MaxPool) throw new Exception("数据库连接池已满,请等待...");
                gateway = CreateGateway();
                ConnectionList.Add(new Connection(gateway, null, ConnectionList.Count.ToString()));
            }
            return gateway;
        }
}


[解决办法]
  public static List<Connection> ConnectionList = new List<Connection>(MaxPool);

这个代码很无聊。
Connection 本身就有自己的线程池,你又操那心自己又建一个。。

热点排行