5月 31

打开命令提示工具

进入  Common7\ide目录

执行 devenv.exe /setup /resetuserdata /resetsettings

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE>devenv.exe /setu
p /resetuserdata /resetsettings

written by ocean

5月 31

下图展示的当前主流计算机性能指标数据。

从图上可以看到基本上每种设备都有两个指标:

延时(响应时间):表示硬件的突发处理能力;

带宽(吞吐量):代表硬件持续处理能力。

从上图可以看出,计算机系统硬件性能从高到代依次为:

CPU——Cache(L1-L2-L3)——内存——SSD硬盘——网络——硬盘

由于SSD硬盘还处于快速发展阶段,所以本文的内容不涉及SSD相关应用系统。

根据数据库知识,我们可以列出每种硬件主要的工作内容:

CPU及内存:缓存数据访问、比较、排序、事务检测、SQL解析、函数或逻辑运算;

网络:结果数据传输、SQL请求、远程数据库访问(dblink);

硬盘:数据访问、数据写入、日志记录、大数据量排序、大表连接。

根据当前计算机硬件的基本性能指标及其在数据库中主要操作内容,可以整理出如下图所示的性能基本优化法则:

这个优化法则归纳为5个层次:

1、减少数据访问(减少磁盘访问)

2、返回更少数据(减少网络传输或磁盘访问)

3、减少交互次数(减少网络传输)

4、减少服务器CPU开销(减少CPU及内存开销)

5、利用更多资源(增加资源)


索引

索引会大大增加表记录的DML(INSERT,UPDATE,DELETE)开销,正确的索引可以让性能提升100,1000倍以上,不合理的索引也可能会让性能下降100倍,因此在一个表中创建什么样的索引需要平衡各种业务需求。

我们一般在什么字段上建索引?

这是一个非常复杂的话题,需要对业务及数据充分分析后再能得出结果。主键及外键通常都要有索引,其它需要建索引的字段应满足以下条件:

1、字段出现在查询条件中,并且查询条件可以使用索引;

2、语句执行频率高,一天会有几千次以上;

3、通过字段条件可筛选的记录集很小,那数据筛选比例是多少才适合?

这个没有固定值,需要根据表数据量来评估,以下是经验公式,可用于快速评估:

小表(记录数小于10000行的表):筛选比例<10%

大表:(筛选返回记录数)<(表总记录数*单条记录长度)/10000/16

     单条记录长度≈字段平均内容长度之和+字段数*2


http://blog.csdn.net/yzsind/article/details/6059209

written by ocean

5月 29

在项目中引用using System.Transactions命名空间

在using中定义了一个TransactionScope,相当于定义了一个事务范围即这个事务作用域为using内。

程序执行了两个动作,一个insert,一个update,最后执行了scope.Complete();相当于提交事务

如果把scope.Complete();注释掉,我们会发现insert和update都被回滚了,因为在using作用域内,如果没有提交命令,那么scope在销毁时,会自动回滚所有的操作

此时在更新处加入断点

查询数据库发现

所以可以说明此时数据表是被锁定的

注意:需要启用MSDTC服务

连接字符串关键字(Enlist)
     SqlConnection.ConnectionString 属性支持关键字 Enlist,该关键字指示 System.Data.SqlClient 是否将检测事务上下文并自动在分布式事务中登记连接。 如果 Enlist=true,连接将自动在打开的线程的当前事务上下文中登记。 如果 Enlist=false,SqlClient 连接不会与分布式事务进行交互。 Enlist 的默认值为 true。 如果连接字符串中未指定 Enlist,若在连接打开时检测到一个,连接将自动在分布式事务中登记。

written by ocean

5月 29

SqlTransaction是System.Data.SqlClient命名空间下的一个事务类,

主要方法有Commit()和Rollback()两个函数

sqlConn.BeginTransaction()表示事务的开始,在执行一些基本操作后(代码是执行一个insert和一个update)后,

执行sqlTrans.Commit();表示事务提交

在第二个执行update的时候发生类型转化错误

catch的地方用Rollback回滚,第一条添加的数据也不见了

