Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
一,下载:IOMeter http://www.iometer.org/
 
二,关键指标
IOPS(I/Os per second):即每秒输入输出次数。指的是系统在单位时间内能处理的最大的I/O频度;一般,OLTP应用涉及更多的频繁读写,更多的考虑IOPS;IOPS测试结果与很多测试参数和存储系统具体配置有关。IOPS还可以细分为100%顺序读(Sequential Read)IOPS、100%顺序写IOPS、100%随机读IOPS、100%随机写IOPS等,在同等情况下这四种IOPS中100%顺序读的IOPS最高。 
 
吞吐量(throughput):指的是单位时间内最大的I/O流量;每秒处理IO的大小,一些大量的顺序文件访问,更多考虑throughput指标。
 
三,IOOMeter界面使用
1,Topology:设置worker数,一般越多测试性能越好,设置好一个worker好,可通过标题栏进行复制,worker数会有一个顶点,到了之后,再增加worker,性能也不会有多大提升。
2,Disk Targets: Maximun Disk Size,为0时填充硬盘所有空间,此时可测出最真实数据,若不想填充全部,也要越大越好,几十上百个G。注意后面是扇区,一个扇区是512字节。
3,# of Outstanding I/O of Outstanding I/Os per target – 被选中worker的每个磁盘一次所允许的未处理的异步I/O的数量。越多测出的数字越大(到了一定量也不再随着增多而增大),它是用来给磁盘送数据的,设置越高,传数据越多。若是1的话,传一个块过去就不传了。
(注意:如果操作完成的非常快,磁盘实际看到的队列深度可能更少,默认值是1)举个例子:假设选中了一个Manager,选中8个Disk,指定# of Outstanding I/O of =16,磁盘被分布到咯咯worker(每个worker分到2个disk),每个worker对其下的每一个disk生成最大16个未处理I/O,那么整个系统中该Manager每次将生成最多128个未处理I/O(4 worker * 2disk/worker * 16未处理I/O/disk)。
   模拟测试多个应用向IO请求读写,默认是1。通常不用这个参数,除非是用在NAS/SAN上面。此参数和”Test Setup”面板上的Cycling Options有关。 
 
3,Access Specifications:设置数据。硬盘的读性能要比写性能好,顺读比随机好
1)检测最大IOPS:文件尺寸为512B,100%读取操作,随机率为0%
2)检测最大吞吐量:文件尺寸为64KB,100%读取操作,随机率为0%
3)检测SqlServer最大IOPS:文件尺寸为8k,100%读取操作,随机率为100%
4)文件尺寸从0.5KB到64KB不等,80%读取操作,随机率为100%,用于模拟文件服务器的性能
5)文件尺寸从0.5KB到512KB不等,100%读取操作,随机率为100%,用于模拟Web服务器的性能
 
4,Result Of Display:
1)start of Test – 显示从测试开始后所收集的数据的平均值或总和,iometer在多种参数下跑过的平均值和
2)Last Update – 显示从上一个更新开始后所收集的统计信息,只看这一次的结果不和前次比较;
3)Update Frequency:刷新频率,2秒一次。
4)average i/o response time:平均延迟时间
 
四、测试结果:

随机读8K测试结果
机器 IOPS每秒
我的电脑 100
183硬盘 1000
192硬盘阵列 2000
183fushion卡 100000
五、相关资料:
Windows 7 and Vista will automatically align a partition to 4k 
http://www.myce.com/review/corsair-neutron-gtx-240gb-ssd-review-63881/iometer-test-results-5/
Windows 7 and Vista will automatically align a partition to 4k boundaries during partition creation, Windows XP won’t. It is imperative that an SSD’s partition is aligned. Windows XP is also restricted to sector boundaries, while Windows 7 will use 4k boundaries if it can. The Corsair Neutron GTX is 4k boundary aware, and will use these boundaries if possible. Of course it will also remap LBAs for compatibility with the sector boundaries so that the drive can be used with Windows XP.IOMeter allows us to set the sector boundaries for conducting the tests, and I have therefore set the sector boundaries at 4K, which means the IOMeter tests are valid for Windows 7 and Windows Vista users. XP users will not be able to obtain such results.
 
