2008年9月小记(数字辅助表,Linq随机序列,Row_number分页,查看w3wp.exe进程,chkdsk,IIS7错误跳转,JS随机数,永久重定向,占用资源的释放,ReaderWriterLockSlim,Session过期时间)

1、参考<<T-SQL查询>>创建使用数字辅助表,能方便高效地进行查询操作。

Create   FUNCTION   [ dbo ] . [ cjb_fn_nums ]
(    
    
@n   bigint
)
RETURNS   TABLE  
AS
RETURN  
(
    
with
    L0 
as ( select   1   as  c  union   all   select   1 ),
    L1 
as ( select   1   as  c  from  L0  as  A, L0  as  B),
    L2 
as ( select   1   as  c  from  L1  as  A, L1  as  B),
    L3 
as ( select   1   as  c  from  L2  as  A, L2  as  B),
    L4 
as ( select   1   as  c  from  L3  as  A, L3  as  B),
    L5 
as ( select   1   as  c  from  L4  as  A, L4  as  B),
    Nums 
as ( select  row_number()  over ( order   by  c)  as  n  from  L5)
    
select  n  from  Nums  where  n  <=   @n
)

 

 

2、应用Linq和Random转换随机序列。
先看一下这个例子:

            List < string >  list  =   new  List < string > () {  " a " " b " " c " " d " " e " " f " " g " " h " " i " " j "  };
            List
< string >  randList  =   new  List < string > ();
            
if  (list.Count  >   0 )
            {
                
while  ( true )
                {
                    Random rand 
=   new  Random();
                    var randomSeq 
=  Enumerable.Repeat( 0 100 ).Select(r  =>  rand.Next(list.Count)).Distinct();
                    
foreach  (var i  in  randomSeq)
                    {
                        
if  ( ! randList.Contains(list[i]))
                            randList.Add(list[i]);
                    }
                    
if  (randList.Count >=  list.Count)
                        
break ;
                }
            }

通过Enumerable.Repeat(0, 100).Select(r => rand.Next(list.Count))方法可以每次产生100个最大不大于list.Count的整形序列,然后通过Distinct()排除掉重复值,避免重复遍历随机索引,因为有了Linq的延迟特性,序列可以保证其随机性,不需要进行这样的操作
Random random = new Random(DateTime.Now.Millisecond);
Thread.Sleep(1);
通过控制Repeat(0, N)中的N值还可以减少偱环的次数,提高性能。

 

