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(0100).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,1primary key,
        userName 
nvarchar(20not null,
        userPWD 
nvarchar(20not null,
        userEmail 
nvarchar(40null
    )
    
--插入数据
    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''c@c.net');
        
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 ascas 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设置:网站-->属性-->主目录-->配置-->选项-->会话超时

 

 

 

 

 

 

posted @ 2008-09-03 09:23  网际飞狐  阅读(835)  评论(0编辑  收藏  举报