64K is the EQL RAIDset stripe size, to that works best.
http://community.spiceworks.com/topic/315228-iometer-fills-up-the-disk
 
Iometer用户手册
https://community.emc.com/docs/DOC-24952
 
Iometer使用说明
http://support.huawei.com/ecommunity/bbs/10141935.html
 


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

redis不支持windows,而现在的windows版本的redis还不是很成熟。故选择虚拟机下安装centeros,跑redis,在windows下访问。

一、windows连接虚拟机的redis

1,配置vmware的转发
用本机的某个端口转发到虚拟机上的端口
http://www.server110.com/vmware/201309/1703.html
 
2,关闭虚拟机上的防火墙
http://os.51cto.com/art/201003/192193.htm

相关:

service stack wiki
https://github.com/ServiceStack/ServiceStack.Redis/wiki
 
service stack 操作方法
http://www.cnblogs.com/daizhj/archive/2011/02/17/1956860.html
 
例子:利用redis建立一个博客
https://code.google.com/p/servicestack/wiki/DesigningNoSqlDatabase
 
Redis工具篇
Redis Admin UI
http://www.servicestack.net/mythz_blog/?p=381
 


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

在autoresponse设置匹配的url即可,当对应url进来时转到指定的文件
regex:(?insx)^http://172.16.88.55:9528/Resources/Scripts/Call.js\?.*


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
使用场景
1,做缓存,不经常变动的数据加载到缓存中。定时的去更新缓存。
2,热点数据处理,如计数,在线会员列表,最新文章等。
 
redis持久化
rob方式:通过快照完成,当符合一定条件时redis会自动将内存中的所有数据进行快照并存储到硬盘上。
进行快照的条件有两个:时间与改动的键的个数。 redis默认采用rob方式,文件在当前目录的dump.rdb文件
在redis启动时会读取rdb快照文件。
aof方式:每执行一条会更改redis中数据的命令,就将该命令写入硬盘的aof文件

redis入门指南笔记


一、安装
wget http://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz 
cd redis-stable
make

启动
src/redis-server
停止 redis-cli shutdown

客户端:
src/redis-cli

cp redis-benchmark redis-cli redis-server /usr/bin/ #这个倒是很有用,这样就不用再执行时加上./了,而且可以在任何地方执行

在线测试 http://try.redis.io/

二、各种类型

键命名:对象类型:对象ID:对象属性

设置 set myname asong
获取 get myname
判断存在 exists myname
删除 del myname

mset,mget设置获取多个键
mset myname asong age 28

查询所有键:keys *
查询以w开头的键 keys w*
type key 获取类型


是原子的,避免冲突
整数自增 incr i
decr i
incrby i 10
decrby i 10

加小数
incrbyfloat i 1.5

向尾部添加值,若不存在,则新值
append myname hello

获取长度 strlen myname

类型:
字符串类型,整数类型

散列类型:用来存储对象
hset user name asong
hget  user name
设置多个值
hmset user name asong age 28
hgetall user --显示所有
hexists user name 判断字段是否存在
hincry user age
hdel user age
hkeys user
hlen user --获取字段数量

列表类型:存储一个有序的字符串列表,在列表两端添加元素,或者获得列表的某一个片段,一双向链表,顺序即插入的次序。
若是一个对象,可以序列化成字符串存储
应用:网站上的最新文章top 10
直接从列表类型中取出即可,因为每次都将最新的插入到头部

lpush users asong fang bcc
rpush users dd ff

从列表删除元素
lpop users
rpop users

获取片段
lrange users 1 10

删除列表指定的值
lrem users -1 asong
lrem key count value
count>0 从列表左边开始删除前count个值为value的元素。
<0,从右边
=0 删除所有值为value的元素

获取指定位置的值
lindex users 1

向列表指定位置插入元素
linsert users before 7 niuniu


集合类型:
集合:无序的每个元素唯一的合集
sadd users asong fangfang
获取: smembers users
删除:sren users asong
判断集合是否存在 sismember users asong
集合运算
sdiff:多个集合差集 属于A但不属于B的集合
sinter:交集
sunion:并集


有序集合类型:插入数据时指定权重,自动处理排序
zadd users asong 100 fang 200 niu 1000
获得元素的权重
zscore users asong

