• 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设置:网站-->属性-->主目录-->配置-->选项-->会话超时

  • 相关阅读:
    星辰小队针对于软件“星遇”的10天冲刺——第8天
    星辰小队针对于软件“星遇”的10天冲刺——第7天
    周周总结——时时更新(第4学期,第11周)
    星辰小队针对于软件“星遇”的10天冲刺——第6天
    星辰小队针对于软件“星遇”的10天冲刺——第5天
    对于文章的字母、单词、短语,(无用词表)的检索Java代码实现
    星辰小队针对于软件“星遇”的10天冲刺——第4天
    图片保存到相册
    心情不好
    NSString和data转换
  • 原文地址:https://www.cnblogs.com/chenjunbiao/p/1760200.html
Copyright © 2020-2023  润新知