written by ocean

5月 29

“诱饵效应”是指人们对两个不相上下的选项进行选择时,因为第三个新选项(诱饵)的加入,会使某个选项显得更有吸引力。

卖场里的帽子和毛衣是摆放在一起的,标签上标出的价格分别是:帽子49元,毛衣299元。但是,令人惊讶的是,最后还有一行字:帽子+毛衣=299元。其实,商家是精明的,他了解人们的消费心理:人们每做一件事,每选择一样东西,都会加以对比,而越是有对比的东西就越能凸显价值。有了前两个单价的对比,后面的“买一送一”就显得更有吸引力了。人们身边还有许多这样的案例,比如手机套餐、网费套餐、电器促销等等。

http://baike.baidu.com/view/3914960.htm

written by ocean

5月 28

Q:什么是GAC?

A:GAC全称为:Global Assembly Cache(全局程序集缓存),在你的电脑系统盘:C:\Windows\assembly下,能够看到目前计算机上安装的GAC。

Q:GAC作用?

A:GAC的作用是可以存储一些有多个应用都要用到的公共的Assembly(程序集),例如System.Data、System.Windows.Forms等。这样,多个应用就可以从GAC中取得

Assembly,而不需要在所有应用中把要用到的Assembly都拷贝到应用程序的相关目录下面(比如:Windows应用程序的Debug目录,ASP.NET的bin目录)。

DEMO      

       举一个最简单的例子,很多初学.NET的开发人员进行数据访问都是从SqlHelper.cs开始的,SqlHelper是一个数据访问对象,提供对数据库操作的各种方法,名字大概是学从PetShop吧,样子大概是这个样子, 又或是这个样子,且不管长啥样,如果部署在服务器上的多个应用都使用此对象,那么基本上会有下面几种类似的处理方法:

(1)将此类直接拷贝到项目中使用;

(2)建一个类库项目,包含此类,然后编译为dll,再在应用中添加引用以使用此程序集中的SqlHelper;

(3)将(2)中的dll注册为GAC,直接在应用中使用,就像使用System.IO、System.Net一样 ;

 

当SqlHelper.cs更新后,对于(1)和(2)你可能会感觉到非常痛苦,因为要逐个应用去替换,而对于(3)则简单多了,只需要将编译后的dll重新注册到GAC就可以了。

 

记得在MSDN曾经看到过一句话,说是“.NET程序集解决了DLL Hell”的问题。

 

说这里,先说个故事:有一天,一个朋友的同事问我,“写过动态链接库吗?”, 我一时竟然没想起是什么,平常说dll太多了,几乎都忘记“动态链接库”这几个字了,不过还好,脑子里还有抹不去的记忆。

 

“.NET程序集解决了DLL Hell”关键一点就是相同名称而不同版本的程序集可以共存,打开Assembly所在目录,如:C:\Windows\assembly,看一下就比较清楚了。

 

可以思考一下,为什么同一系统中可以安装多个版本的.NET Framework、Visual Studio;而有些软件是不行的,只能存在唯一版本,大概就是这个道理。 

2、将DLL注册到GAC 

(1)创建DLL:新建一个类库项目,名称为GACDemo,再添加一个类,如:

 

 

右击项目,有菜单中选择属性,按如下操作生成强命名Key (GAC中的Assembly必须是strong-name的 )

 然后编译,之前我注册过一次,版本为1.0.0.0,编译之前,我将版本修改为了2.0.0.0。

(2)注册

2)注册

以管理员身份运行命令行

进入到类库项目的bin/debug目录,执行gacutil -if gacdemo.dll

查看 C:\Windows\assembly

 

两个版本并存。 

3、在ASP.NET中使用GAC 

这个就简单了,新建一个ASP.NET网站,添加引用,写如下测试代码

 

编译网站。

在IIS中发布网站:

VS2008直接右击项目发布网站。

VS2010右击网站点击发布,选择文件系统。

 

发布后的文件目录:

 

 

 

然后在IIS中发布网站(这里是IIS7):

 

 

 

然后浏览default.aspx,看到输出的结果是3。

 