获取权重在某个范围的元素列表
zrange users 1 10

 


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

【场景】:
对象浏览器中只有数据库名,数据库展不开,查看日志【由于数据库没有完全关闭,无法重新生成日志。】,推测原因是服务器异常关停,造成数据库没有正常写完数据造成。

【处理方法】:修复数据,舍弃异常数据。
DBCC CHECKDB (mydb, REPAIR_ALLOW_DATA_LOSS),前提是要在单用户下

【完整的处理方法】:

ALTER DATABASE [mydb] SET EMERGENCY 
--EMERGENCY状态下 数据库标记为 READ_ONLY,并禁用日志记录,并且仅限 sysadmin 固定服务器角色的成员进行访问。 EMERGENCY 主要用于故障排除。
ALTER DATABASE [mydb] SET SINGLE_USER
DBCC CHECKDB (mydb, REPAIR_ALLOW_DATA_LOSS)
ALTER DATABASE [mydb] SET MULTI_USER

【注】
若以上执行不成功,按以下方式处理:
1,数据库mydb脱机
2,将mdf文件copy到新位置
3,删除原数据库mydb
4,建立新库mydb
5, 脱机mydb
6, 将备份的mdf文件覆盖新库
7,联机新库,此时是置疑状态
8,执行【完整的处理方法】


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58


node.js可以用在并发量特别高而业务逻辑比较简单的场合中。

当我把Node.js介绍给人们的时候,通常会产生两种反应。总的来说人们不是可以正确的理解它,就是被搞得非常糊涂。

如果你到目前为止还处于第二组里,下面是我想要用来讲解node的内容:

  • 它是一个命令行工具。你下载一个tarball文件,编译并安装源码。
  • 它可以让你在你的终端中通过输入’node my_app.js’来运行JavaScript程序。
  • JS是被V8 javascript引擎(使Google Chrome运行如此之快的东西)所执行的。
  • Node提供了一个用来访问网络和文件系统的JavaScript API。

“但是我可以做任何我想要做的事情用:ruby,python,php,java, … !”

我听到了你的声音。你是对的。Node不是该死的独角兽,它不会帮你做你自己的工作,抱歉。它只是一个工具,并且它大概也不会完全地替换你常用的工具,至少当前不会。

“说重点!”

好的,我会的。Node总的来说非常优秀当你需要同时做许多事情的时候。你有过写了一部分代码然后说“我想要这个并行执行”吗?好吧,在node中任何东西都是并行运行的,除了你的代码。

“嘿?”

是的没错,任何东西都是并行的,除了你的代码。为了理解它,把你的代码想像成是国王,然后node是它的仆从军队。

新的一天以仆从叫醒国王并且问他是否需要什么而开始了。国王给了这个仆从一个任务列表,然后回去继续睡觉去了(汗)。这个仆从把这些任务分配给了他的同僚,然后他们开始工作。

当一个仆从完成了一个任务,他会在国王领地外边排成一条线来汇报。国王一次让一个仆从进来,然后听取他的报告。有时候国王会在仆从出去的时候给仆从更多的任务。

生活是美好的,因为国王的仆从并行的执行他的任务,但是一次只报告一个结果,所以国王可以专注。*

“那是异想天开,但是你能结束这个愚蠢的比喻并且用geek的方式告诉我吗?”

当然。一个简单的node程序看起来可能是这样的:

1
2
3
4
5
6
7
8
9
10
11
<code>var fs = require('fs')
  , sys = require('sys');
 
fs.readFile('treasure-chamber-report.txt', function(report) {
  sys.puts("oh, look at all my money: "+report);
});
 
fs.writeFile('letter-to-princess.txt', '...', function() {
  sys.puts("can't wait to hear back from her!");
});
</code>

你的代码给了node两个任务用来读写一个文件,然后就休眠了。当node完成了一个任务,跟它对应的回调就会被触发。但是在同一时间只能有一个回调触发。在那个回调完成了执行之前,所有其他的回调不得不排队等待。进一步说,对于回调触发的顺序是无法保证的。

“所以我不必担心代码在同一时间访问同一个数据结构?”

你理解了!这就是JavaScript的单进程/事件循环设计的全部美之所在。

“非常好,但是为什么我应该用它?”

