发布新日志

  • Java RMI、EJB

    2009-08-13 15:58:28

    Java RMI

    Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。

    Java RMI极大地依赖于接口。在需要创建一个远程对象的时候,程序员通过传递一个接口来隐藏底层的实现细节。客户端得到的远程对象句柄正好与本地的根代码连接,由后者负责透过网络通信。这样一来,程序员只需关心如何通过自己的接口句柄发送消息。

    接口的两种常见实现方式是:最初使用JRMP(Java Remote Message Protocol,Java远程消息交换协议)实现;此外还可以用与CORBA兼容的方法实现。RMI一般指的是编程接口,也有时候同时包括JRMP和API(应用程序编程接口),而RMI-IIOP则一般指RMI接口接管绝大部分的功能,以支持CORBA的实现。

    最初的RMI API设计为通用地支持不同形式的接口实现。后来,CORBA增加了传值(pass by value)功能,以实现RMI接口。然而RMI-IIOPJRMP实现的接口并不完全一致。

    所使用Java包的名字是java.rmi

    EJB

    企业级JavaBean(Enterprise JavaBean, EJB)是一个用来构筑企业级应用的服务器端可被管理组件。

    Java企业版API(Java Enterprise Edition)中提供了对EJB的规范。EJB是一个封装有某个应用程序之业务逻辑服务器端组件。EJB最早于1997年由IBM提出,旋即被太阳微系统采用并形成标准(EJB 1.0 和EJB 1.1)。其后在Java社区进程(Java Community Process)支持下陆续有一些JSR被制订来定义新的EJB标准,分别是JSR 19 (EJB 2.0), JSR 153 (EJB 2.1) 以及最新的JSR 220 (EJB 3.0)。

    EJB规范的目的在于为企业及应用开发人员实现后台业务提供一个标准方式,从而解决一些此前总是在作业过程中总是重复发生的问题。EJB以一个标准方式自动处理了诸如数据持久化,事务整合,安全对策等不同应用的共有问题,使得软件开发人员可以专注于程序的特定需求而不再饱受那些非业务元素的困扰。

    据此,EJB规范明确了一个应用服务器应当支持的中间管理细目,包括:

    • 数据持久化
    • 事务处理
    • 并发控制
    • 基于JMS的事件驱动
    • 基于JNDI的名字和空间管理
    • 基于JCEJAAS的安全管理
    • 应用服务器端的软件组件部署
    • 使用RMI-IIOP协议的远程过程调用
    • 将业务方法暴露为Web服务

    此外,EJB定义文档还指定了EJB容器和各EJB的角色定位,以及如何将EJB部署至EJB容器当中。

    EJB种类

    EJB容器可以接受三类EJB

    • 会话Bean(Session Beans)
      • 无状态会话Bean(Stateless Session Beans)
      • 有状态会话Bean(Stateful Session Beans)
    • 实体Bean(Entity Beans)
    • 消息驱动Bean(Message Driven Beans ,MDBs)

    无状态会话Bean是一类不包含状态信息的分布式对象,允许来自数个客户端的并发存取。实例变量的内容在前后数次呼出中不被保留(确切地说是不保证保留)。由于不必控制与用户间的对话信息而减少了开销,无状态会话Bean不像有状态会话Bean那样具有资源集约性。举例来说,一个发送邮件的EJB就可被设计为一个无状态会话Bean。在整个会话期,用户只向服务器提交一个动作:发送指定邮件到指定地址。(称为开关行为)

    有状态会话Bean是包含状态的分布式对象,即是说,贯穿整个会话它们都要保有客户端信息。举例而言,在一个网上商店进行实施结账很可能就需要一个有状态会话Bean,因为结账是一个多步动作,服务器端必须可以随时了解到用户已经进行到了哪一步。此外,尽管有状态会话Bean的状态信息可被保持,但始终只能同是由一个用户来访问之。

    实体Bean是含有持久化状态的分布式对象。这个持久化状态的管理既可以交给Bean自身(Bean-Managed Persistence,BMP),也可以托付于外部机制(Container-Managed Persistence,CMP)。

    消息驱动Bean是支持异步行为的分布式对象。它们并不对请求进行当即响应。比方说,某网站用户点击“请通知我更新信息”按钮,将会触发某个MDB将这名用户加入到数据库的希望获得更新信息用户列表中。这个动作就是一个异步的消息驱动过程,因为用户不必等待当时会返回某个结果。MDB的消息源来自Java消息服务(JMS)提供的消息队列或消息主题。自EJB 2.0规范起,JMS被加入进来以允许在容器内部实施事件驱动处理。与其他EJB不同,MDB不存在一个用户视图(如需要用户引用的远程接口),用户也不能通过资源定位获得一个MDB实例。MDB只在后台监听消息源并实施自动处理。

    除了上述以外,目前还有一些EJB处于设想阶段,如JSR 86提出了用于在Java EE应用中整合多媒体对象的媒体Bean(Enterprise Media Beans)。

    EJB实行

    EJB部署于应用服务器端的EJB容器中。规范给定了EJB与EJB容器之间,以及用户代码与EJB/EJB容器之间的交互方式。对于Java EE API,javax.ejb包定义了EJB类,javax.ejb.spi包定义了EJB容器应当实现的各个接口。

    在EJB 2.1和以前的版本中,每个EJB都由一个类和两个接口组成。EJB容器负责创建这个类的实例,接口则供客户端调用。

    两个接口分别被称为Home接口和组件接口,负责提供各个EJB远程方法声明。这些EJB远程方法可分成两组:

    • 类方法:由Home接口提供。与特定实例无关,仅负责一些公共内容,比如创建一个新的EJB实例(create方法),或寻找一个已经存在的EJB实例(find方法)等等。
    • 接口方法:由组件接口提供的针对特定实例的业务方法。

    EJB容器将为这些接口提供对应的实现类以充当客户远程代理,当客户端调用这个生成的代理类的某个方法时,代理类内部会将此调用的方法和参数封装成一个消息发送给服务器。服务器受到消息后在转发给真实的EJB实例,后者负责执行真正的业务逻辑。

    远程通信

    EJB规范要求EJB容器能够支持基于RMI-IIOP的EJB访问。EJB既可被任何CORBA应用访问,也能提供Web服务。

    事务

    EJB容器必须支持符合ACID(原子性/一致性/独立性/持久性)特性的容器级事务管理,以及bean内部事务管理。容器级事务需在部署描述符中(EJB应用的配置文件)进行声明。

    事件

    EJB使用JMS向客户对象发送消息,客户则可以异步地接受这些消息。MDB则接受来自客户端的消息。

    命名和目录服务

    EJB客户端使用JNDI或CORBA名字服务定位Home接口实现 对象。通过此Home接口,用户还可以寻找,创建或删除实体对象。

    安全

    EJB容器对客户端的访问权限负责。

    部署EJB

    EJB规范还定义了一个跨平台的统一部署机制。部署描述符中定义了关于EJB应用的一切相关内容。文件名通常为ejb-jar.xml。

    部署描述符是一个XML文档,负责为该EJB应用中的每一个EJB定义入口。部署描述符的主要内容包括:

    • Home接口名
    • Bean的Java类名
    • Home接口的Java接口名
    • 组件接口的Java接口名
    • 持久化存储(针对实体Bean)
    • 安全策略和角色分配

    通常EJB容器提供者还定义了一些额外的XML或其他格式描述文件来强化其容器的功能。他们还同时提供这些描述文件的解读工具类和对Home接口的自动实现类生成。

    EJB3.0起开始广泛使用Java注释替代传统的部署描述符ejb-jar.xml。但后者仍然有效。

  • Navicat与MySQL GUI Tools比较

    2009-08-05 12:07:58

    MySQL GUI工具很多,本文就常用的Navicat for MySQL与MySQL GUI Tools的特色功能做一个详细介绍与比较。

    一、MySQL GUI Tools

    MySQL官方提供的一个可视化界面的MySQL数据库管理控制台,提供了四个图形化应用程序,这些图形化管理工具可以大大提高数据库管理、备份、迁移和查询效率。它们分别是:

    ◆ MySQL Migration Toolkit

    ◆ MySQL Administrator

    ◆ MySQL Query Browser

    ◆ MySQL Workbench

    1.MySQL Query Browser

    MySQL查询浏览器是为MySQL数据库服务器创造,执行和优化SQL查询的最简单的可视化工具。MySQL Query Browser主要特色功能:

    ◆ 查询工具栏导航按钮,让您浏览查询历史,可以回顾及重新执行以前的查询。可以保存查询,打开查询文件 *.qbquery。

    ◆ 使用结果窗口轻松管理多个查询

    比较多个查询通过查看制表符分隔,或是纵向或是横向联合的显示在结果窗口。此外,解释按钮,可以用来获得解释,输出为当前查询。比较按钮允许您快速比较两个查询的结果,让您确定在何处行已插入,更新或删除。

    ◆ 脚本编辑与调试

    脚本区域的特点是编号和语法突出。另外,脚本调试按钮,使您可以设置断点和控制执行该语句和脚本。

    ◆ 内置帮助
    即时帮助你获得搜选的对象,参数,和职能,可以查看mysql syntax语句句法,函数,参数。

    2.MySQL Administrator

    Mysql Administrator让使用者更容易管理和监测你的MySQL环境,并对数据库取得更好的能见度。

    MySQL Administrator主要特色功能:

    ◆ 启动/停止mysql服务

    ◆ 健康状况查看:连接健康实时曲线图查看(连接使用率,流量,sql查询数), 内存健康查看(Query Cache Hitrate,Key Efficiency), 状态变量查看(普通,性能,网络,执行的命令,混合,新变量) , 系统变量查看(普通,连接,SQL,内存,表类型,新变量)

    3.Migration Toolkit

    ◆ 可以从MS SQL,Oracle等数据库移植复制数据库到Mysql。

    4.MySQL Workbench

    ◆ 添加EER 图表(Extended Entity-Relationship的缩写)

    ◆ 使用默认Schema,创建新表,新的视图等对象

    ◆ 可以导入SQL脚本

    缺点:

    ◆ Mysql Query Browser总是做了几个查询之后就使用内存太多。

    ◆ 手动安裝 MySQL GUI Tools 5.0时,将目录名称取名为中文,或是将它放置在桌面上执行 MySQL Query Browser,在中文系统会产生此问题:..... MySQL GUI Tools 5.0\XML\mysqlqb_functions.xml (error

    ◆ 中文介绍及中文资料不多。

    ◆ 导入导出支持格式太少。

    二、Navicat for MySQL

    Navicat for MySQL是一个强大的MySQL数据库服务器管理和开发工具。它可以与任何3.21或以上版本的MySQL一起工作,并支持大部分的MySQL最新功能,包括触发器、存储过程、函数、事件、视图、管理用户,等等。它不仅对专业开发人员来说是非常尖端的技术,而且对于新手来说也易学易用。其精心设计的图形用户界面(GUI),Navicat for MySQL可以让你用一种安全简便的方式快速并容易地创建,组织,访问和共享信息。

    Navicat for MySQL在三种平台上是可用的——微软Windows、Mac OS X 和Linux操作系统。它可以使用户连接到本地/远程服务器,提供了几种实用工具,例如数据结构同步、导入/导出、备份和报告,使维护数据的过程很容易。

    除了常规的管理数据库对象外,Navicat for MySQL功能主要有:

    ◆ 多种格式的导入导出能力,使维护数据的过程很容易。并可以从ODBC导入数据:将MSSQL,Oracle数据导入MySQL

    ◆ 批量的工作调度处理,有力减轻了数据库管理员的负担。

    ◆ 快速地实现广域网远程连接,更加安全简便。

    ◆ 智能地构建复杂的SQL查询语句,提高开发效率。

    Navicat for MySQL相比MySQL GUI Tools有其自身优势:

    ◆ 下载次数最多的MySQL图形用户工具。自2001年初以来, Navicat已在世界各地被下载超过二百万次,并有超过五万个客户群用户。

    ◆ 支持Mysql数据库新对象,例如事件。

    ◆ 导入导出支持多达17种格式(slk,dif,wk1,wq1,rtf,mdb,sav,ldif等特殊的格式)。

    ◆ 报表设计,打印及定制。

    ◆ 具有结构同步,数据同步功能而且速度快。

    ◆ 调度,创建Batch Job,设置任务调度. 创建一个设定的计划批处理工作,以计划执行一个或多个定期的,指定开始及结束的日期及时间。批处理可以创建的对象包括查询,报表打印,备份,数据传送,数据同步,导入和导出。发送计划工作的电子邮件通知,产生通知电子邮件给你指定的收件人。

    ◆ 安装下载非常方便,占用内存少,运行速度很快。

    ◆ 简体中文版已经发布,且有中文技术支持论坛。中国大陆有授权销售代理商。

    缺点:

    ◆ 没有像MySQL Workbench那样的EER图表,ER数据库模型工具。(可能不久就有了)

    ◆ 数据同步与结构同步时注意保持数据库版本的一致性。

    文章来源:网站制作爱好者(www.devdao.com) 出处:http://www.devdao.com/Article/533113.htm

  • 【转】专家教你安装 MySQL与MySQL GUI Tools

    2009-08-05 12:01:09

     

    下载并选择MySQL的安装包

    由于MySQL一直在升级,所以当您阅读本文时,或许在其官方网站上已提供了新的正式版供你下载,因此,以下提供的链接或许会失效,必要时,请进入MySQL下载页面查找当前的最新版本。

    另外,在下载过程中,需要您注册为网络用户(当然,如果你不愿意注册的话,也可以直接点击» No thanks, just take me to the downloads!跳过注册这一步直接下载),这是一个很简短的过程,它需要您提供一个有效的Email地址。

    MySQL 5.0 或MySQL 5.1

    MySQL 5.0下载页面:http://dev.mysql.com/downloads/mysql/5.0.html

    MySQL 5.1下载页面:http://dev.mysql.com/downloads/mysql/5.1.html

    您将在上述页面上,看到MySQL针对不同操作系统提供的下载链接。其中for Windows版本又分为不同形式的3个安装包:

    基本安装包(Windows Essentials):该安装包的文件名类似于mysql-essential--5.0.77-win32.msi,它只包含了安装MySQL所需要的基本文件与配置向导,但是并没有包含可选组件,如基准套件和嵌入式服务器。

    完全安装包(Windows ZIP/Setup.EXE):该安装包的文件名类似于 mysql-5.0.77-win32.zip,它包含了安装MySQL所需要的全部文件与配置向导以及可选组件,如基准套件和嵌入式服务器。

    免安装包(Without installer): 该安装包的文件名类似于mysql-noinstall-5.0.77-win32.zip,它包含了完全安装包中除配置向导以外的全部文件,你必须手动安装和配置它的配置文件(my.ini)。

    其中,基本安装包(Windows Essentials)和完全安装包(Windows ZIP/Setup.EXE)均包含了MySQL的安装向导和配置向导,因此在绝大多数情况下,建议你选择这两种安装方式。如果需要在一台服务器上安装多个MySQL或者对MySQL比较熟悉,想完全控制服务器的配置,则应该选择免安装包。

    安装、配置MySQL

    在Windows上安装MySQL时,你可以使用MySQL的安装向导(MySQL Setup Wizard)和配置向导(MySQL Configuration Wizard)比较容易地完成安装配置过程。具体步骤如下:

    从上面的MySQL5.0或5.1的下载页面中,在下载时,请点击"Pick a mirror"链接,然后选择一个最近的镜像网站(如,位于亚洲的镜像服务器)下载,以便以较快地速度下载Windows下的MySQL安装包。如果 MySQL安装包是.zip文件,先解压。然而,不论安装文件是setup.exe还是.msi文件,都可以通过双击安装文件来启动安装过程,如下面的截图所示。在此处,我下载的是文件尺寸最小的Windows Essentials (x86)安装包(mysql-essential--5.0.77-win32.msi)

    安装

    双击下载所得到的mysql-essential-5.0.77-win32.msi文件开始安装,下面的几个环节需要特别注意。

    第一、 请选择安装类型

    有3种安装类型可供选择:典型安装(Typical)、完全安装(Complete)和自定义安装(Custom)。

    典型安装只包含了MySQL服务器、MySQL命令客户端以及命令行实用程序。命令行使用程序和命令行客户端包括mysqldump、 myisamchk和其他几个工具。完全安装包含了软件包中的全部组件以及嵌入式服务器库、基准套件并支持脚本和文档。而自定义安装允许你完全控制要安装的软件包和路径。

    在此处,选择的是自定义安装(Custom)。

    图 1 选择自定义安装MySQL

    第二、 确认安装(截图略)

    如果选择的是典型安装(Typical)或完全安装(Complete)并点击"Next"按钮,进入安装确认界面。此对话框将显示出你所选择的安装类型以及安装的路径,点击"Install"按钮开始安装。此处,我选择的是自定义安装(Custom),并点击"Next"按钮,此时将进入自定义安装对话框(截图略),同时,此步也可以更改MySQL的安装路径。默认情况是"C:\Program Files\MySQL\MySQL Server 5.0"。如果C盘空间不足,则可以将其安装到另外的路径中(如"E:\Program Files\MySQL\MySQL Server 5.0")。

    第三、完成安装(截图略)

    安装完成后,会出现注册选项和MySQL的网址,注册的好处在于,你可以随时访问MySQL的官方论坛,在使用MySQL的过程中,如发现bug,则可以在http://bugs.mysql.com上报告其缺陷。当然,你也可以选择"跳过注册(Skip Sign-Up)"。

    在安装即将结束时,会出现一个向导更改系统的注册表和启动菜单。在该启动菜单中创建了如下条目:

    MySQL Command Line Client(MySQL命令客户端):它是MySQL命令客户端的快捷方式,它需要输入超级用户(root)的密码方可使用。

    MySQL Server Instance Config Wizard(MySQL服务器实例配置向导 ):它是MySQL配置向导的快捷方式,可以用来配置新安装的服务器或者重新配置已有的服务器。

    MySQL Document(MySQL文档 ):它可以链接到MySQL服务器所在的安装目录中的文档内。若采用基本安装包安装时,便不会出现此菜单。

    配置MySQL

    第一、启动配置向导

    安装最后一步,请确保选中"Configure … now"选项。

    图 2 MySQL安装后,准备开始配置MySQL
     

    第二、配置

    开始配置,选择配置类型和服务器类型(截图略)

    有两种配置类型可供选择:Detailed Configuration(详细配置)和Standard Configuration(标准配置)

    其中,标准配置适合于,在不考虑服务器优化的情况下,想快速启动MySQL的新用户。详细配置则适合于想更为精确地控制服务器配置的高级用户。此处,选择详细配置,并点击"Next"按钮,进入服务器类型选择界面(截图略)。

    有如下三种服务器类型可供选择:

    Developer Machine(开发机器):此选项表示典型的桌面工作站,它使用最少的系统资源。

    Server Machine(开发机器):此选项表示MySQL服务器可以与其他的应用程序(如,Web服务器、FTP和电子邮件等)一起运行,它将使用一定比例的系统资源。

    Dedicated MySQL Server Machine(专用MySQL服务器机器):此选项表示它只运行在MySQL服务的服务器上。若没有运行其他的应用程序,它将使用全部可用的系统资源。

    数据库的使用(截图略)

    通过使用Database Usage对话框,指定创建表时所用的表处理器。有如下三种选项:

    Multifunctional Database(多功能数据库):此选项使用InnoDB和MyISAM引擎,并在这两个引擎间平均分配资源。经常使用这两个存储引擎的用户可以选择此选项。

    Transactional Database Only(仅做事务处理的数据库):此选项同时使用InnoDB和MyISAM引擎,与前面的Multifunctional Database不同的是,它会将大多数服务器资源指派给InnoDB引擎。主要使用InnoDB引擎,偶尔会使用MyISAM引擎的用户可以选择该选项。

    Non-Transactional Database Only(仅做非事务处理的数据库):此选项完全禁掉了InnoDB引擎,把所有的服务器资源指派给MyISAM引擎。不使用InnoDB引擎的用户可以选择该选项

    设置InnoDB表空间(截图略)

    如果想更改InnoDB表的表空间文件的默认位置,可以从驱动器的下拉列表中选择一个驱动器,并在该列表中选择一个新路劲。

    设置并发连接的大体数目(这有助于防止服务器资源耗尽)。

    Decision Support(DSS,决策支持)/OLAP:在服务器不需要大量的并发连接时,可以选择该选项。平均并发连接数为20,最大连接数目为100 。

    Online Transaction Processing(OLTP,联机事务处理):在服务器需要大量的并发连接时,可以选择该选项。最大连接数目为500 。

    Manual Setting(手动设置):你可以手动设置(在下拉框中选择或直接输入并发连接的最大数目)服务器并发连接的最大数目。

    设置联网选项

    在Networking Options界面中,启用或禁用TCP/IP网络并配置连接MySQL服务器的端口号。

    默认使用3306端口。要想更改此端口,你可以在下拉选择框中选择一个新的端口号,或者也可以直接输入。

    注意:大多数配置均可以采用其默认值,但是注意在此步骤中,应将MYSQL服务的监听端口添加为windows防火墙例外,即选中图3的 "Add firewall exception ……"。

    图 3 添加防火墙例外

    设置字符集(截图略)

    MySQL服务器支持多种字符集:

    Standard Character Set(标准字符集):使用Latin1(Latin1用于英语和西欧语)作为服务器的默认字符集。

    Best Support For Multilingualism(支持多种语言):使用UTF8(utf8可以将不同语言的字符存储为单一的字符集)作为服务器的默认字符集。

    Manual Selected Default Character Set/Collation (人工选择的默认字符集):在下拉列表中选择期望的默认字符集。

    设置服务选项(截图略)

    默认情况下,配置向导将MySQL服务器安装为服务名为"MySQL"的服务,你也可以在下拉框中选择新的服务名或直接输入服务名。

    设置安全选项

    设置超级用户(root)的密码,原密码为空,请设置一个新密码,并牢记此密码!此处假设为msql。

    图4 修改root用户的密码

    执行配置

    设置完root帐号信息以后,出现Configuration(确认)界面,执行配置,请单击"Execute"按钮,如果成功,结果如图5所示。如果失败,请重新安装。

    图 5 执行配置,安装完成
     

    安装MySQL GUI Tools

    准备工作

    双击下载所得到的mysql-gui-tools-noinstall-5.0-r16-win32.zip文件,将该文件解压至本地硬盘即可。

    启动服务

    双击%MySQL GUI Tools% 目录下的 MySQLSystemTrayMonitor.exe,这时会在任务栏右侧出现一个图标。点击"Start Instance",运行MySQL。

    然后双击 %MySQL GUI Tools% 目录中的 MySQLAdministrator.exe,或者直接点击上面右键菜单中的"MySQL Administrator "

    输入服务器地址,因为是本机,所以此处请填写127.0.0.1或localhost均可。再输入用户名(root)及密码,点击OK,进入管理工具主界面。登陆之后运行的效果图如图6所示:

    图6 MySQL Administrator 登陆之后的界面

    汉化版的界面,默认字体看起来有点不舒服,若想修改界面的字体,请点击主菜单:"Tools → 选项",在弹出的对话框左侧选中"常规选项",在右侧修改其中的"默认字体"为宋体、9号,应用后退出。

  • JSP学习笔记1

    2009-07-22 15:57:08

    一、

    JSP指令 < % @ ...... % >

    JSP声明 < % ! ...... % > ,每个声明后必须有一个分号,如 < % ! String str = "0" ; % >

    JSP代码 < % ...... % >

    JSP输出表达式 < % = ......% >

    JSPBean < jap : useBean >

    二、配置JSP环境三种方案:J2SDK+TOMCAT; J2SDK+APACHE+TOMCAT; J2SDK+IIS+TOMCAT

    三、JSP连接常用数据库

    1、oracle在开发java软件方面提供四种类型驱动程序,其中两种用于软件、Applets、Servlets等客户端软件,另外两种用于数据库中的java存储过程等服务器端软件。 可选择OCI,Thin驱动程序。

    OCI驱动程序利用java本地化接口(JNI),通过oracle客户端软件与数据库进行通信。

    Thin驱动程序为纯java驱动程序,直接与数据库通信。

    Thin性能好于OCI。

    2、sql server 2000  需下载驱动程序:Microsoft SQL Server 2000 for JDBC,把其中的mssqiserver.jar文件解压缩到Tomcat服务器文件下的webapps\ROOT\WEB-INF\classes文件夹下,再编写连接数据库的程序。

    3、DB2  下载DB2驱动程序db2java.zip文件,解压缩到Tomcat服务器文件下的webapps\ROOT\WEB-INF\classes文件夹下,再编写连接数据库的程序。

    4、MySQL 需要加载jsp-mysql驱动程序,(mm.mysql)

    5、Sybase数据库 下载最新驱动程序,把包含“com.informix.jdbc.IFxDriver”的com文件解压缩到Tomcat服务器文件下的webapps\ROOT\WEB-INF\classes文件夹下,再编写连接数据库的程序。

    6、Informix数据库  下载最新驱动程序,把包含“com.informix.jdbc.IFxDriver”的com文件解压缩到Tomcat服务器文件下的webapps\ROOT\WEB-INF\classes文件夹下,再编写连接数据库的程序。

  • 如何使用Sql生成测试数据

    2009-07-16 16:10:49

     无论您是在用原型证明某一概念,还是开发一个全新的应用程序,或者只是学习 SQL,您都需要在您的应用程序上运行测试数据。本文讨论了如何生成足够的、对测试有用的、具有期望的值分布和列间相关性的测试数据。 使用 SQL 生成大量测试数据

    无论您是在用原型证明某一概念,还是开发一个全新的应用程序,或者只是学习 SQL,您都需要在您的应用程序上运行测试数据。为了有效地测试应用程序的性能,您必须拥有足够的测试数据,以便暴露潜在的性能问题。只要可以得到,用实际数据来进行测试总是更可取一些。如果没有可用的实际数据,那么在许多情况下,也可以生成足够的假想数据。一般来说,从头开始构造大量数据是件很容易的工作,您自己就可以快速地独立完成。

    本文提供了一些如何利用 SQL 脚本来生成测试数据的示例,而这些脚本本身就是较好的 SQL 实践。并且还讨论了一些为了生成尽可能真实的数据而应该注意的问题。

    生成大量记录 即使数据库是新创建且仍然为空的,也总是会带有系统表和视图,因此,您可以按以下方法使用它们: CREATE TABLE DB2ADMIN.SALES
    (CUSTOMER_ID INT NOT NULL, ITEM_ID INT NOT NULL,
    SALE_QUANTITY SMALLINT NOT NULL, SALE_DATE DATE NOT NULL);
    INSERT INTO SALES
    SELECT
    SYSFUN.RAND()*500 + 1 AS CUSTOMER_ID,
    SYSFUN.RAND()*100 + 1 AS ITEM_ID,
    1 + SYSFUN.RAND()*10 AS SALE_QUANTITY,
    DATE('01/01/2003') + (SYSFUN.RAND()*200) DAYS AS SALE_DATE
    FROM SYSCAT.COLUMNS;

    SALES 表中的记录数就与 SYSCAT.COLUMNS 中的完全一样了。请注意,多个列都是用随机值来填充的。例如,SALE_QUANTITY 列中的所有值都是处于 1 到 10 之间,约 10% 的记录具有各不相同的值。如果您需要更多记录,就可以根据需要多次重复执行这条 INSERT 语句。您还可以像下面这样使用交叉连接(CROSS JOIN),以便每条语句获得更多记录:

    注意:本例中,表 T1 和 T2 的连接是不含任何条件的,因此,T1 中的每一行会匹配 T2 中的每一行。这种类型的连接称作交叉连接。

    注意:这条 INSERT 语句所涉及的事务可能会相当大,以致于您的服务器无法加以处理。如果您遇到“log full”的情况(SQL0964C 数据库的事务日志已满),您可能需要增加日志空间,或者通过指定 T1 或 T2 或两者中的 WHERE 子句来获得一个较小的事务。

    您可以使用该方法来生成大量记录,然而,该方法有点过分简单了,因为所有的值都是均匀分布的,而且它们之间不存在相关性。

    填充子表 您的数据库中很可能存在多对一的关系。下列示例展示了如何填充子表,以使每一条父记录都具有随机的多条子记录。 CREATE TABLE DB2ADMIN.PARENT_TABLE(PARENT_ID INT NOT NULL, NUM_CHILDREN INT NOT NULL);
    INSERT INTO DB2ADMIN.PARENT_TABLE
    SELECT ROW_NUMBER() OVER(), SYSFUN.RAND()*5 + 1
    FROM SYSCAT.TABLES;
    ALTER TABLE DB2ADMIN.PARENT_TABLE ADD PRIMARY KEY(PARENT_ID);

    CREATE TABLE DB2ADMIN.CHILD_TABLE(PARENT_ID INT NOT NULL, CHILD_NUM INT NOT NULL);

    INSERT INTO DB2ADMIN.CHILD_TABLE
    SELECT PARENT_ID, SEQUENCE_TABLE.NUM
    FROM DB2ADMIN.PARENT_TABLE
    JOIN
    (SELECT ROW_NUMBER() OVER() AS NUM
    FROM SYSCAT.TABLES) AS SEQUENCE_TABLE
    ON AUXILIARY_TABLE.NUM<NUM_CHILDREN;

    最后一条 INSERT 语句的结果是,每一条父记录有 1 到 6 条子记录。SEQUENCE_TABLE 是一个表表达式。 使用辅助表模仿数据倾斜 如果一列中的某些值所出现的频率比其他的要大很多,则该数据存在数据倾斜(data skew)。例如: SELECT CITY, COUNT(*) FROM CUSTOMER
    GROUP BY CITY
    ORDER BY COUNT(*) DESC

    CHICAGO 236
    MILWAKEE 95
    ROCKFORD 4
    NAPERVILLE 3
    SPRINGFIELD 3
    (snip)

    279 rows selected

    每当您有理由期望在生产数据中出现数据倾斜时,您就可能需要在测试数据中再现数据倾斜,首先,在一个表中存储预计频率: CREATE TABLE COLOR_FREQUENCY(COLOR CHAR(10), FREQUENCY SMALLINT);
    INSERT INTO COLOR_FREQUENCY VALUES
    ('RED', 37), ('SILVER',12), ('AMBER', 3), ('GREEN', 3), ('WHITE',2),('BLACK', 1),('BLUE',1); 接着,创建一个辅助表(更明确地说,是一个序列表)。 CREATE TABLE CONSECUTIVE_NUMBER(NUM INT NOT NULL);
    INSERT INTO CONSECUTIVE_NUMBER
    SELECT ROW_NUMBER() OVER() AS NUM FROM SYSCAT.COLUMNS; 注意:Joe Celko 的 SQL for Smarties 一书中有一章是关于辅助表的。现在,让我们连接这两个表: SELECT COLOR, FREQUENCY, NUM
    FROM COLOR_FREQUENCY JOIN CONSECUTIVE_NUMBER
    ON NUM BETWEEN 1 AND FREQUENCY ORDER BY FREQUENCY, COLOR;

    COLOR FREQUENCY NUM
    ---------- --------- -----------
    BLACK 1 1
    BLUE 1 1
    WHITE 2 1
    WHITE 2 2
    AMBER 3 1
    AMBER 3 2
    AMBER 3 3
    (SNIP)

    正如我们所看到的,COLOR_FREQUENCY 表中的每一行都连接了 CONSECUTIVE_NUMBER 表中的 FREQUENCY 行。该示例生成了您需要用于获得所需值分布的确切内容: CREATE TABLE T_SHIRT(COLOR VARCHAR(30) NOT NULL, SIZE CHAR(1) NOT NULL);

    INSERT INTO T_SHIRT
    SELECT COLOR, 'M' AS SIZE
    FROM COLOR_FREQUENCY JOIN CONSECUTIVE_NUMBER
    ON NUM BETWEEN 1 AND FREQUENCY;

    SELECT COLOR, COUNT(*) FROM T_SHIRT GROUP BY COLOR;

    COLOR 2
    ------------------------------ -----------
    AMBER 3
    BLACK 1
    BLUE 1
    GREEN 3
    RED 37
    SILVER 12
    WHITE 2 ;

    因此,T_SHIRT 表现在有 37+12+3+3+2+1+1 = 57 行。该表刚好具有所需的值分布。 为几个列生成具有给定值分布的数据 使用前一章中的所用表,您还可以为 SIZE 列指定值分布: CREATE TABLE SIZE_FREQUENCY(SIZE CHAR(1), FREQUENCY SMALLINT);
    INSERT INTO SIZE_FREQUENCY VALUES
    ('S', 5), ('M',7), ('L', 9); 并使用两个表表达式来填充 T_SHIRT 表: INSERT INTO T_SHIRT
    SELECT COLOR, SIZE
    FROM
    (SELECT COLOR FROM COLOR_FREQUENCY JOIN CONSECUTIVE_NUMBER ON NUM BETWEEN 1 AND FREQUENCY) C,
    (SELECT SIZE FROM SIZE_FREQUENCY JOIN CONSECUTIVE_NUMBER ON NUM BETWEEN 1 AND FREQUENCY) S 第一个表表达式产生 57 行,而第二个表表达式则产生

    5+7+9=21 行。由于我们没有指定任何连接条件,所以第一个结果集中的每一行将会连接第二个中的每一行,从而产生 57*21 行。

    注意:交叉连接可能会生成太多行。因此,该事务将太大,以致服务器无法处理。本例中,您可能需要几个较小一些的 INSERT 语句,例如在第一个 INSERT 中使用以下表表达式:

    (SELECT SIZE FROM SIZE_FREQUENCY JOIN CONSECUTIVE_NUMBER ON NUM BETWEEN 1 AND FREQUENCY AND SIZE='L') S

    并且在第二个 INSERT 语句中将这个表表达式修改为:

    (SELECT SIZE FROM SIZE_FREQUENCY JOIN CONSECUTIVE_NUMBER ON NUM BETWEEN 1 AND FREQUENCY AND SIZE<>'L') S 生成具有相关列的数据 假定我们需要生成几行记录来填充 CAR 表: CREATE TABLE CAR(
    MAKE VARCHAR(20) NOT NULL,
    MODEL VARCHAR(20) NOT NULL,
    OTHER_DATA VARCHAR(20));

    如果尝试前一章中的方法,我们最后将获得一些不可能的 MAKE/MODEL 组合,例如“TOYOTA METRO”和“GEO CAMRY”。该状况称作 MAKE 列和 MODEL 列之间的相关性。正确的方法是指定有效对(MAKE,MODEL)及其频率:

    CREATE TABLE MAKE_MODEL_FREQUENCY(MAKE VARCHAR(20), MODEL VARCHAR(20), FREQUENCY SMALLINT);
    INSERT INTO MAKE_MODEL_FREQUENCY VALUES
    ('TOYOTA','CAMRY', 40), ('HONDA','ACCORD',40), ('CHEVY', 'PRIZM', 5), ('GEO','PRIZM', 5),
    ('CHEVY', 'METRO', 5), ('GEO', 'METRO', 10); 一旦完成该工作,我们就可以按照前面一模一样的方法来连接 CONSECUTIVE_NUMBER 和 MAKE_MODEL_FREQUENCY 表了。 操纵群集因子 表的物理行次序将影响该表上几乎所有查询的性能。因此,所生成的数据具有理想的物理行次序是极其重要的。如果您期望一个索引具有较高的群集因子,就只要重组该索引上的表。相反,如果您期望该索引具有较低的群集因子,也可以容易地以随机次序来打乱该表的次序,从而使得该索引的群集因子接近于 0: CREATE TABLE NAMES(
    FULL_NAME VARCHAR(50) NOT NULL,
    ORDERED_ON INT);

    INSERT INTO NAMES(FULL_NAME, ORDERED_ON)
    SELECT TABNAME || ', ' || COLNAME AS FULL_NAME,
    SYSFUN.RAND() * 10000 AS ORDERED_ON
    FROM SYSCAT.COLUMNS;

    CREATE INDEX NAMES_FULL_NAME ON NAMES(FULL_NAME);
    CREATE INDEX NAMES_ORDER ON NAMES(ORDERED_ON);
    REORG TABLE DB2ADMIN.NAMES INDEX DB2ADMIN.NAMES_ORDER;
    RUNSTATS ON TABLE DB2ADMIN.NAMES AND DETAILED INDEXES ALL;

    在进行重组之后,索引 NAMES_FULL_NAME 将具有一个极低的群集因子(接近于 0),因为现在的行是以随机次序存储的。

    注意:还可以重组该表,以使索引 NAMES_FULL_NAME 的群集因子接近 0 到 1 之间的任何给定值,但是,该内容超出了本文的范围。

    结束语: 本文讨论了如何构建一个测试数据集,以使该数据集达到用于测试的规模,并且具有期望的值分布和列间相关性。 参考资料: 关于用表表达式获得灵活性和性能的示例,请阅读专家会谈:Sheryl Larsen 谈表表达式的威力(developerWorks,2002 年 4 月)。

Open Toolbar