转载地址:http://www.cnblogs.com/yhql/archive/2012/03/01/2375132.html

written by ocean

5月 28

     分散关注、松散耦合
逻辑复用、标准定义

——把变化的部分和不变化的部分隔离开。使得变化的部分发生变化时,不变部分不受影响。 

written by ocean

5月 28

     进程
     进程是操作系统用于隔离众多正在运行的应用程序的机制。在.Net之前,每一个应用程序被加载到单独的进程中,并为该进程指定私有的虚拟内存。进程不能直接访问物理内存,操作系统通过其它的处理把这些虚拟内存映射到物理内存或IO设备的某个区域,而这些物理内存之间不会有重叠,这就决定了一个进程不可能访问分配给另一个进程的内存。相应地,运行在该进程中的应用程序也不可能写入另一个应用程序的内存,这确保了任何执行出错的代码不会损害其地址空间以外的应用程序。在这种机制下,进程作为应用程序之间一个独立而安全的边界在很大程度上提高了运行安全。 

      进程的缺点是降低了性能。许多一起工作的进程需要相互通信,而进程却不能共享任何内存,你不能通过任何有意义的方式使用从一个进程传递到另一个进程的内存指针。此外,你不能在两个进程间进行直接调用。你必须代之以使用代理,它提供一定程度的间接性。虽然,使用动态连接库dll让所有的组件运行在同一空间,一定程度上可以提高性能,但这些组件相互影响,一个组件的错误将极有可能导致整个应用程序的崩溃,“dll地狱”更是让许多应用程序难以避免。

 

 

线程     
      线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。 
  线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 

  线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU.

 

 

应用程序域(AppDomain)
      在.Net中,应用程序有了一个新的边界:应用程序域(以下简称域)。它是一个用于隔离应用程序的虚拟边界。为了禁止不应交互的代码进行交互,这种隔离是必要的。.Net的应用程序在域层次上进行隔离,一个域中的应用程序不能直接访问另一个域中的代码和数据。这种隔离使得在一个应用程序范围内创建的所有对象都在一个域内创建,确保在同一进程中一个域内运行的代码不会影响其他域内的应用程序,大大提高了运行的安全。

.Net结构中,由于公共语言运行库能够验证代码是否为类型安全的代码,所以它可以提供与进程边界一样大的隔离级别,其性能开销也要低得多。你可以在单个进程中运行几个域,而不会造成进程间调用或切换等方面的额外开销。这种方法是把任何一个进程分解到多个域中,允许多个应用程序在同一进程中运行,每个域大致对应一个应用程序,运行的每个线程都在一个特殊的域中。如果不同的可执行文件都运行在同一个进程空间中,它们就能轻松地共享数据或直接访问彼此的数据。这种代码同运行同一个进程但域不同的类型安全代码一起运行时是安全的。在一个进程内运行多个应用程序的能力显著增强了服务器的可伸缩性。

域与线程的关系
      
在.Net中,线程是公共语言运行库用来执行代码的操作系统构造。在运行时,所有托管代码均加载到一个域中,由特定的操作系统线程来运行。然而,域和线程之间并不具有一一对应关系。在任意给定时间,单个域中可以执行不止一个线程,而且特定线程也并不局限在单个域内。也就是说,线程可以跨越域边界,不为每个域创建新线程。当然,在指定时刻,每一线程都只能在一个域中执行。运行库会跟踪所有域中有哪些线程正在运行。通过调用.Net类库的 Thread.GetDomain 方法,你还可以确定正在执行的线程所在的域。

written by ocean

5月 28

当执行  new B();的时候,执行结果

结论:先 new 父类的构造方法,然后才是子类的构造方法

written by ocean

5月 28

ps     查阅系统上面正在运作当中的程序

top -d 2     也是个挺不错的程序观察工具!但不同于 ps 是静态的结果输出, top 这个程序可以持续的监测 (monitor) 整个系统的程序工作状态,每2秒更新一次

q     退出

pstree -A 展示程序的相关性

 

kill

killall

 

free -m   查看内存的使用情况

 

written by ocean