一个原因是效率。在一个web应用中,你主要的响应时间消耗通常是执行数据库查询的时间之和。通过node,你可以一次执行你所有的查询,把响应时间减少为执行最慢查询所花费的时间。

另一个原因是JavaScript。你可以使用node来在浏览器和你的后端之间共享代码。JavaScript也正在变成一个真的通用语言。不管过去你用的是python,ruby,java,php或者其他语言,你都可能用过一些JS,对吗?

最后一个原因是原始速度。V8时刻在向成为全球最快的动态语言解释器之一而努力。我想不到任何其他语言在速度上有像如今的JavaScript一样有如此突飞猛进的提升。进一步说,node的I/O能力非常轻量级,可以使你可以尽可能的完全利用你系统完全的I/O能力。

“所以你在说我应该从现在起用node来写我所有的应用?”

是和不是。一旦你开始抡node这个锤子,那么显然一切开始看起来都像一个钉子。但是如果你当前的工作有一个期限,你可以通过以下来决定:

  • 是否低响应时间/高并发重要?Node真的很擅长它。
  • 项目有多大?小项目问题不大。大项目应该小心的评估(可用的库,修复一个bug所需的资源或者two upstream等等。)。

“node能运行在Windows上吗?”

不行。如果你使用的是windows,你需要运行一个Linux虚拟机(我推荐VirtualBox)。node对Windows的支持在计划中了,但是接下来的几个月不要屏住呼吸除非你想对port提供帮助。(译者:现在node可以完美的运行在Windows上)

“我能在node中访问DOM吗?”

好问题!不行,DOM是浏览器中的东东,并且node的JS引擎(V8)幸好跟那些混乱的东西是完全分离的。不过,有人在以node模块的形式来实现DOM,可能带来令人兴奋的可能性比如对客户端代码进行单元测试。

“难道事件驱动编程不是真的非常难吗?”

这取决于你。如果你已经学过如何在浏览器中摆弄AJAX调用和用户事件,那么使用node不会是一个问题。

同时,测试驱动开发可以真正的帮助你以一个可维护的设计做为开始。

“谁在用它?”

node wiki(滚动到”Companies using Node”)有一个小的/不全的列表。Yahoo正在为YUI对node进行实验,Plurk正在使用它处理大规模的comet,并且Paul Bakaus(由于jQuery UI而出名)正在创建一个令人兴奋的游戏引擎,其中后端使用了一些node代码。Joyent已经雇佣了Ryan Dahl(node作者)并且大力资助开发。

对了,Heroku也刚刚声明了支持对node.js的托管

“我能去哪里学更多?”

Tim Caswell正在运作优秀的How To Node博客。在twitter上Follow #nodejs。订阅邮件列表。然后去IRC频道逛逛,#node.js(是的,名字中包含这个点)。我们在那的划艇分数快达到200了:)。

我也将会继续在debuggable.com这里写文章。

当前就写这么多了。如果你有其他问题欢迎留言。

引自:理解 Node.js


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
profile 可以监控所有慢的以及不慢的查询。
Profiler默认是关闭的,你可以选择全部开启,或者有慢查询的时候开启。
开启:
db.setProfilingLevel(2);
关闭
db.setProfilingLevel(0)
 
开启后会在所在库下生成一个system.profile集合,可利用此集合进行查询,如按查询时间倒排
 
 
 
 


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
备份
T:\mongodb\bin\mongodump.exe -h 127.0.0.1 -d BRM_Message  -u saadmin -p L123 -o "d:\backup\mongobak\%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%" 
mongorestore -h 127.0.0.1 -d BRM_Message --directoryperdb /backup/mongobak/3/  -u saadmin -p L123

还原:

E:\mongodb\bin>E:\mongodb\bin\mongorestore -h 127.0.0.1 -d BRM_Message  --drop -
-directoryperdb "E:\mongodb\back\11231629\BRM_Message"
connected to: 127.0.0.1
 
http://docs.mongodb.org/v2.2/reference/mongorestore/
 
 


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

SELECT CONVERT(VARCHAR(50),CONNECTIONPROPERTY('local_net_address'))host ,client_net_address,program_name,db.NAME,convert(varchar(max),t.[text]) SQLText,CONVERT(varchar(20),login_time,120) login_time,
CONVERT(VARCHAR(20),last_request_end_time,120) last_request_end_time,login_name,s.session_id

