现代武器装备中计算机技术的日新月异,软件在其中的比重越来越大,但传统的过程管理模式已无法满足日益增长的软件研制要求。为此,总装备部基于CMMI标准和军用软件研制的特点,制定了GJB5000A标准,要求军用软件研制单位依据GJB5000A制定软件质量管理体系,并切实落实执行。
“提升研发能力,推动组织自主创新”是青铜器软件的定位。源自华为的青铜器软件团队,依据华为的科研创新管理探索历程,融合国内其他主流科研机构的经验总结,并充分考虑军工产品研制之系统复杂、关注质量、后墙不倒等特征,形成了青铜器RDM Army科研质量管理系统,全面实现了GJB5000A质量体系信息化,能够帮助科研机构缩短GJB5000A的实施周期、减少推行阻力。
源自华为技术
“软件对于华为而言,是非常非常重要的。每年,华为投入到软件上的工作量超过整体研发工作量的80%。”推行CMM前,华为的软件研发最后能不能够成功,更多地依赖运气,或者依赖团队里是不是有一两个天才式的开发人员。这样的状况使华为的软件生命线变得非常脆弱,进度时常延期,质量问题频发。为了有效地控制华为在软件研发中日益庞大的投入以及逐渐庞杂的软件系统本身,实施CMM体系势在必行。
1999年初,华为开始接触CMM,考虑到印度拥有大量通过CMM认证的软件企业,印度软件从业人员对CMM的了解程度和接受速度都非常之快。基于这些“本地化”优势,华为决定由印度所来充当整个企业引入CMM的先锋。经过3年的推行、摸索、总结,终于在2001年12月,华为印度研究所成为中国第一个获得CMM L4国际认证的软件研发机构。
青铜器RDMArmy的核心成员非常有幸全程参与了华为印度所的CMM推行过程,深刻领悟到CMM的精髓和实施方法,一是CMM要与科研业务紧密结合,不能为了CMM而CMM;二是要具备削足适履的勇气;三是CMM执行不能成为技术人员的负担,要成为助手。要达到管理于无形的效果,大量管理数据都需要基于CMM信息化系统自动挖掘、分析、预警。
全面支持GJB5000A
参考华为CMM/CMMI推行经验,结合GJB5000A的特殊性,并充分考虑军工行业质量管理的实际需求,如此形成的青铜器RDM Army科研质量管理系统,实现了对GJB5000A 22个PA全覆盖,能够满足科研机构GJB5000A L2~L5的认证评估需要。根据历史经验,科研机构借助青铜器RDM Army实施GJB 5000A明显优势如下:
1) 实施周期短,实施5000A L2一般需要1.5~2个月,实施5000A L3一般需要3~3.5个月;
2) 实施阻力小,基层技术人员每天只需要花费10分钟,进行日清日结,就能全面满足5000A质量数据收集分析的要求;
3) 实施难度小,RDM Army对照5000A认证要求,已经将22 PA全部信息化、模板化、流程化、样例化、标准化,科研单位只需要
结合本单位实际需要,在此基础上稍加修改,就可以全面推行了。
青铜器RDM Army GJB5000A科研质量管理系统
来看看monkey常见问题和解决办法吧!
1.编译app里面的源码时,有时候由于模拟器闲置太久,把apk文件添加到模拟器中会报错:error:device not found
通常这个时候,我只需要:
adb kill-server
adb remount
然后就可以把我的apk安装到模拟器里。
2.今天,再试这种办法突然不行了,老是出现"error:device offline",google了下,发现只需要添加一行命令就可以了,具体如下:
adb kill-server adb start-server adb remount |
然后把我的apk安装到模拟器成功。
3 Android中ADB server didn't ACK fail to start daemon,怎么解决呢?
ADB server didn't ACK
在使用adb命令,有时候会出现下面这种错误。
errors: * daemon not running. starting it now * ADB server didn't ACK * failed to start daemon * |
因为有另外一个应用占用了ADB SERVER的端口,也许是adb shell本身,结束进程中的adb.exe并重新启动adb试试。。
4、D:\android\android-sdk-windows\tools目录中没有adb.exe
检查一下你的android-sdk-windows目录下有没有platform-tools目录。并检查访目录下是否有adb.exe
5、在cmd中执行“adb shell”,则提示“error: device not found”
没有发现设备。如果用手机设备测试,请用USB数据线与电脑连接,同时并安装好手机驱动;如果你采用模拟器测试,你应该先启动eclipse,然后设置好模拟器,并进入模拟器测试状态
6、执行“adb shell”,提示“error: more than one device and emulator”
第一种情况:确实用多个设备或者模拟器
错误说明是有一个以上的设备和仿真器。这是因为我启用了模拟器,同时我也将我的手机通过USB线连接到了电脑。所以这里存在两个设备。这种情况下,需要指定连接某一个设备或者模拟器。
1、获取模拟器或设备列表
命令:adb devices
来查看存在几个设备
2、指定device来执行adb shell
命令:adb -s devicename shell
在多个device的时候,执行adb命令一般都需要用参数-s指定device。
例如卸载emulator-5554上的包com.soft.camera,命令如下
adb -s emulator-5554 uninstall com.soft.camera
例如通过monkey测试
adb -s emulator-5554 shell monkey -v -p your.www.com 500
第二种情况:确实有一个设备或者模拟器
之所以显示有多个,是因为此设备用过两次。使用命令adb devices会看到这个设备有两种状:offline和device,有以下两种解决办法:
1、重启adb.exe服务
一般办法:在命令窗口输入 adb start-server 重新启动adb.exe服务
2、终极方法,结束adb进程
如果上述方法不可以,终极方法:打开任务栏,选择“进程”选项卡,找到adb.exe进程,结束之,重新启动就完事OK啦(或者在命令窗口输入命令 adb kill-server )
7、在手机上通过monkey测试
在cmd中输入:adb -s HT21JV204550 shell monkey -v -p your.www.com 500
出现:No activities found to run, monkey aborted.
原因:起初我是通过模拟环境测试,通过手机测试,应该将“Target”选项卡中由原来的“Automatic”项改为“Manual”
然后选择“Target”选项卡的前面一个选项卡“Android”,点击下面的“Run”。执行Run后结果如下:
点击OK,程序会将APK写入手机,这时就可以在cmd中输入命令:adb -s HT21JV204550 shell monkey -v -p your.www.com 500 ,通过在真实手机环境下进行测试了。
8、关于monkey命令简要概述
一、九个事件及百分比控制
1、九个事件
--pct-touch <percent> 0
调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)(——点击事件,涉及down、up)
--pct-motion <percent> 1
调整动作事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)(——注:move事件,涉及down、up、move三个事件)
--pct-trackball <percent> 2
调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)--(轨迹球)
--pct-nav <percent> 3
调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)
--pct-majornav <percent> 4
调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)
--pct-syskeys <percent> 5
调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)
--pct-appswitch <percent> 6
调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法。(从一个Activity跳转到另一个)
版权声明:本文出自 张亚洲 的51Testing软件测试博客:http://www.51testing.com/?521817
原创作品,转载时请务必以超链接形式标明本文原始出处、作者信息和本声明,否则将追究法律责任。
本代码中只简单写了一个类,可以在该类中增加想要测试的功能项。
Focus2AndroidTest测试类 package com.example.aaaaa; import android.test.AndroidTestCase; public class Focus2AndroidTest extends AndroidTestCase { @Override protected void setUp() throws Exception { // TODO Auto-generated method stub super.setUp(); System.out.println("====aaaa===="); } } |
AndroidManifest.xml中需要增加几个属性
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=http://schemas.android.com/apk/res/android package="com.example.aaaaa" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.aaaaa.Focus2AndroidTest" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <uses-library android:name="android.test.runner" />//增加的第一个位置 </application> <uses-permission android:name="android.permission.RUN_INSTRUMENTATION" />//增加的第二个位置 <instrumentation android:name="android.test.InstrumentationTestRunner" android:label="Test for my app" android:targetPackage="com.example.aaaaa" /> </manifest> |
运行程序时与正常的运行部太一样。右键功工程名->run as->android jUnit test即可看到运行结果。
注意包名等地方要与当前工程名相一致。
运行结果:(右侧的东西为正常运行后的内容)
Action() { int array_len ,i=1; char array_name[20]; |
//通过关联找出所有的省市的连接地址
web_reg_save_param("outFlightVal", "LB=\"http:\/\/a.lietou.com\/", "RB=.shtml\">", "ORD=ALL", LAST); web_url("a.lietou.com", "URL=http://a.lietou.com", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t25.inf", "Mode=HTML", EXTRARES, LAST); |
//计算获取省市的个数,为下面的循环访问做准备
array_len=atoi(lr_eval_string("{outFlightVal_count}")); lr_output_message("%d",array_len); for (i=1;i<=array_len;i++) { |
//拼接省市请求url
sprintf(array_name,"{outFlightVal_%d}",i); lr_output_message("%s",lr_eval_string(array_name)); lr_save_string(lr_eval_string(array_name),"shen"); |
//关联获取title字段内容
web_reg_save_param("title", "LB=<title>", "RB=</title>", "ORD=1", LAST); |
//关联获取content字段内容
web_reg_save_param("content", "LB=content=", "RB=\/>\r\n", "ORD=1", LAST); web_url("a.lietou.com", "URL=http://a.lietou.com/{shen}.shtml", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t25.inf", "Mode=HTML", EXTRARES, LAST); } return 0; } |
1、相关概念
质量:反映实体满足明确或隐含需要能力的特性总和,是一系列内在特征满足需要的程度。
质量管理:执行组织确定质量政策、目标与职责的各过程和活动,从而使项目满足其预定需求。
质量政策:由高级管理层颁布,确定组织质量工作方向。
项目质量管理与产品质量管理的比较:
说明:
客户满意:符合要求和适合使用
预防胜于检查:质量该被规划和设计,并在项目管理过程或可交付成果生产过程中被建造出来。
持续改进:基于计划-实施-检查-行动(PDCA plan-do-check-action),全面质量管理(TQM),六西格玛
管理层责任:管理层负85%的责任
质量成本(COQ):质量成本是指一致性工作和非一致性工作的总成本。
质量和等级:
质量:一些列内在特征满足需要的程度,质量水平永远是个问题。
等级:对用途相同但技术特征不同的产品或服务的级别分类;等级低不见得是问题;质量好坏与等级的高低没有直接关系。
精确度和准确度:项目管理团队在质量管理计划中确定这两者的等级。
精确度:对紧密程度的度量。
准确度:是对正确性的评估。
精确不一定准确,准确不一定精确。
质量管理大师:
朱兰:提出质量是“适合使用”;质量与等级区别;质量管理三元论(策划、控制和改进)。
戴明:发扬PDCA;目标不支持持续改进知识积累;预防胜于检查。
克劳斯比:质量是“符合要求”;零缺陷第一次就把事情做对;“非一致性成本”来衡量;质量是免费的。
非根鲍姆:全面质量管理TQM。
田口玄一:质量损失函数;稳健设计方法;实验设计方法。
石川磬:石川图 / 鱼骨图。
2、 实现过程
规划过程组:规划质量管理
执行过程组:实施质量保证
监控过程组:控制质量
2.1 规划质量管理
定义:识别项目及其可交付成果的质量要求和/或标准,并书面描述项目将如何证明符合质量要求的过程。
输入:项目管理计划、干系人登记册、风险登记册、需求文件、事业环境因素、组织过程资产
工具与技术:成本效益分析、质量成本、七种基本质量工具、标杆对照、统计抽样、实验设计、其他质量规划工具、会议
输出:质量管理计划、过程改进计划、质量测量指标、质量核对单、项目文件更新
质量管理计划:描述将如何实施组织的质量政策,以及项目管理团队准备如何达到项目的质量要求。
过程改进计划:详细说明对项目管理过程和产品开发过程进行分析的各个步骤,以识别增值活动。
质量测量指标:专门用于描述项目或产品属性,以及质量控制过程将如何对属性进行测量。通过测量,得到实际数值。可用于质量保证和质量控制过程中。
质量核对单:一种结构化工具,通常具体列出各项内容,用于核实所要求的一系列步骤是否已得到执行。
成本效益分析:比较可能成本与预期收益
质量成本:在产品生命周期中为预防不符合要求、为评价产品或服务是否符合要求,及因未达到要求,而发生的所有成本。
一致性成本:预防成本(生产合格产品)、评价成本(评定测量)
非一致性成本:内部失败成本(项目内部发现的)、外部失败成本(客户发现的)
七种基本质量工具:
因果图:又叫鱼骨图、石川图,用于分析导致某种结果的根本原因,直观地显示各种因素如何与潜在问题或结果相联系。
直方图:用垂直条形图显示特定情况的发生次数。
流程图:对一个过程的图形化表示,显示该过程各步骤间的相互关系,也叫过程图。三要素:活动、决策点、处理顺序。
控制图:直观地反应反映某个过程随时间推移的运行情况,以及何时发生了特殊原因引起的变化,导致该过程失控。
检查表:用于收集数据的查对清单,又叫技术表。
散点图:显示两个变量之间的关系。
帕累托图:一种特殊的垂直条形图,用于识别造成大多数问题的少数重要原因。80%的问题由20%的原因导致。
实验设计:识别哪些因素会对正在生产的产品或正在开发的流程的特定变量产生影响的一种统计方法。
统计抽样:从目标总体中选取部分样本用于检查,理论基础是概率统计。
其他质量规划工具:
头脑风暴
立场分析:显示变更的推动力和阻碍力的图形。
名义小组技术:先由规模较小的群体进行头脑风暴,提出创意,再由规模较大的群体对创意进行评审。
自动化测试广义说法包括,白盒自动化测试,GUI自动化测试,性能自动化测试
GUI自动化测试的原理:通过软件模拟用户实际的鼠标和键盘操作,,实现自动化执行和操作的过程。
性能自动化测试的原理:通过客户端模拟多个虚拟用户并发请求,来检验服务器的性能行为是否满足系统要求。
自动化测试的优点:
1、通过录制,编写脚本执行测试,减少回归测试
2、执行手工测试困难,或不可能做得测试,(模拟多个用户并发测试)
3、更好的利用资源,(将繁琐的任务自动化,利用晚上或周末的时间进行执行自动化测试)
4、测试具有一致性和可重复性,(重复多次相同的测试,在不同配置下执行,可以在不同的操作系统测试)
5、测试的复用性
6、缩短测试的时间和周期
自动化测试局限:
1、不能取代手工测试
2、手工测试比自动化测试发现的bug要多
3、自动化测试不能提高有效性
4、工具本身不具有想象力
5、对测试质量的依赖性极大
问题背景:
原先做机房收费系统的时候,对于D层访问数据库,对数据库的操作基本上都是通过SQL语句实现的,这样导致的一个问题就是在完成机房收费系统中,产生了一些容易被忽略的逻辑黑洞。例如:在退卡业务逻辑中,要判断从注册表中是否删除成功,其次,还要判断是否将退卡记录添加到退卡记录表中,两者都成功之后,标识退卡业务逻辑完成,任何一个失败,退卡业务逻辑标识失败。我原先的思路有点片面化,就是通过and连接符来判断两者是否都为true:
If ICancelcard.AddCancelCard(EntityCancelCard) = True And IStuInfo.DeleteStudent(EntityCancelCard) = True Then Return True Else Return False End If |
但是这样就出现了一个思维漏洞:假设一种情况——从卡的注册表中删除成功了,但是添加信息的时候却添加失败了,按照上述代码,则会给用户提示:用户退卡失败。但是这时候却已经从卡的注册表中删除的情况;
解决方式(一):——存储过程
存储过程:
是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。对于上述的问题,用存储过程来解决:当从卡注册表中删除某个卡的时候,将卡的信息添加到退卡记录表中:
CREATEPROCEDURE Pro_CancelCard @StudentIDchar(10), @CardIDint, @CancelCashnumeric(18,2), @Datechar(20), @TimeChar(20), @UserIDChar(10), @StatusChar(10), AS BEGIN deletefrom TB_Student_Info whereCardID=@CardID SETNOCOUNT ON; insert TB_CancelCard_Infovalues(@StudentID,@CardID,@CancelCash,@Date,@Time,@UserID,@Status) END GO |
解决方式(二):——事务结合存储过程
事务:
是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。用我们通俗的理解,就是武侠小说中的:不成功,便成仁!要不都成功,要不都不成功。其最重要的特征就是一致性,也可以理解为原子性
Create procedure [dbo].[PROC_UpStuCash] @StudentID char(10), @CardID int, @CancelCash numeric(18,2), @Date char(20), @Time Char(20), @UserID Char(10), @Status Char(10), as begin set nocount on; set xact_abort on ; /开始事务 begin tran delete from TB_Student_Info where CardID =@CardID insert TB_CancelCard_Info values(@StudentID,@CardID,@CancelCash,@Date,@Time,@UserID,@Status) if @@ERROR = 0 commit tran /都执行成功,提交事务 else rollback tran /任何一个失败,事务回滚 end |
在D层的实现:
''' 删除注册用户学生 '''</summary> ''' <param name="Student"></param> ''' <returns>Boolean</returns> ''' <remarks>如果删除成功,返回ture 否则返回false</remarks> Public Function DeleteStudent(Student As CancelCardEntity) As Boolean Implements IStudentInfo.DeleteStudent Dim paras As SqlParameter() Try paras = New SqlParameter() { New SqlParameter("@CardID", Student.CancelCardID), New SqlParameter("@StudentID", Student.CancelStuID), New SqlParameter("@CancelCash", Student.CancelCash), New SqlParameter("@Date", Student.CancelDate), New SqlParameter("@Time", Student.CancelTime), New SqlParameter("@UserID", Student.CancelUserID), New SqlParameter("@Status", "结账") } sqlStr = "Pro_CancelCard" Return SqlHelperDAL.Instance.ExecAddDelUpdate(sqlStr, CommandType.StoredProcedure, paras) Catch ex As Exception Throw ex End Try End Function |
小结:
对于数据库完整性,由原先的一无所知,到初步了解,以及到现在的慢慢的使用,这是一个慢慢的过程;当然,事务的使用也不是那么的熟练和完美,对于笔记中的扩展事务控制,传统的事务控制,复制控制等,现在还是停留在认知阶段。其实,对于事务和存储过程,如果写的足够完美的话,完全可以将复杂的业务逻辑层给简化,在D层执行对应的存储过程,让B层简单实现D层的接口,这也是其一个作用吧~~~
本节重点:
上传文件
文件上传操作也比较常见功能之一,上传功能没有用到新有方法或函数,关键是思路。
上传过程一般要打开一个本地窗口,从窗口选择本地文件添加。所以,一般会卡在如何操作本地窗口添加上传文件。
其实,在selenium webdriver 没我们想的那么复杂;只要定位上传按钮,通send_keys添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在。下面通地例子演示。
upload_file.html
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title>upload_file</title> <script type="text/javascript" async="" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js "></script> <link href=http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css rel="stylesheet" /> <script type="text/javascript"> </script> </head> <body> <div class="row-fluid"> <div class="span6 well"> <h3>upload_file</h3> <input type="file" name="file" /> </div> </div> </body> <script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script> </html> |
upload.py
#coding=utf-8 from selenium import webdriver import os,time driver = webdriver.Firefox() #脚本要与upload_file.html同一目录 file_path = 'file:///' + os.path.abspath('upload_file.html') driver.get(file_path) #定位上传按钮,添加本地文件 driver.find_element_by_name("file").send_keys('D:\\selenium_use_case\upload_file.txt') time.sleep(2) driver.quit() |
其它有些应用不好找,所以就自己创建页面,这样虽然麻烦,但脚本代码突出重点。
这里找一139邮箱的实例,有帐号的同学可以测试一下~!
(登陆基础版的139邮箱,网盘模块上传文件。)
139upload.py
#coding=utf-8 from selenium import webdriver import os,time driver = webdriver.Firefox() driver.get(http://m.mail.10086.cn) driver.implicitly_wait(30) #登陆 driver.find_element_by_id("ur").send_keys("手机号") driver.find_element_by_id("pw").send_keys("密码") driver.find_element_by_class_name("loading_btn").click() time.sleep(3) #进入139网盘模块 driver.find_element_by_xpath("/html/body/div[3]/a[9]/span[2]").click() time.sleep(3) #上传文件 driver.find_element_by_id("id_file").send_keys('D:\\selenium_use_case\upload_file.txt') time.sleep(5) driver.quit() |
相关文章:
轻松自动化---selenium-webdriver(python) (八)
在进行java web程序开发过程中,经常遇到这种问题,修改一个java文件(*.java),需要重启web服务器(如tomcat,weblogic等),部署项目。而起/停服务器浪费了大量的时间。在小项目中,也许我们感觉不到。但对于公司的大型项目:如数据中心,生产等系统开发而言,往往起/停需要等待几分钟时间。更浪费时间的是,对于一个类中的方法的调试过程,如果修改多次,需要反复的启停服务器,那么浪费的时间更多。从上可以看出,我们急需一个可快速起/停服务器的工具,来提高我们的开发效率。
Javarebel简介
JavaRebel是一个JVM插件(-javaagent),能够即时重载java class更改,因此不需要重新部署一个应用或者重启容器,节约开发者时间。它是一个Java EE和Java 独立应用的常用解决方案。
JavaRebel可以和MyEclipse,tomcat等快速的组装在一起,用语动态部署java文件而不用重启服务器,从而可解决大量的开发时间,提高开发效率。
JavaRebel使用介绍
下面以javarebel + MyEclipse,javarebel+tomcat为例,介绍javarebel的在项目开发,部署环境的搭建即使用。
Javarebel和MyEclipse开发部署应用
1:下载javarebel插件:http://www.zeroturnaround.com/javarebel/download/目前版本为2.0.将下载后文件解压在任意目录(windows),如:D:\javarebel-2.0.
2:安装myeclipse(安装步骤略),个人使用版本myeclispe5.5.
3:在myeclipse中添加javarebel:打开MyeEclispe->Window->Prefrence窗口,找到设置tomcat位置下JDK设置。如图:
在java VM参数中增加如下代码:
-noverify-javaagent:d:\javarebel-2.0\javarebel.jar
然后点击“OK”按钮即可。
下面看看javarebel在开发过程中的应用(假设myeclipse中设置的tomcat部署文件{tomcat}\conf\Catalina\localhost\<文件名>.xml 中链接的项目已在myeclipse中导入):
启动tomcat完毕后,修改java类文件。然后直接运行程序(不用重启服务器)。在myeclipe控制台会打印下图红色笔记部分信息,此为javarebel自动打印,告诉你被修改的类部署的部署情况。
红色画笔下的打印信息是我修改java类的测试信息。通过上图可以发现javarebel已成功将我修改的类进行了部署。
Javarebel和Tomcat开发部署应用
1:下载javarebel(略)。
2:安装tomcat略。个人使用tomcat5.0.19
3:在tomcat中进行javarebel配置:打开{tomcat}\bin\ catalina.bat,找到set JAVA_OPTS处,在“=”右边添加如下代码:
-noverify -javaagent:d:\javarebel-2.0\javarebel.jar
个人设置后结果如下:
set JAVA_OPTS=-noverify -javaagent:d:\javarebel-2.0\javarebel.jar-Xms1024m -Xmx1024m
4:启动tomcat,待启动完毕后,修改tomcat部署描述文件(xml)所链接项目中java文件(将此项目导入eclipse中进行修改),修改完毕后,直接运行程序。则会在tomcat控制台看到如下信息:
这里的重复数据指数据库中每一列的值都相同的数据,有时候也许是没有主键的原因导致数据可能重复,或者是,除了主键,其他数据重复,那么下面的方法可以都这些重复数据进行删除,保留下重复数据中的一行就可以。
大体可以分为两个方法 :一种要用rowid来进行删除,另外一种,则是用临时表来进行删除。这里讲四种方法:
现在假设 表test中有,三个列col1,col2,col3;在这样的表里有很多数据是重复的,现在的目标是对这些数据中重复的数据进行删除,保留下的数据都是不重复的。
第一种方法:
Delete from test where rowid not in(select max(rowid) from test group by col1,col2,col3);(觉得最简单)
第二种方法:
Delete form test where (col1,col2,col3) in(select col1,col2,col3 from test group bycol1,col2,col3) and rowid not in(select max(rowid) from test group by col1,col2,col3)(跟第一种差不了多少,很常见的思维方式)
这里的删除适合删除表中有大量重复数据;
第三种方法:
Delete from test a where a.rowid !=(select max(rowid) from test b where a.col1=b.col1and a.col2=b.col2 and a.col3=b.col3)
变形:
Delete from test a where a.rowid<(select max(rowid) from test b where a.col1=b.col1 and a.col2=b.col2 and a.col3=b.col3)
第三种方法适合表中有少量重复数据的表
第四种方法:(临时表法)
Create table test2 as select distinct * from test;(建立临时表,表中存放不重复的值)
Truncate table test;(清空原来的表)
Insert into test select * from test2;(重新插入不重复的值)
当然第四种是比较麻烦的,也适合删除重复数据比较少的数据。
关于rowid,就是指数据库表中每一行的标示吧,
系统在你插入数据的时候要给每一行的数据分配一个rowid来进行标识每一行,从数据插入的那一刻起,rowid 就是定下来的了。