博文
一点一点学ASP.NET之基础概念——HttpHandler(2013-01-26 16:14:00)
摘要:概述
HttpHandler是一个HTTP请求的真正处理中心,也正是在这个HttpHandler容器中,ASP.NET Framework才真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。
IHttpHandler是什么
IHttpHandler定义了如果要实现一个HTTP请求的处理所必需实现的一些系统约定。HttpHandler与HttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系。
IHttpHandler如何处理HTTP请求
当一个HTTP请求经同HttpModule容器传递到HttpHandler容器中时,ASP.NET Framework会调用HttpHandler的ProcessRequest成员方法来对这个HTTP请求进行真正的处理。以一个ASPX页面为例,正是在这里一个ASPX页面才被系统处理解析,并将处理完成的结果继续经由HttpModule传递下去,直至到达客户端。
对于ASPX页面,ASP.NET Framework在默认情况下是交给System.Web.UI.PageHandlerFactory这个HttpHandlerFactory来处理的。所谓一个HttpHandlerFactory,所谓一个HttpHandlerFactory,是指当一个HTTP请求到达这个HttpHandler Factory时,HttpHandlerFactory会提供出一个HttpHandler容器,交由这个HttpHandler容器来处理这个HTTP请求。
一个HTTP请求都是最终交给一个HttpHandler容器中的ProcessRequest方法来处理的。
图1:ProcessRequest方法
一个简单的HttpHandler容器
通过实现IHttpHandler接口可以创建自定义HTTP处理程序,该接口只包含两个方法。通过调用IsReusable,IHttpHandlerFactory可以查询处理程序以确定......
js函数的几种写法 闭包概要(2013-01-26 15:58:00)
摘要:
最常见的:
Js代码
Js代码
function foo() {
alert('hi, js');
}
foo();
function foo() {
alert('hi, js');
}
foo();
用匿名函数:
Js代码
Js代码
var foo = function () {
alert('hi, js');
}
foo();
var foo = function () {
alert('hi, js');
}
foo();
改装一下,给调用的foo()加个括号:
Js代码
Js代码
var foo = function () {
alert('hi, js');
}
(foo)();
var foo = function () {
alert('hi, js');
}
(foo)();
干脆,连foo的定义也省掉------把foo赋值语句的等号右边的东东、直接替换掉刚才括起来的foo:
Js代码
Js代码
(function () {
......
学习Javascript闭包(Closure)(2013-01-26 15:06:00)
摘要:
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
下面就是我的学习笔记,对于Javascript初学者应该是很有用的。
一、变量的作用域
要理解闭包,首先必须理解Javascript特殊的变量作用域。
变量的作用域无非就是两种:全局变量和局部变量。
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
var n=999;
function f1(){
alert(n);
}
f1(); // 999
另一方面,在函数外部自然无法读取函数内的局部变量。
function f1(){
var n=999;
}
alert(n); // error
这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
function f1(){
n=999;
}
f1();
alert(n); // 999
二、如何从外部读取局部变量?
出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。
那就是在函数的内部,再定义一个函数。
function f1(){
var n=999;
function f2(){
alert(n); // 999
}
}
在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
......
[SQL SERVER][Performance]bcp vs BulkInse(2013-01-26 14:13:00)
摘要:在工作上如遇到大量匯入資料的需求,我常會建議客戶使用SSIS來處理,
但有些客戶偏偏就不喜歡使用SSIS(應該是懶的去熟悉新東西...XD),
anyway~SQL Server中,有bcp、BulkInsert 和OPENROWSET(BULK...) Statement這三種方法都支援平行匯入資料,
但人多時,往往就會有不同的聲音出現,一票人認為bcp比BulkInsert還快,
另一票人則認為BulkInsert比bcp快,我為了在command line和 tsql兩者之間取一,
便做了兩者匯入效能測試比較,結果!出乎我意料……
我先使用bcp匯出15萬筆資料,等等使用該資料來測試匯入效能(檔案編碼建議使用UTF-8)
bcp "select top 150000 ';'+case_chop from table"
queryout d:\srcdata.txt -c -U<loginid> -P<password> -S<server\instance>
建立目地資料表
create table mydata
(
serial int identity(1,1),
name varchar(50)
)
開始匯入資料(tsql)
declare @starttime time(7),
@endtime time(7),
@elaspedtime numeric(20,7);
set @starttime=getdate();
BULK INSERT mydata
......
SQL Server 优化性能的几个方面(2013-01-26 14:13:00)
摘要:
(一).数据库的设计
可以参看最近论坛上出现一个精华帖http://topic.csdn.net/u/20100415/10/a377d835-acbd-4815-8bcb-b367f88ac8b5.html?92227
数据库设计包含物理设计和逻辑设计:
物理设计上可以通过使用RAID硬件架构。
简单说下使用策略:
a.RAID0可以用在只读的数据库数据表,或者是经过复制过来的数据库上,如果你对数据丢失不敏感的话也可以使用,总之这个level下是高性能无冗余;
b.RAID 5 与RAID1 不同之处就是多了奇偶校验,所有的奇偶校验的信息会遍布各个磁盘,性能上要比RAID1高些,但是一旦发生磁盘I/O失败,就会造成性能急剧下降,同时这种方法也在RAID0 与RAID1间折了中,是比较通用的做法。
c.RAID 10 就是RAID0 与 RAID1的组合,它提供了高性能,高可用性,性能上要比RAID5好,特别适合大量写入的应用程序,但是就是成本比较高无论是多少块磁盘你都是将损失一半的磁盘存储
逻辑设计上可以通过使用数据库的一些组件比如表、约束等,在这里首先提下文件组的使用。当你经费不足,无法购买一个完整的RAID系统的时候,你可以考虑文件组。
文件和文件组体系结构一些小节:http://blog.csdn.net/feixianxxx/archive/2010/01/28/5267290.aspx
它的原理就是多硬盘同时读取,减少磁盘空间争夺,提高读取效率。
我在这再稍微说几点:
a.范式和数据表的分割和合并
我们在设计数据库的时候一般会追求规范,一般会至少达到3NF.在这之后,也许会因为表中某些经常用于存储查询的字段而把它们从表中分割,否则大量用户同时大量访问一个热门表,效率会变差。
当然有时候也会进行合并表的设计,这样可以用少量的冗余换来减少过多连接的运算。
触发器1_概念(2013-01-26 11:12:00)
摘要:
触发器的特征:
1、触发器是在对表进行增、删、改时,自动执行的存储过程。触发器常用于强制业务规则,它是一种高级约束,通过事件进行触发而被执行。
2、触发器是一个特殊的事务单元,可以引用其他表中的列执行特殊的业务规则或数据逻辑关系。当出现错误时,可以执行rollback transaction操作将整个触发器以及触发它的T-SQL语句一并回滚(不需显示声明begin transaction)。
3、每个触发器将用到的两个临时表:
deleted 临时表:用于临时存放被删除的记录行副本(包括delete和update语句所影响的数据行);
注意:被删除的记录行,首先从原始表中删除,并保存到触发器表。然后从触发器表中删除,再保存到deleted表。
inserted临时表:用于临时存放插入的记录行副本(包括insert和update语句所影响的数据行);
deleted表和inserted表的特征:
> 这两个表的表结构与该触发器作用的表相同;
> 这两个表是逻辑表,并且由系统管理;
> 这两个表是动态驻留在内存中的(不是存储在数据库中),当触发器工作完成后,它们也被删除;
> 这两个表是只读的,即只能运用select语句查看(用户不能直接更改);
4、所创建的触发器(insert、delete、update)是在原表数据行已经修改完成后再触发。所以,触发器是在约束检查之后才执行。
什么时候使用触发器?
a、实现主外键关系所不能保证的复杂参......
Sql Server数据库触发器实例讲解(2013-01-26 10:56:00)
摘要: 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
常见的触发器有三种:分别应用于Insert , Update , Delete 事件。(SQL Server 2000定义了新的触发器,这里不提)
我为什么要使用触发器?比如,这么两个表:
Create Table Student( --学生表
StudentID int primary key, --学号
....
)
Create Table BorrowRecord( --学生借书记录表
BorrowRecord int identity(1,1), --流水号
StudentID int , &nbs......
线程同步能避免出现“race conditions”(竞争条件)和“data c(2013-01-26 09:24:00)
摘要:
线程同步能避免出现“race conditions”(竞争条件)和“data corruption”(数据破坏)的情况。
同步(synchronous)与异步(asynchronous)的定义:
当程序1调用程序2时,程序1停下不动,直到程序2完成回到程序1来,程序1才继续下去,这就是“同步”。
如果程序1调用程序2后,径自继续自己的下一个动作,那么两者之间就是“异步”。
Win32 API 中的SendMessage()是同步行为,而PostMessage()是异步行为。
win32中关于进程和线程的协调工作是由同步机制来完成的。同步机制相当于线程之间的红绿灯。
-----Critical Sections(关键区域、临界区域)
win32中最容易使用的同步机制就是critical sections.所谓critical sections意指一小块“用来处理一份被共享之资源
”的程序代码。这里的资源并不是来着.RES的Windows资源,而是广义地指一块内存、一个数据结构、一个文件,或任何其
他具有“使用之排他性”的东西。
为了防止问题的发生,一次只能有一个线程获准进入critical section中。实施的方式就是在程序中加上“进入”或“离
开”critical section的操作。
在win32中可以为一个需要保护的资源声明一个CRITICAL_SECTION类型的变量。这个变量扮演红绿灯的角色。
Critical section 并不是核心对象,没有handle这样的东西,它和核心对象不同,不存在进程的内存空间。你应该将一个
类型为CRITICAL_SECTION的局部变量初始化,方法是调用InitializeCriticalSection();
VOID InitializeCriticalSection(
LPCRITICAL_SECTION lpCriticalSection // critical section 一个指针,指向欲初始化的CRITICAL_SECTION变量
);
......
c#中的非托管资源释放 (Finalize和Dispose)(2013-01-25 16:55:00)
摘要:
在了解Finalize和Dispose之前,我们需要了解两个概念,一个是托管资源,一个非委托资源。
a.其中托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的对象,作用域内的变量等。
b.而非托管资源是CLR不能控制或者管理的部分,这些资源有很多,比如文件流,数据库的连接,系统的窗口句柄,打印机资源等等……这些资源一般情况下不存在于Heap(内存中用于存储对象实例的地方)中。
.Net平台中,CLR为程序员提供了一种很好的内存管理机制,使得程序员在编写代码时不需要显式的去释放自己使用的内存资源(这些在先前C和C++中是需要程序员自己去显式的释放的)。这种管理机制称为GC(garbage collection)。GC的作用是很明显的,当系统内存资源匮乏时,它就会被激发,然后自动的去释放那些没有被使用的托管资源(也就是程序员没有显式释放的对象)。
但正如上面说的,CLR的GC功能也只能释放托管资源,对于非托管资源例如窗口,文件和网络连接等,它都只能跟踪非托管资源的生存期,而不知道如何去释放它。这样就会出现当资源用尽时就不能提供资源能够提供的服务,windows的运行速度就会变慢。这样的情况会出现在数据库的连接当中,当你没有显式的释放一个数据库资源时,如果还是不断的申请数据库资源,那么到一定时候程序就会抛出一个异常。
所以,当我们在类中封装了对非托管资源的操作时,我们就需要显式,或者是隐式的释放这些资源。而上面提到的Finalize和Dispose方法分别就是隐式和显式操作中分别使用到的方法。
Finalize一般情况下用于基类不带close方法或者不带Dispose显式方法的类,也就是说,在Finalize过程中我们需要隐式的去实现非托管资源的释放,然后系统会在Finalize过程完成后,自己的去释放托管资源。
如果要实现Dispose方法,可以通过实现IDisposable接口,这样用户在使用这个类的同时就可以显示的执行Dispose方法,释放资源。
以下是MSDN上提出的Finalize和Dispose方法的使用指南,如果你的类遵循这个标准的话,你写出的类在.Net平台上就是一个“良民”。
Final......
关于数据库事务、隔离级别、锁的理解与整理(2013-01-23 21:39:00)
摘要:
事务(Transaction)
数据库的事务是数据库并发控制的基本单位,一组操作的集合、序列。要么都执行,要么都不执行,是一个不可分割的整体。比如银行的转账,钱从一个账户转移到另一个账户,账户A扣钱账户B加钱,要么都执行,要么都不执行。不可能A扣了钱B没有加钱,也不可能A没扣钱B却加了钱。
数据库的事务应当具有以下四种特性:
Atomic(原子性)
事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。
Consistency(一致性)
只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。
Isolation(隔离性)
事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。
同时,并行事务的修改必须与其他并行事务的修改相互独立。
事务的隔离性一般由事务的锁来进行控制。
Durability(持久性)
事务结束后,事务处理的结果必须能够得到固化。
数据库的事务和程序的线程有相似的地方:
1.线程之间共享同一片资源,而事务共享的则是数据库内的数据。
2.多线程的意义在于并发执行,提高效率;事务并发执行也能提高程序与数据库交互的效率。
因此如何使用事务与事务相互之间的隔离级别,直接影响了数据库的并发性和数据的准确性。我们在设计事务和选择隔离级别时这些是应该要考虑的。
选择完隔离级别与设计完事务之后,在使用过程中常常会遇到以下几种情况:
1.更新丢失(Lost update):两个事务同时更新,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。
2.脏读(Dirty Reads):一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险的,因为很可能所有的操作都被回滚。
3.不可重复读取(Non-repeatable Reads):一个事务两次读取,但在第二次读取前另一事务已经更新了。
4.虚读(Phantom Reads):一个事务两次读取,第二次读取到了另一事务插入的数据。
5.两次更新问题(Seco......