FROM master.sys.dm_exec_sessions AS s (nolock)
INNER JOIN master.sys.dm_exec_connections AS c (nolock) ON s.session_id=c.session_id
INNER JOIN master.sys.databases db ON s.database_id = db.database_id
OUTER APPLY master.sys.dm_exec_sql_text(c.most_recent_sql_handle) AS t
LEFT JOIN dbo.mdSystemIP msi ON client_net_address = msi.IP
WHERE
NOT EXISTS( –非限定IP访问
SELECT 1 FROM dbo.mdSystemIP ms WHERE client_net_address = ms.IP
)
OR

( –服务器访问但是非合法客户端,包含用ssms直联也是不合法
EXISTS(SELECT 1 FROM dbo.mdSystemIP ms WHERE client_net_address = ms.IP AND VisitType='Server')
AND program_name NOT LIKE '.Net SqlClient Data Provider%' –程序连接
AND program_name NOT LIKE 'SqlQuery%' –缓存,数据库依赖
AND program_name NOT LIKE 'SQLAgent%' –job
AND program_name NOT LIKE 'Repl%' –复制分发
AND program_name NOT LIKE 'DATABASE%' –复制分发
AND program_name NOT LIKE 'SQLCLUSTER%' –复制分发
AND program_name != 'Microsoft SQL Server' –自身执行
AND program_name != 'Microsoft® Windows® Operating System'
AND login_name != 'NT AUTHORITY\SYSTEM'
AND db.NAME NOT IN('master','msdb','distribution')
)


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

sqlserver在新增注册服务器时,发现框里空白,没有数据库引擎的选项。引起的原因是将其他服务器的注册配置文件导入过来引起,处理方法:
删除:C:\Users\Administrator\AppData\Roaming\Microsoft\Microsoft SQL Server\110\Tools\Shell\RegSrvr.xml
重启ssms


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

sqlserver2008开始提供压缩备份,好处是备份与还原时间缩短,备份文件也很小,测试结果显示文件小了2/3,不过不好的地方在于CPU要大量计算,CPU要占不少资源,不过若放在晚上执行的话,cpu可以忽略。

SELECT name,backup_start_date,backup_finish_date,compressed_backup_size
FROM msdb..backupset;
 

备份压缩 (SQL Server)


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

SQL Server 2008提供了内建的方法“”变更数据捕获“”(Change Data Capture 即CDC)以实现异步跟踪用户表的数据修改,而且这一功能拥有最小的性能开销。可以用于其他数据源的持续更新,例如将OLTP数据库中的数据变更迁移到数据仓库数据库。

--开启cdc
EXEC sys.sp_cdc_enable_db

--net_changes说的是针对一行记录,如果有多个更改的话,那么以最后的一条为准。
EXEC sys.sp_cdc_enable_table @source_schema='dbo',@source_name='frmuser',@capture_instance='frmuser',@supports_net_changes=0,@role_name=null 

--确认表已经被跟踪  
  
SELECT is_tracked_by_cdc FROM sys.tables  
WHERE name = 'frmuser' and schema_id = SCHEMA_ID('dbo')  

EXEC sys.sp_cdc_help_change_data_capture 'dbo', 'frmuser' 

--更改表数据查询效果
UPDATE a
SET a.isvalid  = 0
FROM frmuser a
WHERE Account ='sa'


SELECT TOP 50 * 
FROM [cdc].[frmuser_CT]

DECLARE @FromLSN varbinary(10) =  
sys.fn_cdc_map_time_to_lsn  
( 'smallest greater than or equal' , '2013-09-27 08:30')  
  
DECLARE @ToLSN varbinary(10) =  
sys.fn_cdc_map_time_to_lsn  
( 'largest less than or equal' , '2013-09-27 23:59:59')  
  
--注意若在上面的日期范围内无数据的话,将提示参数不足
SELECT  
CASE __$operation  
WHEN 1 THEN 'DELETE'  
WHEN 2 THEN 'INSERT'  
WHEN 3 THEN 'Before UPDATE'  
WHEN 4 THEN 'After UPDATE'  
END   ,a.*
FROM [cdc].[fn_cdc_get_all_changes_frmuser]  
(@FromLSN, @ToLSN, 'all')   a


