恩,个人空间,以后就开这个了

发布新日志

  • 数据库设计工具对比

    2008-08-18 11:14:48

    PowerDesign:PowerDesign是Sybase推出的主打数据库设计工具。PowerDesign致力于采用基于Entiry- Relation的数据模型,分别从概念数据模型(Conceptual Data Model)和物理数据模型(Physical Data Model)两个层次对数据库进行设计。概念数据模型描述的是独立于数据库管理系统(DBMS)的实体定义和实体关系定义。物理数据模型是在概念数据模型 的基础上针对目标数据库管理系统的具体化。

        ERWin:这个是CA公司的拳头产品,它有一个兄弟是BPWin,这个是CASE工具的一个里程碑似的产品。ERWin界面相当简洁漂 亮,也是采用ER模型,如果你是开发中小型数据库,极力推荐ERWin,它的Diagram给人的感觉十分清晰。在一个实体中,不同的属性类型采用可定制 的图标显示,实体与实体的关系也一目了然。ERWin不适合非常大的数据库的设计,因为它对Diagram欠缺更多层次的组织。

    如何一次性将表结构的脚本导出来?
        Database --->Generate Database ---> Genarate scrīpt 就可实现。

    Name用中文英文以便查询、写程序的时候方便, Code才是最终产生的Table Name

    PowerDesigner中建了模型,如何把它作为文档导出?
        利用REPORT。选择一个模板,然后就生成了RTF或是HTM格式的文档

    如何将已经存在的数据库所有表,导入到PowerDesign中?
        用PD里的反向工程file--->reverse engineering ===> and go on

    概念数据模型(CDM)
        CDM表现数据库的全部逻辑的结构,与任何的软件或数据储藏结构无关。一个概念模型经常包括在物理数据库中仍然不实现的数据对象。它给运行计划或业务活动的数据一个正式表现方式。不考虑物理实现细节,只考虑实体之间的关系。

    物理数据模型 (PDM)
        PDM叙述数据库的物理实现。主要目的是把CDM中建立的现实世界模型生成特定的DBMS脚本,产生数据库中保存信息的储存结构,保证数据在数据库中的完整性和一致性。

    面向对象模型 (OOM)
        一个OOM包含一系列包,类,接口和他们的关系。这些对象一起形成所有的(或部份)一个软件系统的逻辑的设计视图的类结构。一个OOM本质上是软件系统的一个静态的概念模型。

    业务程序模型(BPM)
        BPM描述业务的各种不同内在任务和内在流程,而且客户如何以这些任务和流程互相影响。BPM是从业务合伙人的观点来看业务逻辑和规则的概念模型,使用一个图表描述程序,流程,信息和合作协议之间的交互作用。

    正向工程
        你能直接地从PDM产生一个数据库, 或产生一个能在你的数据库管理系统环境中运行的数据库脚本。可以生成数据库脚本,如果选择ODBC方式,则可以直接连接到数据库,从而直接产生数据库表以及其他数据库对象。

    逆向工程
        将已存在的数据库产生进新的PDM 之内。数据来源可能是从脚本文件或一个开放数据库连接数据来源。

        并不是每个设计都需要用到Power Designer。 例如:小的系统,或Table数比较少的情况下就没有必要采用Power Designer了。

    设计步骤

    CDM PDM OOM三者转换关系

    2004-08-22更新

    PowerDesigner仅仅是实现的工具
        不要以为Power能帮你把关系什么的全部建立好,很多数据库理论只是还是需要的,设计数据库的时候,那些范式什么的,一定要掌握。
        设计一个好的数据库,最好的工具不是必须的,但是基础理论是一定要的。

    PowerDesigner用途不局限于数据建模
        还可以用PowerDweigner设计web service

    并不是每个设计都需要用到PD
        用Powerdesigner对付比较大型的项目,是很好的,对于短平快类型的项目,如果时间要求 你1个星期完成一个程序,那么完全没有必要用PowerDesigner,直接维护数据库就可以了,当表的数量超过10个(一个小系统的表在10个左右) 的时候,建议还是用用Powerdesigner 。
        我的看法:如果想做成一个比较规范的数据库,小项目也可以用。毕竟生成报表和正反向工程很有用。

    零碎

        PD中的CDM设计时,可以将所有需要的字段都定义好。然后在设计实体是直接取出来。PD提供了这样的统一管理的工具。在PD菜单栏-Model-Data Item下。

        为了使自己设计的CDM看起来象样一点,可以从工具栏中,拖动一个Title。其显示的信息,是当前CDM的属性值。

        为了使实体等Symbol看起来显眼和舒服。可以根据个人喜好进行外观上的调整。当前设计界面中,右键-Display Perferences中进行设置。还可以增加shadow效果。选中Symbol后,Ctrl+W。或者右键菜单。

        为了使布局整齐。选中需要调整的Symbol后,菜单-Symbol-Align进行设置。快捷键:ctrl+UP,ctrl+Down,ctrl+Left,ctrl+Right即为上下左右对齐。

        设计实体属性时注意的细节:M:表示强制非空;P:是否为主键;D:是否在模型中显示。gerenate:表示是否作为表生成。

        默认情况下,CDM的实体会显示Identifier一栏。如果不想其显示出来,在右键-Display Perferences中ObjectView-Entity中设置。

        关系的命名方法是:实体名1 实体名2。

        关系中的角色(Role)表示联系线上一个方向上的含义。用一个动词来描述。Role只是起一个描述作用。

        依赖(Dependency):表示在联系中一个实体的存在是否依赖于另一个实体。寄生实体(Dependent Entity)是一种部分地被另一实体确定的实体。在依赖联系中,一个实体与另一实体通过标识符相联系,当一个实体的存在没有另一个实体的存在作为参考就 不能唯一确定时,两个实体间就存在依赖联系。
        主从表就是典型的依赖关系。

        中间实体(Associative Entity):是为了解决多对多联系而产生的一个人工实体,能够为中间实体定义属性。用鼠标右键单击多对多联系线,在弹出的菜单中选择“Change to entity”,能够把这个联系转换成连接两个实体的中间实体。
        善于利用自动生成的中间实体,可以简化设计工作,提高数据库设计的正确性。
        中间实体一般不用再加入新的字段。

        牢记:外键是通过关系Relationship自动来建立的,不需要手动建立。不然会产生多余的键。所以设计时,关注实体本身的字段,以及实体间的关系,特别是多对多和依赖关系。

        从CDM到PDM的转换需要注意:


    不能改变Diagram的名称
    在树状图中,如果钩选红色标出的Symbol表示覆盖修改,不钩选表示保护修改。

        数据库为了保证数据完整性和一致性,提出了约束。即表约束,列约束以及参照完整性约束。通常数据库设计和程序开发不是绝对的分离的。所以前两者在实际开发过程中逐渐的完善。需要注意的还是参照完整性约束。
        在PD中前两者的设定是对字段,后者是对关系。

        参照完整性约束


    限制(Restrict)。不允许进行修改或删除操作。若修改或删除主表的主键时,如果子表中存在子记录,系统将产生一个错误提示。这是缺省的参照完整性设置。
    置空(Set Null)。如果外键列允许为空,若修改或删除主表的主键时,把子表中参照的外键列设置为空值(NULL)。
    置为缺省(Set Default)。如果指定了缺省值,若修改或删除主表的主键时,把子表中参照的外键设置为缺省值(Default)。
    级联(Cascade)。把主表中主键修改为一个新的值时,相应修改子表中外键的值;或者删除主表中主键的记录时,要相应删除子表中外键的记录。

        注意理解以上的约束时,抓住操作的都是主表。子表的操作都是相对主表来说的。操作方式就是Update和Delete。

        引用基础数据表的数据时,可以建立对应的视图。选中需要作为视图的表,菜单栏-Tools-Create View

        PD支持对已有数据的表更新表结构。不过需要谨慎操作,检查生成的SQL脚本。

        PD也可以生成随机的测试数据。

        触发器就是DBMS中提供的事件驱动机制。发生在表的Insert,Update和Delete。执行SQL语句或存储过程。

        在PD中可以完成存储过程的编写,也便于管理。

        逆向工程可以通过数据库脚本或者通过ODBC数据源来实现。

  • 解决silktest把B/S结构认成为C/S结构问题

    2008-08-15 11:48:59

    Silktest Question 2 : SilkTest recognises Internet Explorer as a Client/Server Application

    After enabling the extension by tools/extensions for browser, SilkTest shows browser as a client-server application and the following message appears

    SilkTest detected a Client/Server application.
    The required Extension has been enabled.

    There is only one solution for this problem with SilkTest testing tool. You have to recreate your windows user profile on the machine. You have to recreate your windows user profile on the machine: Login as administrator, go to the User Profiles tool from the Advanced tab of the System Properties dialog box. Once you do, select your user profile from the list and click the Delete button. Log on again as you and this will create a new user profile.

    P.S. If you want to save information from the profile, save that information individually i.e. if the you want to save your favorites copy the favorites to an other location and after deleting the profile copy the favorites back.
  • Silktest试用笔记(强烈推荐!)

    2008-08-15 11:21:00

    Silktest试用笔记(强烈推荐!)

    最近一段时间,因工作需要,偶用Qtp测试Dephi开发的C/S软件的过程中,遇到了一个尴 尬的问题,QTP不支持Dephi开发的软件,每次录制脚本完成后总是回放不成功,经常卡在一个特殊控件上然后报错,后来尝试手动修改了一些脚本代码,还 是不成功,再后来从网上查资料,才发现Qtp貌似不支持ADO协议,郁闷……

    无奈之下,只得去QQ群求救。流浪汉、Jackie、避风港给我推荐了Silktest这个工具,听他们说Silktest支持ADO协议,功能要比 Qtp强大,于是从网上下载了Silktest安装,运行Silktest后,却费了不少脑力,安装前从没想过使用Silktest比Qtp还要难用,单 从界面上不友好不说,连操作流程都很复杂,不易掌握。通过与高手们的交流,慢慢地弄清楚了Silktest的工作原理和基本操作方法。最后在高手的指点 下,终于能顺利录像、回放脚本了,从此不再为测试Dephi开发的C/S软件而烦恼了。

    以下是Silktest的基本操作流程的图文说明,测试对象为WinRAR压缩/解压缩软件(以下简称WinRAR),至于Silktest的工作原理就 不说了,相信大家看完下面就知道了。在此特别感谢流浪汉、Jackie、避风港的指点,如果没有他们,不知要折腾到什么时候才能完成任务呢,呵呵~

    Silktest 2006 R2 SP2 英文版(试用期30天,听高手们说如果还想继续使用的话就必须重装操作系统再安装该软件才能正常使用= =,另外还听说通过调系统日期的作弊方法也无效,囧~,强烈期待破解版发布……)
    下载地址:(请用迅雷下载)
    [url=http://58.251.57.67/down?cid=4ADFAC47B158131329BFC51566A9BBCF120822FC&t=2&fmt=-][size=2][color=#5d4baa]http://58.251.57.67/down?cid=4ADFAC47B158131329BFC51566A9BBCF120822FC&t=2&fmt=-[/color][/size][/url]


    快捷功能栏简介
    Open Project:新建/打开项目。
    Enable Extension:识别当前要测试的对象,如WinRAR压缩/解压缩软件等等。
    Set Recovery System:自动锁定测试对象的安装路径并启动主程序。如自动启动WinRAR主程序。
    Record Testcase:录制脚本。
    Run Testcase:回放脚本。
    Explore Result:查看测试结果。

    1、安装Silktest后,在快捷功能栏上点击“Open Project”按钮,在弹出的下拉菜单项选择“New Project”,打开New Project对话框窗口,然后点击“OK”按钮。

    [attach]40000[/attach]

    2、打开Create Project对话框窗口,在“Project Name”文本框随便输入名称,这里我输入“WinRAR”,然后点击“OK”按钮完成建立一个名称为WinRAR的项目。

    [attach]40001[/attach]

    3、这一步比较关键,先把Silktest程序窗口最小化,然后打开WinRAR(在桌面上依次点击开始-程序-WinRAR-WinRAR),注意必须 使WinRAR处于前台显示状态,且不能最小化窗口,这样才能被Silktest识别,切换到Silktest程序,点击快捷功能栏上的“Enable Extensions”按钮,打开Enalbe Extensions对话框窗口,在Application区域里选择“桌面-WinRAR”,然后点击“Select”按钮。

    [attach]40002[/attach]

    4、打开Extension Settings窗口,先勾上“Enable Accessibility”复选框,再点击“OK”按钮就完成设置了。注意:设置完成后,要重新启动WinRAR才能生效(不是Silktest),即 先关闭WinRAR,然后再打开,还要使WinRAR处于前台显示状态,同样不能最小化窗口。

    [attach]40003[/attach]

    5、点击快捷功能栏上的“Set Recovery System”按钮,打开Set Recovery System对话框窗口,在“Application”列表框里选择“桌面—WinRAR”,然后点击“OK”按钮即可完成设置,系统会在窗口左栏项目里 的“Include/Frame”文件夹下自动创建一个名称为“frame1.inc”文件。

    [attach]40004[/attach]

    6、点击快捷功能栏上的“Record Testcase”按钮,打开Record Testcase对话框窗口,在“Testcase name”文本框里随便输入名称,这里我输入“Test1”,然后在“Application state”下拉框里选择“DefaultBaseState”,最后点击“Start Recording”按钮开始录制脚本(在桌面右下方将会出现录制工具)。注意:录制脚本前,务必关闭当前的WinRAR窗口,因为Silktest会自 动启动WinRAR主程序,直到桌面右下方出现录制工具后,才可以对WinRAR进行操作。

    [attach]40009[/attach]

    7、录制完成后,点一下“Done”按钮退出录制工具,系统打开Record Testcase对话框窗口后,点击“Paste to Editor”按钮执行下一步操作。

    [attach]40010[/attach]

    8、系统打开“Update Files”对话框窗口,点击第二个单选按钮,点击“OK”按钮返回主界面。

    [attach]40011[/attach]

    9、在主界面的快捷工具栏上点击“保存”按钮(软盘形状),打开文本对话框窗口,在“文件名”随便输入名称,这里我输入“winrar”,点击“保存”按钮保存,系统会在窗口左栏项目里的“scrīpt”文件夹下自动创建一个名称为“winrar.t”文件。

    [attach]40012[/attach]

    10、点击快捷功能栏上的“Run Testcase”按钮,打开Run testcase对话框窗口,在“Testcase”列表框里选择“Test1”,点击“Run”按钮开始回放脚本。(在回放过程中,请勿手动操作,直到 系统打开Results窗口为止,测试报告都在Results窗口里)

    [attach]40013[/attach]

    [attach]40014[/attach]

    总结:经过数次试用后,笔者感觉SilkTest的功能方面远比Qtp,Winrunner强大多了,但Silktest至今还没有被破解过,使得该软件无法长期使用,不能不说是一个遗憾,不过面包还是会有的,相信不久就会有破解版了:)

    特别说明:偶仅对Dephi开发的C/S软件跑过测试,像诸如其他的编译环境如Java,C++,ASP.NET等等,还有对象类型B/S,以及很多协 议,偶没有测试过,请大家根据自己的需求测试,如有疑问或不明白的问题,请加偶QQ号32861838,因本人能力有限,所以也希望和大家一块学习,共同 进步。

    (转载请注明出处[url=http://dreamfox1.blog.sohu.com/][color=#262626]http://dreamfox1.blog.sohu.com[/color][/url] 请尊重他人劳动成果,谢谢!)
  • WEBLOGIC负载均衡原理如下

    2008-08-12 14:04:39

    CLUSTER概要
    一、 Cluster的概念及优势

    Weblogic支持集群技术,即让一组Server指向同一域名一起工作从而提供一个更强大、更可靠的应用平台。对于客户端而言,无论Cluster中有几个Server在工作,看上去都是一个。集群技术有两个最明显的特色:
    (1)可伸缩性:Cluster对加入其中的Server在性能上没有限制,为了提高性能,当客户端的请求大幅增加时,可以动态地向Cluster中添加Server。并且,配置Cluster当一台机器的资源没有被完全利用时,可以在同一机器上启动多个Server,但要求每一个Server使用不同的IP,而不能用同一IP的不同端口。
    (2)高可用性:由于在Cluster中同一service在多个Server上同时存放或放在一个共享文件系统中,因此相同的请求可以有多个Server提供,并且Server间还可以复制状态信息。这样,当其中某一Server宕机或无法响应请求时,其它的Server会立即接管它的任务,从而把应用和客户端完全隔离开来。

    二、Cluster的工作机制
    每一个Clustered service,在每一个server上都会有一个instance,即一个replica,这些replicas集合在一起形成一个replica-aware stub。这些stubs负责客户端与相关的服务器段对象的通信,当客户端请求该service时,实际上是向stub发出请求,stub根据不同的算法调用集合中某一replica,如果调用失败,stub会检测到错误并重新调用其它的replica。Cluster支持多种算法:随机、轮循、基于性能的负载均衡的轮循(Weight-based round-robin)、根据参数值调用(Parameter-based routing)。
    Weblogic Cluster通过负载均衡和容错最大程度的实现了它的可伸缩性和可用性。
    为了提高Cluster的可伸缩性,必须保证充分利用每一个Server。Weblogic可以在不同平台、不同性能的机器上安装Server并进行Cluster,然后采用Weight-based round-robin算法达到负载均衡,从而使每一个Server都得到充分的利用。
    为了使Cluster具有高可用性,必须具备故障恢复的能力,这一点可以通过replica-aware stub的容错功能来实现。Stub 主要是通过在检测到错误信息时重新进行调用的方式实现容错。当重新调用不会导致错误的结果时(如stub确认failed server不能接收到请求),容错功能自动实现。而有些情况下,重新调用可能会导致某一service被请求了多次的错误结果。例如:客户端C请求Clustered购物车服务中的additem()方法,replica-aware stub接收到请求,根据算法调用Server1上的service,Server1响应请求并返回结果,但在结果成功到达客户端之前,Server1出现错误。此时stub接收到错误信息,因此重新调用Server2上的这一方法,但实际上Server1已经将item加入购物车,这样就造成重复。为了解决这种问题,可以为服务添加一个唯一标识,如上述的additem()方法中可添加一个参数——序列号。每一个item有一个唯一的sequence,相同sequence的item不能被重复添加。

    三、 Cluster的命名服务

    在Weblogic Server中使用命名服务时,客户端通过JNDI存取service,JNDI tree上绑定了Server提供的所有的公共服务。Server提供一个新的service时,是将service以某一名称绑定到JNDI tree上,客户端和Server建立连接并按照名称获取相应的stub。
    Custer扩展了Server的这种命名服务机制,它不仅包含了每一个Server上的非Clustered的stub,而且包含了多个Server间的Clustered 的replica-aware stub。

    四、 Cluster的服务类型

    在Weblogic中,有多种服务可以进行cluster,如:RMI对象、EJB、Servlets、Jsp、Web Application。

    (1)RMI和EJB Clustering
    RMI和EJB对象在Cluster过程中使用JNDI命名服务机制。RMI和EJB对象发送remote stubs到客户端,客户端获取的这些stubs可以是已经clustered的,也可以是没有clustered的。对于Clustered的服务,Stubs根据负载均衡和容错的不同需求调用Cluster中合适的Server;而对没有Clustered的服务,所有对此stub的调用只能由提供此服务的Server来处理。
    有些有状态的RMI和EJB对象是不可以进行clustered的,因为客户端必须总是和同一个Server上的对象实例相联系。所有的EJB都是clusterable,虽然EJB也有有状态的,但是EJB home interface 都是无状态的,可以进行clustered,这样就可以从JNDI tree上获取 Clusterable EJB 的home stub 对象。然后通过home stub的方法创建或检索相应的EJB bean,若为stateful session bean 或entity bean,那么此时得到的stub就是不可clusterable。为了使有状态的对象可以更好的cluster,可以将一些操作作为一个事务来执行,如果工作中的Server出现意外,可以重新获取此对象并进行事务操作。
    RMI和EJB不同,RMI没有定义有状态和无状态分类,因此必须特意绑定一个有状态的RMI对象到Server上。可以仿效EJB home interface的方式即客户端从JNDI tree上获取一个clusterable factory method,然后factory method 可以调用集群中的任意一台Server,但是被调用的Server上必须有由此factory调用的对象。

    (2)Clustered Servlets
    Servlets也是可以进行Cluster的。对于Servlets,它用replica-aware proxy替代了replica-aware。这个proxy接受web server上所有请求,并转给集群中的某一Server。Proxy对cluster的所有请求进行负载均衡,并且当请求失败时会进行恢复处理。Proxy还可以在cluster中特别是Server没有正常完成请求响应时保持session状态。当session初始化时,proxy按照负载均衡算法选择一台Server保存session,此后,所有与此session相关的请求都由这同一台Server处理。为了避免当此Server出错时,无法保存客户端状态信息,所以session会被复制下来,并且session的所有变化都会在备份中进行及时更新,这样,当原有Server在响应请求过程中失败时,proxy会立即获取session的备份,并由此继续响应客户端请求,同时做新的复制。

    (3)JDBC clustering
    为了利用Weblogic Server cluster的负载均衡和容错的性能,Weblogic JDBC连接池也可以在replicated naming tree上注册。通常情况下,cluster中的每一个Server都进行连接池属性配置来访问同一个后端的DBMS实例,即对相同数据库的访问,每一个Server都有一个连接池。然后通过在配置文件中定义一个DataSource属性来在naming tree 上注册连接池。客户端使用Weblogic JDBC/RMI JDBC 驱动程序从cluster中获取数据库连接,即客户端按照DataSource name获取连接池,然后按照负载均衡的算法选择相应的Weblogic Server来响应请求。
  • Solaris和SunOS的区别

    2008-08-12 10:14:31

    简单得说,Sun OS是Solaris的其中一个部分。
    Solaris是SOE - Solaris Operating Environment的缩写,它包括以下主要部件:

    1.SunOS - 系统内核 (版本号是5.x)
    2.Windowing - 桌面环境JDS/CDE

    Solaris是操作环境

    SunOss是操作系统

    sun5.5=solaris2.5
    sun5.6=solaris2.6
    sun5.7=solaris2.7=solaris7
    sun5.8=solaris2.8=solaris8
    好像不叫sun5.9也没有叫solaris2.9的了只有solaris9
    好像是产品线定制的起名问题,跟实际的技术关系不大,愿意叫什么就叫什么
    比如win-nt4.0,win-nt5.0=win2000

  • 探讨JAR文件无限可能性

    2008-08-12 09:41:49

    JAR文件简介

    JAR文件以流行的二进制ZIP文件格式为基础,用以把许多文件合并成一个文件。它还包含一个名为META-INF的可选目录,这个目录位于文件根目录下。

    有两种方法可以建立JAR文件:应用命令行工具jar,或使用Java中的java.util.jar API编程。如果JAR文件包含在Java类路径中,使JVM可看到它,则JAR文件包含Java类和/或可由类加载器运行、使用及加载的资源。

    在许多情况下,JAR文件不仅仅是简单的Java类档案文件和/或资源;它们还可用来为应用程序和扩展建立语句块。META-INF目录(如存在)用于存储数据包和扩展配置数据,包括安全、版本、扩展和服务。

    META-INF目录的作用

    META-INF目录中的下列文件和目录获得Java 2平台的认可与解释,用来配置应用程序、扩展程序、类加载器和服务:

    MANIFEST.MF:清单文件,用来定义与扩展和数据包相关的数据。

    INDEX.LIST:这个文件由JAR工具的新“-i”选项生成,其中包含在一个应用程序或扩展中定义的数据包的地址信息。它是JarIndex的一部分,被类加载器用来加速类加载过程。

    x.SF:JAR文件的签名文件。x代表基础文件名。

    x.DSA:这个签名块文件与同名基础签名文件有关。此文件存储对应签名文件的数字签名。

    services/:这个目录存储所有服务提供程序配置文件。

    下面我们来了解一下每种组合。

    清单文件

    清单文件由“AttributeName: Value”对构成,一个换行符将其划分成两个部分:主要部分和单独部分,这两个被另外一个换行符分开。

    主要部分:这个部分包含JAR文件本身的安全和配置信息,以及此JAR文件构成的应用程序或扩展。它还定义适用于每个单独清单项的主要属性。这个部分没有名为“Name”的属性。本部分以一个空行结束。

    单独部分:这个部分为此JAR文件中包含的数据包或文件定义各种属性。并非所有的JAR文件都必须列举在清单文件中,但必须列出所有签名文件。清单文件本身不得列出。每个部分必须以一个名为“Name”的属性开始,它的值必须是一个文件相对路径,或档案文件外的一个绝对URL参考数据。(我将在本文后部分讨论JAR签名。)

    下面是清单文件最重要的属性:

    Manifest-Version:定义清单文件版本。它的值是一个上面规范描述的合法版本号。

    Created-By:详细说明生成这个清单文件的Java程序的版本和生产商。这个属性由JAR工具生成。

    Signature-Version:定义JAR文件的签名版本。该值应为一个有效的版本号字符串。

    Class-Path:这个属性值指定这个应用程序或扩展需要的扩展或库的相对URL。URL由一个或几个空格分隔。应用程序或扩展类加载器使用这个属性值建立它的内部搜索路径。

    Main-Class:这个属性用于单机应用程序。这个属性值定义主要应用程序类的相对路径,发射器在启动时会加载这些类。这个属性值不能在类名称后附加.class扩展名。如果你已经指定这个属性,JAR文件即变成可执行文件,应用程序将通过java –jar x.jar命令自动启动。

    Sealed:这个属性定义此JAR文件是否被密封。该值可为真或假,且忽略大小写。当JAR文件被密封时,一个可选的数据包可在某个特殊的版本中执行一贯性。在JAR中密封的数据包规定所有在那个数据包中定义的类必须源自相同的JAR;否则,就会产生一个SecurityException。例如,这段代码:

    Name: javax/servlet/internal/

    Sealed: true

    说明javax.servlet.internal数据包被密封,且这个数据包中的所有类必须从相同的JAR文件加载。要了解可选数据包的详细内容,请查看扩展机制。

    JAR签名文件

    任何JAR文件都可以通过java.security API,使用命令行jarsigner工具或目录进行签名。通过文件签名,你可以保证没人能够改变一个文件的内容,以及你正在使用一个知名厂商的JAR文件。如果JAR文件用jarsigner工具签名,那么每个文件,包括META-INF目录中的相关非签名文件,都将被签名。下面是与签名有关的文件:

    META-INF/MANIFEST.MF

    META-INF/*.SF

    META-INF/*.DSA

    META-INF/*.RSA

    META-INF/SIG-*

    每个签名器由一个扩展名为.SF的签名文件说明,这个文件的主要内容与清单文件相似。它由一个主要部分构成,其中包含由签名器提供的信息,但并不特别针对某个特定的JAR文件。主要部分的项目x-Digest-Manifest-Main-Attributes(这里的x是一个摘要算法)包含清单主要属性的摘要值。

    要使一个文件生效,首先将签名文件的一个摘要值与根据清单文件中对应的项目计算的摘要进行比较;然后,再将清单文件中的一个摘要值与根据“Name:”属性中的实际引用数据计算的摘要比较。“Name:”属性指定一个相对文件路径或RUL。

    例如,下面是一个签名JAR的清单文件:

    Manifest-Version: 1.0

    Created-By: 1.3 (Sun Microsystems, Inc)?br>

    Name: common/class1.class

    MD5-Digest: (base64 representation of MD5 digest)?br>

    Name: common/class2.class

    MD5-Digest: (base64 representation of MD5 digest)

    SHA-Digest: (base64 representation of SHA digest)

    下面是对应的签名:

    Signature-Version: 1.0

    MD5-Digest-Manifest-Main-Attributes: (base64 representation of MD5 digest)?br>

    Name: common/class1.class

    MD5-Digest: (base64 representation of MD5 digest)?br>

    Name: common/class2.class

    MD5-Digest: (base64 representation of MD5 digest)

    数字签名是.SF签名文件的一个签名版本。这些是人类无法解译的二进制文件。数字签名文件和.SF文件的名称相同,但扩展名不同。数字签名的类型不同,其扩展名也各不相同,通常为RSA或DSA。

    JAR目录

    为优化类加载器在网络应用程序,特别是applet中的类搜索过程,因此引入了JAR目录(一般称作JarIndex机制)。JarIndex机制收集在一个applet中定义的所有JAR文件,并将信息存储在applet的类路径的第一个JAR文件的一个目录文件中。下载第一个JAR文件后,applet类加载器将收集内容信息,这样可提高JAR文件的下载效率。

    系统对现有的JAR工具进行强化,使其能够检查一个JAR文件列表,并生成目录信息,说明哪些类和资源位于哪个JAR文件中。这些目录信息存储在根JAR文件META-INF目录中的一个名为INDEX.LIST的简单文本文件中。当类加载器加载根JAR文件时,它阅读INDEX.LIST文件,并用它建立一个由文件和数据包名称到JAR文件名列表的映射散列表。为了找到一个类或资源,类加载器查询散列表找到正确的JAR文件,如有必要,再下载这个文件。

    提供服务

    META-INF/services目录中的文件为服务提供程序配置文件。一个服务通常是一组著名的界面和(一般是抽象的)类。一个服务提供程序是一项服务的特殊执行过程。提供程序中的类往往执行上述界面并继承服务本身定义的类。

    服务提供程序通过把一个提供程序配置文件放在META-INF/services源目录中来识别自己。这个文件名应由完全合格的抽象服务类名称构成。

    应用这些特性

    了解JAR文件的这些特性后,你就可以在实际开发工作中创造性的应用它们。如果你已经有了一些有趣的使用方法,请在文章的讨论部分分享你的经验

  • tomcat5常见目录分布与代表意义及其类的加载顺序

    2008-08-12 09:38:01

    /bin:存放启动和关闭tomcat的脚本文件;
    /conf:存放tomcat的各种配置文件,比如:server.xml
    /server/lib:存放tomcat服务器所需要的各种jar文件(jar文件只可被tomcat 服务器访问)
    /server/webapps:存放tomcat自带的两个web应用:admin应用和manager应用。
    /common/lib:存放tomcat服务器以及所有web应用都可以访问的jar文件夹(web和tomcat服务器都可访问此jar)
    /shared/lib:存放web都可访问的jar文件。(可以被所有的web访问,但不能被tomcat访问)
    /logs:存放tomcat的日志文件
    /webapps:当发布web应用时,默认情况下把web应用文件放于此目录下
    /work:tomcat把由jsp生成的Servlet放于此目录
    另:在web应用中,WEB-Inf目录下,也可以建立lib子目录,在此子目录下可以存放各种jar文件,这些jar文件只能被当前web应用访问。其中,在web-inf目录下的lib与classes目录,Tomcat类装载器先装载classes目录下的类,再装载lib目录下的类。因为类同名时,classes优先。

    其中jsp运行时,查找class的顺序为:项目文件夹(WEB-INF\lib)===》容器文件夹(tomcat\common\lib)==》jdk文件夹(jdk\jre\lib\ext)

    Tomcat的class加载的优先顺序一览
    1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。
    2.环境变量CLASSPATH中的jar和class文件。
    3.$CATALINA_HOME/common/classes下的class文件。
    4.$CATALINA_HOME/commons/endorsed下的jar文件。
    5.$CATALINA_HOME/commons/i18n下的jar文件。
    6.$CATALINA_HOME/common/lib 下的jar文件。
    (JDBC驱动之类的jar文件可以放在这里,这样就可以避免在server.xml配置好数据源却出现找不到JDBC Driver的情况。)
    7.$CATALINA_HOME/server/classes下的class文件。
    8.$CATALINA_HOME/server/lib/下的jar文件。
    9.$CATALINA_BASE/shared/classes 下的class文件。
    10.$CATALINA_BASE/shared/lib下的jar文件。
    11.各自具体的webapp /WEB-INF/classes下的class文件。
    12.各自具体的webapp /WEB-INF/lib下的jar文件。

    class的搜寻顺序如下
    -------------
    /WEB-INF/classes of your web application 
    /WEB-INF/lib/*.jar of your web application 
    $CATALINA_HOME/common/classes 
    $CATALINA_HOME/common/endorsed/*.jar 
    $CATALINA_HOME/common/i18n/*.jar 
    $CATALINA_HOME/common/lib/*.jar 
    $CATALINA_BASE/shared/classes 
    $CATALINA_BASE/shared/lib/*.jar 
    --------------
    因此放在不同webapp里的class文件,会被classloader加载成不同的实例。
    例如假设下面两个不同内容的class。分别放在不同的webapp的class目录下。
    package com.lizongbo;
    public class TestClass {
      private String NAME="lizongbo";
    }

    package com.lizongbo;
    public class TestClass {
      private String NAME="li_zongbo";
    }

    在不同的webapp得到的com.lizongbo.NAME结果是不同的,且互不影响。
    但是注意,以下包名开头的class例外:
    javax.* 
    org.xml.sax.* 
    org.w3c.dom.* 
    org.apache.xerces.* 
    org.apache.xalan.* 

    ps,注意.在各个jar中的\META-INF\MAINFEST.MF文件里Class-Path键值对,也会提供jar的加载优先顺序。
    例如某jar的MAINFEST.MF内容如下:
    Manifest-Version: 1.0
    Created-By: lizongbo
    Class-Path: commons-beanutils.jar
    Class-Path: commons-collections.jar
    Class-Path: commons-dbcp.jar
    Class-Path: commons-digester.jar
    Class-Path: commons-logging.jar
    Class-Path: commons-pool.jar
    Class-Path: commons-services.jar
    Class-Path: commons-validator.jar
    Class-Path: jakarta-oro.jar
    Main-Class: com.lizongbo.MyTestClass


    那么在加载这个jar的时候,会先在此jar所在目录下依次先加载commons-beanutils.jar,commons-collections.jar。。。等jar文件。

    在不同的地方放置jar和class可能会产生意想不到的后果,,尤其是不同版本的jar文件,因此在实际应用部署web应用时候要特别留心.

    例如 使用javamail常见的一个出错信息:
    javax.mail.NoSuchProviderException: No provider for smtp
    其真实原因就很可能如下:
    在不同的加载jar的目录下放置了不同版本的mail.jar,比如一个是javamail1.3.1的mail.jar
    在D:\jakarta-tomcat-5.5.8\common\lib下,而另外一个是javamail1.3.2的mail.jar在
    D:\jakarta-tomcat-5.5.8\webapps\lizongbo\WEB-INF/lib下,
    那么lizongbo这个webapp中使用到javamail进行邮件发送的时候,便会出现No provider for smtp的错误。

  • Tomcat 5.0.xx /WEB-INF 目录使用说明

    2008-08-12 09:32:52

    JSP 2 发布的同时增加了一些新的规则及语法,但多数服务器仍兼容运行 JSP 2 以前版本的程序,Tomcat 5.0.xx 为支持 JSP 2 及兼容 JSP 2 以前版本,在 /WEB-INF 目录下做了相应的配置,其具体方法简述如下:

    /WEB-INF/web.xml 你的Web应用程序配置文件,这是一个XML文件,其中描述了 servlet 和其他的应用组件配置及命名规则;

    /WEB-INF/classes/ 这个目录包含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中。

    站点的类的存放规则应该按照Java的打包规则执行。例如: 有一个类命名为 com.mycompany.mypackage.MyServlet, 你应该按照以下形式部署: /WEB-INF/classes/com/mycompany/mypackage/MyServlet.class ;

     /WEB-INF/tags/ 标签文件库,存放了客户定义的标签文件,该目录并不一定为 tags,用户可以根据自己的喜好和习惯为自己的标签文件库命名,当使用了用户定义的标签文件库名称时,在用户使用标签文件时就必须声明正确的标签文件库路径。例如:当自定义标签文件库名称为 simpleTags 时,在使用 simpleTags 目录下的标签文件时,就必须在 jsp 文件头声明为:<%@ taglib prefix="tags" tagdir="/WEB-INF/simpleTags" % >;

    /WEB-INF/jsp/ Jsp 1.2 以下版本的文件存放位置。改目录没有特定的声明,同样,用户可以根据自己的喜好与习惯来命名。此目录主要存放的是 Jsp 1.2 以下版本的文件,为区分 Jsp 2.0 文件,通常使用 jsp 命名,当然你也可以命名为 jspOldEdition ; ^_^ /WEB-INF/jsp2/ 与 jsp 文件目录相比,该目录下主要存放 Jsp 2.0 以下版本的文件,当然,它也是可以任意命名的,同样为区别 Jsp 1.2 以下版本的文件目录,通常才命名为 jsp2。

  • tomcat目录含义

    2008-08-11 17:15:03

    假设你已将Tomcat解压,你已得到下列目录结构:
        目录名--描述
        bin
        包含启动/关闭脚本
        conf
        包含不同的配置文件,

        包括 server.xml(Tomcat的主要配置文件)和为不同的Tomcat配置的web应用设置缺省值的文件web.xml
        doc
        包含各种Tomcat文档
        lib
        包含Tomcat使用的jar文件.unix平台此目录下的任何文件都被加到Tomcat的classpath中
        logs
        Tomcat摆放日志文件的地方
        src
        ServletAPI源文件.先别高兴,这些只有些必须在Servlet容器内实现的空接口和抽象类
        webapps
        包含web项目示例
       

    此外你可以Tomcat会创建如下目录:
        work
        Tomcat自动生成,放置Tomcat运行时的临时文件(如编译后的JSP文件).如在Tomcat运行时删除此目录.JSP页面将不能运行.
        classes
        你可以创建此目录来添加一些附加的类到类路径中.任何你加到此目录中的类都可在Tomcat的类路径中找到自身.

    ---------------------------华丽的分割线---------------------   

    Tomcat的配置文件

        Tomcat的配置基于两个配置文件:
        1.server.xml - Tomcat的全局配置文件
        2.web.xml - 在Tomcat中配置不同的关系环境

        server.xml
        server.xml是Tomcat的主配置文件.完成两个目标:

        1 提供Tomcat组件的初始配置.
        2 说明Tomcat的结构,含义,使得Tomcat通过实例化组件完成起动及构建自身, 如在server.xml所指定的

        server.xml种的重要元素:

        元素及其描述
        Server
        server.xml文件中最重要的元素.Server定义了一个Tomcat服务器.一般你不用对他担心太多.Server元素能包含Logger和ContextManager元素类型
        Logger
        此元素定义一个Logger对象,每个Logger都有一个名字去标识,也有一个纪录Logger的输出和冗余级别(描述此日志级别)和包含日志文件的路径.通常有servlet的Logger(ServletContext.log()处),JSP和Tomcat运行时的Logger。

        ContextManager
        ContextManager说明一套ContextInterceptor, RequestInterceptor , Context和他们的Connectors的配置及结构.ContextManager有几个随同提供的特性:
        1. 用来纪录调试信息的调试级别
        2. webapps/,conf/,logs/和所有已定义的环境的基本位置.用来使Tomcat可以在TOMCAT_HOME外的其他目录启动.
        3. 工作目录的名字

        ContextInterceptor&RequestInterceptor

        这些侦听器(interceptors)侦听具体发生在ContextManager中的事件.例如,ContextInterceptor侦听Tomcat的启动及终止事件,RequestInterceptor监视在它服务过程中用户请求需要通过的不同阶段.Tomcat的管理员不必知道太多关于侦听器的知识;另外,开发者应该知道这是如何在Tomcat中实现一个”全局”型的操作(例如安全性及每个请求日志)
        Connector
        Connector表示一个到用户的联接,不管是通过web服务器或直接到用户浏览器(在一个独立配置中).Connector负责管理Tomcat的工作线程和 读/写 连接到不同用户的端口的 请求/响应.Connector的配置包含如下信息:
        1.句柄类
        2.句柄监听的TCP/IP端口
        3.句柄服务器端口的TCP/IP的backlog.
        Context
        每个Context提供一个指向你放置你Web项目的Tomcat的下属目录。每个Context包含如下配置: [Page]
        1. Context放置的路径,可以是与ContextManager主目录相关的路径.
        2.纪录调试信息的调试级别
        3.可重载的标志.开发Servlet时,重载更改后的Servlet,这是一个非常便利的特性,你可以调试或用Tomcat测试新代码而不用停止或重新启动Tomcat.要打开重载,把reloadable设为真即可.这虽花费时间但可检测所发生的变化;更重要的事,鉴于,在一个装载类对象装入一个新的servlet时,类装载触发器可能会掷出一些错误.为避免这些问题,你可以设置可重载为假,这将停止重载功能.


        web.xml

        Tomcat可以让用户通过将缺省的web.xml放入conf目录中来定义所有关系环境的web.xml的缺省值.建立一个新的关系环境时,Tomcat使用缺省的web.xml文件作为基本设置和应用项目特定的web.xml(放在应用项目的WEB-INF/web.xml文件)来覆盖这些缺省值.

  • 视图的概念

    2008-08-07 15:43:23

    视图是原始数据库数据的一种变换,是查看表中数据的另外一种

    方式。可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的

    数据。

        视图是从一个或多个实际表中获得的,这些表的数据存放在数据

    库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从

    另一个视图中产生。

        视图的定义存在数据库中,与此定义相关的数据并没有再存一份

    于数据库中。通过视图看到的数据存放在基表中。

        视图看上去非常象数据库的物理表,对它的操作同任何其它的表

    一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反

    地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑

    上的原因,有些视图可以修改对应的基表,有些则不能(仅仅能查询)。

     

    视图的作用

         * 简单性。看到的就是需要的。视图不仅可以简化用户对数据的理

    解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,

    从而使得用户不必为以后的操作每次指定全部的条件。

        * 安全性。通过视图用户只能查询和修改他们所能见到的数据。数

    据库中的其它数据则既看不见也取不到。数据库授权命令可以使每个用

    户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特

    定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上:

          使用权限可被限制在基表的行的子集上。

          使用权限可被限制在基表的列的子集上。  

          使用权限可被限制在基表的行和列的子集上。  

          使用权限可被限制在多个基表的连接所限定的行上。  

          使用权限可被限制在基表中的数据的统计汇总上。

          使用权限可被限制在另一视图的一个子集上,或是一些视图和基表

    合并后的子集上。

         * 逻辑数据独立性。视图可帮助用户屏蔽真实表结构变化带来的影响。

     

    视图的安全性

         视图的安全性可以防止未授权用户查看特定的行或列,是用户只能

    看到表中特定行的方法如下:

        1 在表中增加一个标志用户名的列;

        2 建立视图,是用户只能看到标有自己用户名的行;

        3 把视图授权给其他用户。

     

    逻辑数据独立性

        视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,

    应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,

    从而程序与数据库表被视图分割开来。视图可以在以下几个方面使程序

    与数据独立:

        1 如果应用建立在数据库表上,当数据库表发生变化时,可以在表

    上建立视图,通过视图屏蔽表的变化,从而应用程序可以不动。

        2 如果应用建立在数据库表上,当应用发生变化时,可以在表上建

    立视图,通过视图屏蔽应用的变化,从而使数据库表不动。

        3 如果应用建立在视图上,当数据库表发生变化时,可以在表上修

    改视图,通过视图屏蔽表的变化,从而应用程序可以不动。

        4 如果应用建立在视图上,当应用发生变化时,可以在表上修改视

    图,通过视图屏蔽应用的变化,从而数据库可以不动。

  • 查询经典语句

    2008-07-31 09:28:23

    SQL分类:
    DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
    DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)
    DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

    首先,简要介绍基础语句:

    1、说明:创建数据库
    CREATE DATABASE database-name

    2、说明:删除数据库
    drop database dbname

    3、说明:备份sql server
    --- 创建 备份数据的 device
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'

    --- 开始 备份
    BACKUP DATABASE pubs TO testBack

    4、说明:创建新表
    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

    根据已有的表创建新表:
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only

    5、说明:删除新表drop table tabname

    6、说明:增加一个列
    Alter table tabname add column col type
    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

    7、说明:添加主键: Alter table tabname add primary key(col)
    说明:删除主键: Alter table tabname drop primary key(col)

    8、说明:创建索引:create [unique] index idxname on tabname(col….)
    删除索引:drop index idxname
    注:索引是不可更改的,想更改必须删除重新建。

    9、说明:创建视图:create view viewname as select statement

       删除视图:drop view viewname

    10、说明:几个简单的基本的sql语句

    选择:select * from table1 where 范围
    插入:insert into table1(field1,field2) values(value1,value2)
    删除:delete from table1 where 范围
    更新:update table1 set field1=value1 where 范围
    查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count * as totalcount from table1
    求和:select sum(field1) as sumvalue from table1
    平均:select avg(field1) as avgvalue from table1
    最大:select max(field1) as maxvalue from table1
    最小:select min(field1) as minvalue from table1

    11、说明:几个高级查询运算词

    A: UNION 运算符

    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

    B: EXCEPT 运算符

    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。

    C: INTERSECT 运算符

    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
    注:使用运算词的几个查询结果行必须是一致的。

    12、说明:使用外连接
    A、left outer join:

    左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    B:right outer join:
    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

    C:full outer join:
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

    其次,大家来看一些不错的sql语句

    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    法一:select * into b from a where 1<>1
    法二:select top 0 * into b from a

    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
    insert into b(a, b, c) select d,e,f from b;

    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

    4、说明:子查询(表名1:a 表名2:b)
    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

    5、说明:显示文章、提交人和最后回复时间
    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

    6、说明:外连接查询(表名1:a 表名2:b)
    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    7、说明:在线视图查询(表名1:a )
    select * from (SELECT a,b,c FROM a) T where t.a > 1;

    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
    select * from table1 where time between time1 and time2
    select a,b,c, from table1 where a not between 数值1 and 数值2

    9、说明:in 的使用方法
    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

    10、说明:两张关联表,删除主表中已经在副表中没有的信息
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

    11、说明:四表联查问题:
    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

    12、说明:日程安排提前五分钟提醒
    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

    13、说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

    14、说明:前10条记录
    select top 10 * form table1 where 范围

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

    16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA ) except (select a from tableB) except (select a from tableC)

    17、说明:随机取出10条数据
    select top 10 * from tablename order by newid()

    18、说明:随机选择记录
    select newid()

    19、说明:删除重复记录
    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

    20、说明:列出数据库里所有的表名
    select name from sysobjects where type='U'

    21、说明:列出表里的所有的
    select name from syscolumns where id=object_id('TableName')

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
    显示结果:
    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3

    23、说明:初始化表table1
    TRUNCATE TABLE table1

    24、说明:选择从10到15的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
      
    随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
      对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:
    Randomize
    RNumber = Int(Rnd*499) +1
     
    While Not objRec.EOF
    If objRec("ID") = RNumber THEN
    ... 这里是执行脚本 ...
    end if
    objRec.MoveNext
    Wend
     
       这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一 个数据库内就包含了成千上万条记录。这时候不就死定了?
      采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:
    Randomize
    RNumber = Int(Rnd*499) + 1
     
    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber
     
    set ōbjRec = ObjConn.Execute(SQL)
    Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")
     
      不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
    再谈随机数
      现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。
      为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:
    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3
     
      假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码):
    SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"

      注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。

     
    随机读取若干条记录,测试过
    Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)
    Sql server:select top n * from 表名 order by newid()
    mysqlelect * From 表名 Order By rand() Limit n
    Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)
    语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
    使用SQL语句 用...代替过长的字符串显示
    语法:
    SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename
    Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;
     
    Conn.Execute说明
    Execute方法
      该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:
        1.执行SQL查询语句时,将返回查询得到的记录集。用法为:
        Set 对象变量名=连接对象.Execute("SQL 查询语言")
       Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。

        2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:
        连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]
          ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。
          ·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。

    ·BeginTrans、RollbackTrans、CommitTrans方法
      这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。
      事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。
       BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过 连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一 个错误信息。

  • Linux,FreeBSD,Solaris,AIX,HP-UX的比较

    2008-07-31 08:49:06

    Linux,FreeBSD,Solaris,AIX,HP-UX的比较

    作者dream_bird

    从现在的应用情况来看,目前的类UNIX操作系统大概有如下几种:

    商业的有Solaris、AIX、HU-UX、Irix和DEC的true64(大概是叫这个名字吧,我从来没用过的说),其他的象什么SCO、BSDI的就不算在内了,用的人相对要少的多了。

    open source的有 linux(n种发行版)、freebsd、openbad、netbsd等,当然要说solaris是open的我也同意,勉强算是吧。

    应用的广泛程度应是linux>*BSD(主要是freebsd)、Solaris>AIX>HU-UX>true64>Irix,这是个大概的顺序(或许是我认为的顺序,不一定准确,别计较)。

    我就从其中选四种来比较比较(主要是我比较熟悉的):
    redhat linux、freeBSD、Solaris和AIX。至于比较的方面有两个,一是新兴的企业级应用(如数据库,应用服务器等),二是传统的网络应用(比如邮件、域名等)。

    先说企业应用吧,做企业级的应用的时候,你的选择机会(指操作系统)并不是很多的,比如说你要用IBM或者BEA的应用服务器产品的话,操作系统不是 Solaris就是AIX之类的商业系统,虽然linux现在也挤进了这个队伍,但是并不是主力,数据库也是这个样,比如你要用DB2,当然是AIX最好 了,而你要用Oracle,也不过是几个商业平台上来选(当然linux现在也行)。不过随着这些应用而来的是一些有关HA、存储和备份等问题,一般的解 决方案也都是比较商业化的,对于操作系统的选择余地不大,比如说用DB2的人大部分都用ADSM做备份的,没什么好想的。从这个角度来看Solaris、 AIX和HP-UX都没有什么太大的区别。

    好,肯定有人要说我了,Solaris多不好管理,AIX的smit和HP-UX的sam多好啊。我可以猜到,这些朋友大多是做所谓的系统集成、 售前或者用时髦的话叫什么ASP的,而不是直接的7x24x365的做系统维护的。如果你真的7x24x365的维护系统的话,你就会体会到smit之类 的东西在出现复杂问题的时候并不是很有效的工具,而且用惯了smit的系统管理员在遇到复杂问题的时候几乎是没有什么办法,因为他们几乎从来就没有详细的 了解过自己的系统,这是问题的关键。极端的情形来讲,AIX(有时应该包括HP-UX)的系统管理员是相对比较差的UNIX系统管理员,很多时候他们说不 出配置文件的位置,至于编写脚本的能力就更不用说了(我见过很多IBM的人都是这样的),当然不能以偏盖全,也有很多好的,我见过的。

    而Solaris的系统管理似乎象一种文化,有时候是对SUN的不满,比如说,为什么没有象smit之类的工具,为什么缺省的shell这么的 傻,为什么打patch这么费劲,Solaris 8带的Perl有这样或那样的问题,等等。但你如果注意的话你就会发现,针对这些问题,你总会找到类似的回答,你可以改某个配置文件,或者你到 sunfreeware去下载什么软件,等等,也是有很多的方法的。总之,问题都会解决的,而且没有想象的难,同时系统管理人员也逐渐成熟了。OK,也许 有的朋友可能说了,你说的这些和企业应用没什么关系,其实不然的,如果你是7x24x365的维护系统,那你就会知道,没有什么系统管理任务是你永远不会 遇到的,在这种环境下需要系统管理员了解系统。在这方面Solaris的系统管理员往往熟悉配置系统的每个细节,在出现问题的时候他们也可以马上解决。

    从这方面看,我比较喜欢用Solaris。

    再看看传统的网络服务吧,这些传统的网络服务程序往往都是free的,比如sendmail、BIND、apache等等。在这方面BSD系统有其较大的优势,主要是这些程序往往都是在BSD系统上发展起来的,当然现在其他平台也都不差。

    在这里我先要淘汰出去的就是AIX。你也许可以找到AIX上的gcc程序(当然不是源代码,我可没兴趣做两次编译),不过我是没有用过,也不知道 是什么格式,不知道是安装包还是一个tgz文件,要是tgz就更坏了是先有鸡还是先有蛋呢,而且对于这些free的程序,我觉的还是用gcc比IBM C好,gcc肯定不会有问题。至于AIX带的BIND或者是sendmail,我是不敢用的,没有理由不升级到新的版本,除非你太懒了。总之,不太开放的 系统不适合做传统的网络服务。

    剩下的就是linux、BSD和Solaris了,这些网络应用他们都可以完成,而且在难度上没有什么太大的区别。但是,linux和BSD是 IA架构上的系统,不说性能,单说硬件配置复杂程度PC就比SUN的麻烦的多,如果你要在PC服务器上用linux或者FreeBSD的话,十有八九你得 重新编译内核,从这方面看Solaris要好的多了。

    在这里顺便说一件有趣的事情,这也是我对选择操作系统问题发生兴趣的原因,我们单位有一台alpha的服务器,以前运行openVMS,几乎没人 用了,所以我决定把它改成freeBSD,结果安装顺利,而且几乎没有从新编译内核的必要(当然不包括为提高性能而编译内核了,不过缺省的也不错的)。打 那以后我就对PC的乱七八糟的硬件类型没了兴趣。

    言归正传,在安装linux、freeBSD和Solaris的时候,缺省安装软件最少的是Solairs,其次是linux,而freeBSD 是最多的(当然包括那些port了)。redhat安装软件的时候往往把程序缺省的目录改的一塌糊涂,如果你要用的程序找不到RPM包的话,你就有的忙 了,在编译前configure的时候得写一堆参数,而且说不定你编译后不能用,也是有可能的。freeBSD的安装要做的好多了,尤其是port,用的 很爽,不过我也发现过问题,主要是在编译port时候,程序之间关联的问题,比如有的程序(我记不清是什么了,好象和XML有关的东西)要用unzip, 但是我当时还没有编译unzip,照道理unzip应该被自动的编译吧,可是freeBSD就出错了,停在那里,没办法我只好先编译了unzip。而 Solaris就不一样了,你安装的时候几乎想要的什么程序都没有,然后你上sunsite或者sunfreeware找,实在没有的你就得编译了,不过 这也有好处的,系统的配置都是你自己完成的,只要你保证自己不出错,系统的稳定性就是绝对的一流,你可以随心所欲的配置系统。

    从这方面看Solaris也是不错的。

    当然,有时候Solaris也有问题,比如我在Solaris上编译openldap就很费劲,实际上现在很多free的项目都是在linux或者BSD上做的然后才port到其他的平台上的,从这方面来看,linux和BSD要比其他的系统好的多了。

    另外声明,我不是SUN的人,有些攻击性很强的朋友千万不要说我在做广告,我和SUN没有任何的瓜葛,我甚至于可以说我目前的工作几乎没有什么商业色彩,我只是说说我的想法。

    万一有言语不周,或者有错误的地方,还请见谅。
  • 干软件测试三年了,对行业的看法(原创,欢迎拍砖)

    2008-07-30 11:22:55

    干软件测试三年了,对行业的看法(原创,欢迎拍砖)


    昨天是2008年7月11日,我入职满三年之日。很多公司都把三年作为一个新人当作公司自己人的一个标志,就像《忠奸人》里所说,这是He's a friend of ours和He's our friend的区别。呆在一个行业里久了,即使再愚钝,也能看出这个行业的整体趋势来。现在大体聊聊这三年对这个行业的看法:
        1、软件测试热门不热门?
        在google中输入“软件测试”,它告诉你共有487万项符合要求的网站。当你看到这篇博客的时候,这个数字可能又增长了,至少,我又贡献了一篇(笑)。看起来蔚为壮观吧,满眼都是用词火辣的新闻告诉你软件测试有多热门、多高薪。
        好了,如果你有基本的新闻鉴别能力的话,你应该能看得出,这些都是软文,全部都是,无一遗漏。赤裸裸的软文。机缘巧合,我有机会接触到几个在软件测试培训机构的朋友,就是目前很热门的“BTEST”和“北大青鸟”。上述你搜到的各个网站发的这些文章,都是他们进行媒体公关的结果。不信?你看看文章的结尾,都或明或暗地提到“你丫该去找个软件测试机构培训一下了”。感觉自己上当了吧?适当问候一下欺骗你感情的媒体吧。
        软件测试工程师的确在国内很紧缺。但是,这个趋势不会持久,这十年来,类似的热门IT岗位我可以举出几十个:网络工程师、WEB程序员、JAVA程序员、嵌入式工程师,不一而足。它们现在怎么样了?全都处于过饱和状态。他们全都是明日黄花了,一朵朵都已经凋谢。软件测试工程师也不例外,它们的今天就是软件测试工程师的明天。
        那这行还能干么?能,只要你够NB。(废话,忽略之。)由于入门门槛不高,初级软件测试人员很快会处于过饱和状态,顶多3年,就会成为街边的地摊货。而且,月薪会低得可怜。但是,高级人才还是会保持紧俏,这在哪个行业都是如此。目前国内的软件测试的水平还普遍偏低,高级人才依然非常少,依然很值钱。
        什么是高级人才?说一下自己不成熟的看法。数据库、中间件、Windows、Linux、Unix都能深刻理解原理,能调整内核参数,如果只是会用那就算了。完全掌握某一门程序语言,达到开发人员的水平,可以写出一切自己想要的小工具。自动化测试、性能测试、白盒测试、安全测试,四个都比较熟悉,并至少精通其中的一个。而且,英语水平要能达到和老外正常沟通。达到这个水平,就很可以笑看云卷云舒了,你已经接近神了,凡人要忍受的裁员、生活压力等痛苦都与你无关。你只需用一颗慈悲的心去同情他们。
        那么报纸上说的,“月薪8千找不到高级软件测试人才”是什么意思?别逗人笑了!这是无知记者想当然编出来的谎话。长安城内,月薪8千顶多找个熟练的中级工程师,真正的高级工程师是不会在菜市场里贴上标签月薪8千代售的,他们只会安静地坐在写字楼里,等着猎头给他们打电话,然后面无表情地回答:“OK,deal.”
    2、关于技术和商务    
        我只是从事过技术,并没有做过商务,但是通过自己的好朋友了解了不少。总的来说,作为技术,除非是去摩根之类的投行做IT,否则在IT公司做技术员工的话,不当领导或当小领导,很牛逼的人,年薪20~25万是上限了,IBM的band8\band9大致如此。有年薪百万的,实在太少。作商务的话,同样的公司,同样程度的员工,年薪的上线应该是50~60W。接触过猎头的朋友都了解,猎头接到命令年薪50w去挖一个商务人员不奇怪,但是如果接到命令年薪50w去挖一个技术员,那雇佣方肯定脑子秀逗了。技术和商务相形见绌,作为IT技术人员,很不甘心,但是,这是事实,铁一般的血淋淋的事实。我们从来不怕落后,只怕自己不敢承认落后。
        商业是一切活动的润滑剂,这个领域是独特而有魅力的。从市场宣传到寻找定位、售前、销售,每一步都是和活生生的人打交道,他们不用彻夜加班。但并不见得就比技术轻松。做商务的好处在于,他们积累的是人脉和关系,这使他们越老越值钱,而且不用被驱动着每天熬夜看书更新自己的知识。而做技术,一个季度不学习,就会有很多新出的东西不明白了。即使你年薪20万,你仍然需要每天下班后熬夜学习新的技术。
        上面这么一对比,技术和商务高下立见。技术相对挣得少,还要每天学习,担心自己老了会失业。但是不要这么轻易就动摇,有的人是天生的程序员,和人说话会咬自己舌头,但写代码就像吸白粉,那你就每年领个20万,可以活得很滋润了,不必转行,不要嫌商务的赚钱比自己多,全聚德的烤鸭卖得好,做烤鸭的师傅肯定挣得不多,就是这个道理;有的人天生喜欢和人打交道,鬼话说得连自己都信,一群人中国人在一起开会就是要用英文,那他天生适合一年领个50万;但如果你是个中间派,不知道自己适合干什么,我也不能告诉你答案,我只能告诉你每个选择的最好结果是如上所述。
    3、关于国内企业和外企
        简单地说:外企钱多,但是年薪50万后,上头都是新加坡和香港的假鬼子了,你上不去。而且IT外企在中国没有核心研发。私企的钱比外企少好几个档次(百度例外),但是,如果你觉得自己很牛,到了犇的级别,就来私企,搞核心研发,要股份(这是关键),工资少,算上股份就比外企多了。
        如果是没牛到那个地步,该怎么选择,相信你看了上面应该已经明白了。
    4、关于创业和打工
        我现在还没有魄力创业,如果没有人脉,要创业,三思。卖馄饨的能搞几千万,但是几千万个里面只有这一个成功了。

    特此: 这是我在博客中写的,第一次发这种装逼文,我算不上技术大犇,但是我的生活圈子能保证文章资料的真实性。我只是一个普通人,不过想让生活过得好一点点。
  • 华为中兴比较,各种传闻的收集,跳槽参考

    2008-07-30 10:58:44

    华为中兴比较,各种传闻的收集,跳槽参考


    忠告: 主人翁精神那是旧时代的口号,现代需要的是职业化精神,职业IT民工,别把自己当老板 [email=!@#$]!@#$%[/email]^& @_@
          网上骂骂咧咧,老外知道了,只会说这帮中国佬素质差,做得东西烂,精力全放在窝里斗了
    默默做事偷偷跳槽, 各奔前程; 不满不要随便发表牢骚,你是老大听到了也不会高兴的,嘴巴爽了,钱包受伤了,小人还是较多的小道消息传播还是很快的.
    华为中兴比较,各种传闻的收集,错了请大家指正,不是事实的地方随时修改:
    试用期:
    中兴 工资80%
    华为 工资100%
    第1年奖金都很少;  工资多少这个自己谈就知道了,也许中兴比华为高很多,你会更划算
    月收入:
    中兴 月工资 + 餐补15*上班天数 + 免费班车
    华为 月工资 + 1000或800 的交补伙补
    加班费:
    中兴 无;  中兴周6一般有加班, 也可不去的说? 自己掂量下
    华为 (月工资/30/8)*加班小时数(仅限周末), 华为有一个每月末加班一天抵年休假,没加班费
    笔记本
    中兴: 员工公司各出一半钱;所有权员工拥有?
    华为: 笔记本免费;所有权公司拥有
    性格:
    中兴: 谨慎
    华为: 豪赌
    报销:
    ZTE的出差补助不用纳税,HW的要扣20%的税;
    中兴:到机场只能报销大巴费? 出差住宿按级别报销?
    华为:到机场报销打的费? 出差住宿未知?
    保险公积金(工资比例不知)
    中兴 保险 无公积金
    华为 保险 + 公积金
    氛围:
    都是大企业,官僚作风差不多
    中兴:国有民营,更像国企,或者说是典型的国企,企业形象整体较内向,闷骚型?以前视野多局限于国内,现在好像想变
    华为:民营企业,不知道怎么形容,企业形象整体较外向,流里流气的?   以振兴民族企业为口号,视野扩展到了于国外
    管理:
    中兴在向华为学习,起步较晚,正在学习中
    华为在向西方学习,起步较早,相对而言模型已有,但执行还比较粗糙
    目标或标杆企业:
    中兴: 标杆企业--华为
    华为: 标杆企业--爱立信/思科
    内斗:
    有句话:"有人的地方就有争斗",或者"有中国人的地方就有窝里斗",想找世外桃源? 醒醒吧
    中兴: 网上早期传出的内斗消息很少,近来也多了起来,牛嘛,典型的国企慢慢斗,死不挪地,干耗着,猜测,别当真
    华为: 网上传闻中内斗很多,对外好像比较团结,狼嘛,人事变动快,换部门多,猜测,别当真
    技术水平和江湖地位:
    两家在国内都属于佼佼者,各有领先的领域,谁跨掉对目前的中国IT界都不是好事.
    整体水平华为略强于中兴,GSM/WCDMA华为明显强于中兴,但中兴也有自己领先的地方,像IPTV,TD-SCDMA.
    中兴和国家政府更靠近,乖孩子角色; 华为我行我素,有点叛逆的味道
    相互挖墙角:
    短期经济利益看,华为的去中兴 远不如 中兴去华为  的划算
    中兴: 挖毕业进华为的出工资,一般本科华为2年在6500以下,硕士华为2年在8000以下
    华为: 当时挖中兴TD的人,中兴两年多在1W以上
    秘书MM:
    中兴:据说以前的国企行政差不多,你的看她脸色行事,内部评价就不高
    华为:相对而言,传闻中服务精神好一些,主动性高一些
    工作强度和稳定性:
    IT流动都比较大,华为一般不会主动开除或辞退,可以换岗,多一人少一人无所谓,只是对你好不好的问题,策略是宁可白养也不送给敌人,要走人也不会为难你;
    中兴人事政策也是国企作风,偶尔可能辞掉看不顺眼的刺头,只要你忍着,也不会轻易开人,走人看上级心情和人品,总之是有名的麻烦.最近招人多了,可能有变?
    呵呵,想轻松拿高工资,新人做梦把,新员工想比老员工还多,那公司就会都是新员工,天天招人走人了,公司怎么稳定下来?据说华为01年办过这样的蠢事,
    华为为此付出了相应的代价.  中兴可能比华为稍微轻松那么一点点,一点点而已
    都比较累,工资除了挖墙角的少部分,大多不是很高,兄弟姐妹都很郁闷的说; 行业利润这么低,不剥削员工,公司怎么生存,替老板想想 ,嘿嘿.
  • 发现这个空间比CSDN的要好很多哦

    2008-07-25 21:49:03

    我喜欢简单的风格~

    简约而不简单!

352/2<12
Open Toolbar