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
protected void Page_Load(object sender, EventArgs e)
{
string url = Request.Url.ToString();
string mime = "image/x-icon";
string fileName = "noimg_default.ico";
if (!url.EndsWith(".ico"))
{
mime = "image/jpg";
fileName = string.Format("noimg_default_{0}.jpg", url.Substring(url.LastIndexOf('/') + 1, 1));
}
Response.ClearHeaders();
Response.AddHeader("Content-Type", mime);
Response.WriteFile(Server.MapPath(fileName));
}
剩下的工作就是如何设置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设置:网站-->属性-->主目录-->配置-->选项-->会话超时