--撤销CDC
EXEC sys.sp_cdc_disable_table 'dbo', 
'FactInternetSales','All'

EXEC sys.sp_cdc_disable_db

更改是不会永远保存,会定期清除
捕获和清除作业都是使用默认参数创建的。将立即启动捕获作业。它连续运行,每个扫描周期最多可处理 1000 个事务,并在两个周期之间停顿 5 秒钟。清除作业在每天凌晨 2 点运行一次。它将更改表项保留三天(4320 分钟),可使用单个删除语句最多删除 5000 项。
 

 
 
 
 


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

Windows Vista、Windows 7以及Windows Server 2008提供了强大的复制功能,可以进行数据复制与同步

 
将指定目录下指定类型的文件按原有目录结构存放至新位置
robocopy G:\教程\书籍\Dropbox\goodasong M:\test *.txt  /s 

同步文件夹:每次只复制新更改的,让源与目录保持一致
ROBOCOPY E:\TeamCity\buildAgent\work\BatchFiles\BUBRM.Web  J:\robot /XO /MIR
/XO: 排除较旧的文件,已同步的文件不再同步
/MIR: 镜像目录树,让源与目录保持一致,如源删除了则目录也要删除。

在robocopy命令后加上"/save:任务名",可以将当前操作保存为任务文件,通过使用"/job:任务名"就可以方便的进行调用
 

/s:除了空文件夹以外的所有子目录
/e :全部目录 
/xf:指定不执行复制操作的文件类型
/max:10000000 可以选择文件大小上限,其单位为byte。如果是"/min",限定了文件大小的下限。两个参数可以同时使用,限制出所需复制的文件大小的范围。
/maxage:5 将D:Document下修改时间在5天内的文件
如:robocopy D:\Document H:\Project /maxage:5 /minage:1
 
robocopy D:\Document H:\Project /mir
表示清理目标文件夹内有而源文件夹里没有的文件和文件夹。通过这个命令,能保证源文件夹和目标文件夹在结构与内容上完全相同。
 
/move:移动文件
/create:拷贝一个多级目录的目录树,或者说只需要它的结构,而不需要它的内容
参数"/xa:h"表示将具有隐藏属性的排除出欲复制的范围,与之相对应的是参数"/ia",表示只复制包括指定属性的文件。
可用的属性有;R只读、A存档、S系统、H隐藏等。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
准备:
1,主服务器和从服务器的admin数据库中必须有全局用户。
2,主服务器的local数据库和从服务器的local数据均有名为repl且密码相同的用户名。
3,主服务器和从服务器必须开启安全认证:–auth
步骤:
分别连接上主从服务器设置账号
  >use admin
   >db.addUser('sa','LifeIsGood')
   >use local
   >db.addUser('repl','repl')
   >exit
开启:
主服务器重新启动,带参数–auth –master
从服务器重新启动,带参数–auth –slave –source 172.16.88.241

注:从服务器不能进行数据更新操作,只能查询

http://docs.mongodb.org/manual/core/master-slave/


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

一、安装成服务

1、解压mongodb-win32-x86_64-2.4.6.zip到 D:\mongodb
2、在D:\mongodb下创建目录data 与 logs
3、在D:\mongodb\logs下创建mongodb.log文件
4、配置为服务
1)开始–运行–cmd
2)cd D:\Mongodb\bin
3)D:\Mongodb\bin>mongod –logpath D:\MongoDB\logs\MongoDB.log –logappend –dbpath D:\MongoDB\data –directoryperdb –serviceName MongoDB –install
4) net start mongodb

二、账号建立
1,利用mongoVUE连接上去,在admin的users建立账号
2,让mongodb进入授权模式,在启动时增加参数auth
net stop mongodb
sc delete mongodb
mongod –logpath D:\MongoDB\logs\MongoDB.log –logappend –dbpath D:\MongoDB\data –directoryperdb –serviceName MongoDB –install –auth


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

    在测试过程中,被测试的功能并不总是很简单,可能这个功能块有多个逻辑组成,如其中一个逻辑A是要查询数据库返回一个列表,那么在编写测试方法时就不得不考虑连接数据库的事情,并且,若数据库发生更改的话,做的测试也需要相应的更改。此时利用fake来假冒逻辑A即可,即是将逻辑A查询数据库的方法做一委托,用自定义的代码返回值即可,这就实现了与数据库的无关性。