3、使用Row_number()进行数据分页:

     -- 创建表
     if   OBJECT_ID ( ' dbo.tb0904 ' is   not   null
        
drop   table   dbo.tb0904
    
create   table  dbo.tb0904
    (
        id 
int   identity ( 1 , 1 primary   key ,
        userName 
nvarchar ( 20 not   null ,
        userPWD 
nvarchar ( 20 not   null ,
        userEmail 
nvarchar ( 40 null
    )
    
-- 插入数据
     set   identity_insert  tb0904  on  
    
declare   @count   int ;
    
set   @count = 1 ;
    
while ( @count <= 2000 )
    
begin
        
insert   into  dbo.tb0904(id,userName,userPWD,userEmail)  values ( @count ' billchen ' ' 123 ' ' [email protected] ' );
        
set   @count = @count + 1 ;
    
end
    
set   identity_insert  tb0904  off

    
-- 使用Row_number()分页
     declare   @pageIndex   int   =   10 @pageSize   int   =   20 ;
    
select   *   from  (
        
select   * , ROW_NUMBER()  over ( order   by  id  asc as  IDRank  from  dbo.tb0904)  as  ID_RowNumber
        
where  IDRank > @pageSize * @pageIndex   and  IDRank < @pageSize * ( @pageIndex + 1 )

    
-- 删除临时表
     -- drop table dbo.tb0904


4、如何查看w3wp进程

我们在对网站进行性能调试时经常需要查看Windows任务管理器中的性能查看cpu的占有率,但是在服务器上存在有多个网站时,就会出现多个w3wp.exe进程,或者一个网站设置了多web园后也会出现多个w3wp,其中的不同就是pid,如何知道哪个pid对应哪个网站了,其实很简单,看如下方法:

对于Windows2003服务器可用 iisapp -a

对于Windows2008服务器可用 %windir%/system32/inetsrv/appcmd list wp

 

5、使用 chkdsk d: 校验磁盘。

6、如何为IIS7定制错误跳转页。

项目中用户头像原来是在aspx页面中读取用户上传的jpg头像进行动态输出的,但是出于性能的问题,现在需要修改为直接显示jpg图片,这样就不需要通过asp.net进行托管,提高一点性能,但是现在的一个问题就是如果用户没有上传头像就会出现404错误,但实际上是要求显示一个默认头像的,所以有必要修改IIS7的定制错误页,让它指定一个aspx页面如"noimg_default.aspx",然后在aspx页面中加载默认的头像进行输出。

Code

剩下的工作就是如何设置IIS的问题了,对于IIS6就很容易设置,对于IIS7需要注意一个细节就行了。

#Features View --> 404 --> Eidt Custom Error Page --> Execute a URL on this site --> URL --> "/noimg_default.aspx"
#Features View --> 404 --> Edit Pages Settings -->Custom error pages

7、JS获取随机数。
alert(Math.round(Math.random()*10000))

8、永久重定向301。

         // 永久重定向
        Response.StatusCode  =   301 ;
        Response.Status 
=   " 301 Moved Permanently " ;
        Response.RedirectLocation 
=   " http://avatar2.profile.csdn.net/1/C/5/1_billok.jpg " ;
        Response.End();

9、对高开消资源的释放在高访量的情况之下十分重要,虽然是编程中的一个小问题,但是一旦把它放大了就很明显,所以平时写代码时要时刻注意资源的释放的问题。对于实现了IDisposable接口的类必须使用using或者try{}finally{obj.Dispose();}来释放资源,然后对于实现了Close()、Clear()、Abort()方法的类在使用完毕也要及时释放,以下为一些例子:
#释放资源_例子1

             // 发出请求
            HttpWebRequest request  =  (HttpWebRequest)HttpWebRequest.Create(url);
            request.Timeout 
=  RequestTimeout;

            
string  content  =   null ;
            
try
            {
                
// throw new WebException("测试"); // 测试
                 using  (HttpWebResponse response  =  (HttpWebResponse)request.GetResponse())
                {
                    
if  (response.StatusCode  ==  HttpStatusCode.OK)
                    {
                        
using  (Stream stream  =  response.GetResponseStream())
                        {
                            
using  (StreamReader reader  =   new  StreamReader(stream, Encoding.UTF8))
                            {
                                content 
=  reader.ReadToEnd();
                                reader.Close();
                            }
                            stream.Close();
                        }
                    }
                    response.Close();
                }
            }
            
catch  (System.Net.WebException)
            {
                
// TODO:考虑在此添加超时异常的日志
            }
            
finally
            {
                
if  (request  !=   null )
                {
                    request.Abort();
                    request 
=   null ;
                }
            }

#释放资源_例子2

         private   static   string  MakeAvatarPath( string  userName)
        {
            userName 
=  userName.ToLower();
            
string  x;
            
using  (System.Security.Cryptography.MD5CryptoServiceProvider md5  =
                      new  System.Security.Cryptography.MD5CryptoServiceProvider())
            {
                
byte [] ori  =  System.Text.Encoding.UTF8.GetBytes(userName);
                
byte [] buf  =  md5.ComputeHash(ori);
                x 
=  BitConverter.ToString(buf).Replace( " - " string .Empty);
                x 
=   " / "   +  x[ 0 +   " / "   +  x[ 1 +   " / "   +  x[ 2 +   " / " ;
                md5.Clear();
            }
            
return  x;
        }

 

10、ReaderWriterLockSlim

 

用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问。它的性能明显优于ReaderWriterLock,可与 lock 语句相当。锁定状态之间的转换已得到简化,从而使编程更容易并减少发生死锁的几率。新类支持递归,可简化从 lock 和 ReaderWriterLock 的迁移。

#线程可以进入三种锁定模式:读取模式、写入模式和可升级的读取模式。

#可升级模式适用于线程通常读取受保护资源的内容,但在某些条件满足时可能需要写入的情况。使用可升级锁可以方便的从读锁中升级为写锁,而不需要进行切换,以增加损耗。

# 平时不要把ReaderWriterLockSlim的实例放到try{}块中,以减少性能损耗。

例如:

public   class  ReaderWriterLockSlimSample
{
    
private   static  ReaderWriterLockSlim rwLock  =   new  ReaderWriterLockSlim();

    
private   object  Get()
    {
        
object  obj  =   null ;
        
if  (rwLock.TryEnterReadLock( 100 ))
        {
            
try
            {
                
// 写操作
                obj  =   new   object ();
                
return  obj;
            }
            
finally
            {
                rwLock.ExitReadLock();
            }
        }
        
return   null ;
    }
    
private   void  Add()
    {
        
if  (rwLock.TryEnterWriteLock( 100 ))
        {
            
try
            {
                
// 写操作
            }
            
finally
            {
                rwLock.ExitWriteLock();
            }
        }
    }
    
public   void  Update()
    {
        
if  (rwLock.TryEnterUpgradeableReadLock( 100 ))
        {
            
try
            {
                
// 读操作
                rwLock.EnterWriteLock();
                
try
                {
                    
// 写操作
                }
                
finally
                {
                    rwLock.ExitWriteLock();
                }
            }
            
finally
            {
                rwLock.ExitUpgradeableReadLock();
            }
        }

    }
}

 

11、Session过期时间的设置。
#Web.config设置:

< system.web >
    
< sessionState  mode ="InProc"  timeout ="30" />
</ system.web >

#IIS设置:网站-->属性-->主目录-->配置-->选项-->会话超时

 

 

 

 

 

 

你可能感兴趣的:(row_number)