一个由于数据库并发引起的错误,开发环境里一切都正常、运行环境里不稳定、发生莫名奇妙的错误...

前些日子在开发项目过程中发生了一个奇怪的问题:
   程序运行在我们自己的开发环境里都正常,不会出现错误,而且不只是我一个人的电脑,
是接近10个项目组开发人员的电脑上都是正常的,而且运行多久都不会出错,大家有接近
10个人都在并发访问数据库,都没出现异常。
   当后台管理程序同时运行,并发管理,也不会出现错误,比较奇怪的,发布到 WEB服务
器上,运行接近1天后程序就会发生错误,而且刚部署的时候,程序运行都正常,错误页面
如下:







有些蹊跷的是,我几乎不用DataReader,怎么会报这个错误呢?想了一两天都没
想明白是怎么回事。

过了一周我才想起来,很早以前,我改进设计模式、按我们以前的同事的要求,把
数据库联接进行了优化,做了单实例,唉,原来是按同事的要求作了单实例后,出
现了并发问题了,因为发布到服务器上,是几十个人同时使用,在自己的开发环境
里,单独用后台管理端是一个人用,单实例都不会出现错误。

惹事生非的单实例代码如下:
28171010_MYDd.gif 28171010_WPr4.gif Code
 1//------------------------------------------------------------
 2// All Rights Reserved , Copyright (C) 2009 , Jirisoft , Ltd. 
 3//------------------------------------------------------------
 4
 5using System;
 6using System.Reflection;
 7using System.Configuration;
 8
 9namespace DotNet.Common.DbUtilities
1028171010_WPr4.gif28171010_MYDd.gif{
11    using DotNet.Common.Utilities;
12
1328171010_GaH8.gif28171010_VFH9.gif    /**//// <summary>
14    /// DbHelperFactory
15    /// 数据库服务工厂。
16    /// 
17    /// 修改纪录
18    /// 
19    ///        2009.07.23 版本:1.2 JiRiGaLa 每次都获取一个新的数据库连接,解决并发错误问题。
20    ///        2008.09.23 版本:1.1 JiRiGaLa 优化改进为单实例模式。
21    ///        2008.08.26 版本:1.0 JiRiGaLa 创建数据库服务工厂。
22    /// 
23    /// 版本:1.2
24    /// 
25    /// <author>
26    ///        <name>JiRiGaLa</name>
27    ///        <date>2009.07.23</date>
28    /// </author> 
29    /// </summary>
30    public class DbHelperFactory
3128171010_GaH8.gif28171010_VFH9.gif    {
32        private static readonly string DbHelperAssmely = BaseConfiguration.Instance.DbHelperAssmely;
33        private static readonly string DbHelperClass = BaseConfiguration.Instance.DbHelperClass;
34        public static readonly string DbConnectionString = BaseConfiguration.Instance.DbConnectionString;
35
36        private static IDbHelper helper;
37        private static Object locker = new Object();
38
39        public static IDbHelper GetHelper()
4028171010_GaH8.gif28171010_VFH9.gif        {            
41            if (helper == null)
4228171010_GaH8.gif28171010_VFH9.gif            {
43                lock (locker)
4428171010_GaH8.gif28171010_VFH9.gif                {
45                    if (helper == null)
4628171010_GaH8.gif28171010_VFH9.gif                    {
47                        helper = (IDbHelper)Assembly.Load(DbHelperAssmely).CreateInstance(DbHelperClass, true);
48                    }
49                }
50            }
51            return helper;
52        }
53    }
54}

看看程序,想想并发、再看看错误信息,心里全部明白了,都是单实例惹得麻烦。
开发环境里有些错误是无法发现的,换个环境,换个角度测试,问题就暴露出来了。
程序不在于多,也不在于高超,只要运行稳定,维护方便,经得起考验才是好程序,
土一点儿笨一点儿并不是系统架构的关键问题,我们的客户大多都是非IT专业的,
他们图的是运行稳定高效的系统,他们并不关心技术的细节,懂技术的也不大愿意
花钱购买服务,自己折腾,自己开发了。



C:产品导读:
白话讲山寨SOA,少一些迷惑、多一些理解,你的程序架构SOA了吗?
疯狂.NET架构通用权限后台管理工具演示版2.0下载
疯狂.NET 通用权限设计 C\S后台管理,B\S前台调用源码样例程序源码下载之 --- 操作权限
疯狂.NET 通用权限设计 C\S后台管理,B\S前台调用源码样例程序源码下载之 --- 角色权限
疯狂.NET 通用权限设计 C\S后台管理,B\S前台调用源码样例程序源码下载之 --- 数据集权限



转载于:https://my.oschina.net/iwenr/blog/227677

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值