Stub:接口模拟
Shim:具体方法模拟
在测试时
1要引入 Microsoft.QualityTools.Testing.Fakes;
2,要在模拟上下文中操作,只有这样类用到有模拟的方法才会自动调用我们所实现的
using (ShimsContext.Create())

 

Microsoft Fakes 可以提供成员模拟的方法.以方便进行单元测试

如果不使用模拟方法我们要关心很多东西,如数据库的数据变化,接口调用导致的变化,文件、及其它资源的访问等问题。

使用模拟我们则可以只关系我们需要测试的那部分逻辑。

clip_image001

一 、Stub 和 Shim

Microsoft Fakes 提供了两种模拟类型成员的方式.以下两种方式的替代实现,都可以由委托来重新实现.

1.Stub Type,存根类型,可以动态地为接口及非密封的virtual或属性附加委托,以重新定义其实现,生成的类为强类型.

2.Shim Types,填充类型,解决了密封类或static成员的问题,T的填充类型ShimT可以为T的每个成员提供一个替代实现

二 、选择原则

由于Stub和Shim的实现方式不同,所以它们也有不同的要求,下面总结了选择它们的一些原则:

性能方面:运行时使用Shim重写会影响性能,Stub由于使用的是虚方法,则无此问题

对static方法/sealed类型:Stub类型只可以重写虚方法,因此,它不适用于static方法/sealed方法/sealed类中的方法,等

Internal类型:对于标记了InternalsVisibleToAttribute的内部类型,Fakes也可以起作用

private方法:如果private方法的签名上的所有类型都是可见类型,那么可以通过Shim来替换实现.Stub只能替换可见方法.

接口和抽象方法:Stub可以提供接口或抽象方法的替代实现.Shim则不能,因为没有实际的方法体.

所以建议在一般情况下使用Stub来支持那些可测试性做的非常好的类型,而用Shim来解决那些耦合很大,可测试性很差的代码或三方组件.

三、如何使用Fakes

假设我们在项目ClassLibrary1中有以下几个类

   1: public interface IDataAccess
   2: {
   3:     int Read();
   4: }
   5:  
   6: public class MyDataAccess : IDataAccess
   7: {
   8:     public int Read()
   9:     {
  10:         return Tools.GetNum();
  11:     }
  12: }
  13:  
  14: public class Tools
  15: {
  16:     static public int GetNum()
  17:     {
  18:         return 1;
  19:     }
  20: }
  21:  
  22: public class MyClass
  23: {
  24:      public static int GetMyData(IDataAccess obj)
  25:      {
  26:          //其它逻辑
  27:          return obj.Read();
  28:      }
  29: }

我们要使用Fakes进行测试只需要在测试项目中引用 ClassLibrary1,并且在之上右键->建立 Fakes即可使用Fakes

 

之后我们就可以使用类似以下代码来模拟一个IDataAccess的实例 ,MyClass.GetMyData  这个static方法的实现

前者即使用Stub,后者即Shim

   1: [TestClass]
   2: public class UnitTest1
   3: {
   4:     [TestMethod]
   5:     public void StubTest()
   6:     {
   7:         IDataAccess stockFeed = new ClassLibrary1.Fakes.StubIDataAccess()
   8:                                     {
   9:                                         Read = () => { return 2; }
  10:                                     };
  11:         Assert.AreEqual(2, MyClass.GetMyData(stockFeed));
  12:  
  13:     }
  14:     [TestMethod]
  15:     public void ShimTest()
  16:     {
  17:         using (ShimsContext.Create())
  18:         {
  19:             ClassLibrary1.Fakes.ShimMyClass.GetMyDataIDataAccess = (inc) => { return 2; };
  20:             Assert.AreEqual(2, MyClass.GetMyData(null));
  21:         }
  22:  
  23:     }
  24:  
  25: }

Stub 与其它Mock差不多,只是使用委托来改变方法实现

而Shim则需要建立 ShimsContext的作用域