资源描述
摘要
随着网络技术的迅猛发展和网络应用水平的提高,校园网软、硬件建设在我国正在高速发展。由于CERNET网络中国际流量部分需要各入网单位按流量分担费用,面对越来越多的网络用户,越来越大的网络流量,学校的网络压力和财政压力也越来越大,因此不得不针对用户的网络使用情况,向用户征收一定的费用,以限制用户随意上网,减小网络压力,加快信息周转速度,提高网络的运行效率,保证网络正常运行。
本文首先概述了计费系统结构设计,然后是开发工具的介绍,最后是系统普通用户模块的实现方法与数据库存储过程的设计实现方法。
关键字: 代理服务器,网络计费系统,模块。
Abstract
With the quick development of network technique and the promotion of network application level, the construction of campus network software and hardware is developing in high speed in our country. Information fee of CERNET is paid by each university. Facing more and more users and great network flows, the finance pressure of university is also greater and greater. So certain fee is imposed to users for limiting them to random explore web station, lowering network pressure of university, quickening information circulation speed, promoting running efficiency of network and ensuring the normal running of network.
Firstly, the paper summarizes accounting systems structure ,then introduces the tools of exploitation. The last is achieving methodologies of normal user module and database process.
Accounting:proxy server, network accounting system, module
目录
第一章 绪论 1
1.1研究背景 1
1.2计费系统一般策略概述 1
1.2.1基于路由器的计费系统 1
1.2.2透明网关计费系统 2
1.2.3基于代理的计费系统 3
1.3设计思想 4
第二章 SERVLET原理及ORACLE简介 5
2.1 Servlet简介 5
2.1.1什么是Servlet 5
2.1.2 JAVA Servlet 为什么优于传统的CGI 5
2.1.3 Servlet的一些应用范围 6
2.1.4 Servlet的结构 7
2.1.5 Servlet的接口 8
2.1.6 Servlet的生命周期 9
2.1.7 JDBC简介 10
2.2 Oracle 9i简介 13
2.2.1 什么是数据库 13
2.2.2 Oracle的体系结构 14
2.2.3 存储过程简介 15
2.3 发布环境 16
第三章 系统总体结构设计 17
3.1 系统整体设计思想 17
3.2 管理模设计 18
3.3数据处理模块设计 19
第四章 普通用户模块的设计与实现 21
4.1 个人信息 21
4.2个人交费 21
4.3个人花费 23
4.4修改密码 24
4.5 相关类说明 25
第五章 ORACLE数据处理模块的设计与实现 26
5.1 邮件计费存储过程的设计与实现 26
5.2 代理计费存储过程设计与实现 30
5.3数据字典 30
第六章 总结与展望 34
致谢 35
参考文献 36
36
第一章 绪论
1.1研究背景
计算机网络的网管工作始于60年代ARPANET诞生时期.在网络管理系统中,管理功能主要围绕着ISO定义的五大管理功能来定义,即网络配置管理、性能管理、安全管理、计费管理和差错管理。网管系统的开发目前己得到网络界的广泛重视,许多大公司相继推出了功能强大的网络管理平台,如HP的OpenView, IBM的Net View, Sun的Net Manager等。这些网管平台基本实现了ISO定义的网络管理的五大功能,但还远远满足不了实际需要,尤其是计费管理,计费管理作为网络管理的五大功能之一,它能够监测和控制网络操作的费用、代价,记录网络资源的使用情况。在CERNET确立了有偿使用网络资源的原则后,CERNET国际通信费用由各入网单位分担。这就使得计费管理在网络管理中显得更加重要。作为影响最大的网络管理功能,计费管理系统在整个网络管理系统中占有相当重要的地位。近年来,以Internet为代表的信息新技术迅速席卷全球,在计算、通讯、商务等领域都引发了引人注目的变革。由于众所周知的原因,网络的使用不能是免费的,服务提供者(ISP)总是要采取相应的手段收取一定的费用。如CERNET的现行收费政策是按流量计费,即按用户实际传输的信息流量进行计费。同时,为了鼓励国内交流和用户输出信息,只对国际进入流量计费。另外,对于绝大多数学校来说,除了CERNET分摊的流量费用之外,还需要支付DDN专线费用、网络系统运行维护费用等。因此,采用合理的计费管理系统对保证校园网络正常运行具有重要的意义。
自从CERNET建成以来至今,各高校根据自己的实际情况相继开发了不同的网络计费系统,概括起来主要有以下三种:基于路由器的流量计费、基于Proxy的流量计费和透明网关计费,分述如下:
1.2计费系统一般策略概述[1]
1.2.1基于路由器的计费系统[1]
这是一种曾经广为使用的计费方式,它在早期的计费系统中占统治地位。这种计费方式通过路由器内部功能实现计费。路由器是局域网和因特网的连接通道,是信息出入的咽喉,校园中的所有到因特网的网络流量都必须经过路由器,反之也一样,所以成了计费软件采集流量数据的地方,而且现在一般的路由器都有记录流量的功能。网络流量信息通过路由器时,其流量信息都会在路由器的内存中保留下来,它的记录格式由4个字段组成,分别为源IP地址、目的IP地址、包数和字节数,所以计费系统所要完成的操作就是把这些流量信息从路由器中取出来,经过特定分析后,就可以生成按每一IP地址流量的计费账单了。从路由器上取得上述数据又有3种方式:
. 通过SNMP协议,利用它的get-request和get-NextReq遍历整个计费表(MIB, Management Information Base,管理信息库)得到。但这种方法由于其格式复杂,所以实现比较麻烦。但它的优点是计费软件可移植性高,具有可以对不同厂家路由器进行计费的广泛性,而不需要改动或少量改动。
. 利用AAA(Authentication, Authorization, Accounting,认证,授权,计费),但是这种方法需要在Unix工作站上建立相应的Tacacs服务器,实施起来也不方便。
. 模拟Telnet程序,登录到路由器上,获取数据源。也就是说,通过编码模仿Telnet(借用它的23号端口),把Telnet的在终端屏幕上的输出(计费依据)定向到一个临时文件中,通过对这个临时文件的分析,得到计费账单。基于路由器的计费系统其特点是实现简单,一般的路由器都可以做到,并且不用增加过多的硬件。但是,它也有很明显的缺陷:只能对IP地址进行流量计费,不支持对用户的流量计费:不能防止IP地址盗用,虽然后来采用IP-MAC地址静态匹配技术来防止IP地址盗用,但其防范IP地址盗用的功能十分有限。
在端口扫描程序出现后,由于路由器流量记录溢出,计费准确性大为降低;对路由器的性能有比较大的影响,特别是在增加了防止IP地址盗用的功能后。另外,通过路由器点到点通信对每一个请求都要作一次访问,即使是访问频率较高的站点也是如此。这样不但增加了网络的负担,而且也不经济。
1.2.2透明网关计费系统[1]
这种计费方系统的实现是将计费服务器设计成一个透明网关,它连接内部网络和外部网络,但是在IP层以上它对于用户和网络设备都是透明的,其系统逻辑功能可以采用图来示意。
图1.1透明网关计费系统示意图
内部主机发往外部网络的数据包将由NICO接收,而外部网络发往内部主机的数据包将由NIC1接收,但NICO和NICI并非真正的传输目标,因此必须对接收到的数据包进行进一步的转发才能维持正常的通讯。该功能分别由绑定在NICO和NIC1上的两个IP FORWARD线程完成。两个线程首先从自己绑定的网卡上获取数据包,然后将通过规则检查的数据包从另一个网卡向真正的目标主机转发。具体的规则包括计费和安全两部分内容。转发时检查IP包头信息中的IP-MAC地址对与预先设置的IP-MAC地址对是否匹配,因而可以阻断IP-MAC不匹配的主机与外界的通讯。在此基础上,IP地址还与用户关联。用户通过身份认证后才能使用需要缴费的服务。
透明网关计费方式的优点是很好地防止IP地址盗用,容易实现访问控制,并将用户使用的流量信息准确地记录到用户帐户上,实现按用户实时精确计费;然而他的缺点也是显而易见的,当网络流量很大时,极易造成网络瓶颈。
1.2.3基于代理的计费系统[1]
基于路由器的计费系统,只能实现基于IP地址的流量计费,这对于那些有足够实IP地址的单位,给每个人每台机器分配一个固定IP地址,实施按IP流量计费,这是可以做到的。但众所周知,IP地址是相当紧张的,很多园区采用伪IP地址,显然这种做法无法计费到每个IP地址,同时也无法防止IP地址盗用,即使绑定IP和MAC地址,也无法防止IP和MAC地址一块儿被盗用,而且此种方法只能管理到IP级,无法管理到用户级。为解决以上问题,计费服务器采用从代理服务器(Proxy Server)的日志文件中采集数据,实现基于Proxy的计费系统。基于Proxy的计费方式是目前很多高校计费系统中普遍采用的一种方式,是主流。代理服务器的日志文件中的每一条日志记录都包含了Intranet中发出请求的客户机IT,地址、用户帐号、请求主机IP地址、流入字节数、流出字节数等信息,这些信息就是计费系统所需的数据信息。代理服务器是防火墙(FIREWALL)技术中应用层网关的实现形式,它同时扮演客户机和服务器两种角色。一方面作为代理服务器,接收Intranet中客户机所发出的对Internet的访问请求:另一方面,在完成了对这些访问请求的审核后,作为客户机将这些访问请求以自己的名义发送给Internet服务器。当外部Internet服务器的应答传回给代理服务器后,代理服务器就把这些应答分发给Intranet中提出请求的客户机。除了必要的身份认证外,代理服务器对用户是“透明”的。以上是代理服务器的简单工作过程。代理服务器具有对用户名和口令进行验证的功能,因此可以实现面向用户计费。所有的代理服务器都具有日志(log)存储功能,它将每次数据传送的详细信息记录下来并存储到日志中,计费系统可以根据时间打开相应的文件来完成数据采集。
1.3设计思想
本文计总体上采用了基于代理服务器的设计思想,通过代理服务器对每个用户数据流量的采集来进行分析处理的,然后把处理过的数据保存到数据库,供前台的程序查询。上网的每个用户需要通过自己的帐号上网,通过身份验证可以查询自己的帐户信息交费情况。也可以修改自己帐号上被授权修改的信息。
第二章 Servlet原理及Oracle简介
2.1 Servlet简介
2.1.1什么是Servlet
在使用JAVA开发基于Web的应用程序时,经常要用到动态的内容,例如,常见的购物网站的登陆,就必须根据输入的用户名和密码的不同,产生不同的反应,如果为每个用户都构造一个界面,可以想象那是多么的复杂。Servlet一种能够简化构造动态内容的关键技术。Servlet技术可以很容易的传递动态内容,并能很容易的部署。这样,只要简单的编写一段代码就可以处理大量类似的工作。大大的简化了编程。
Servlet是用JAVA代码编写的服务器方软件程序,用于处理客户机和服务器之间的信息传递。JAVA Servlet API 为请求和响应定义了一个标准的接口,这样Servlet就可以可以跨平台和跨不同的Web服务器移植。
Servlet可以通过动态构造一个发回客户机的响应来响应客户机请求。由于Servlet是用JAVA编程语言编写的,它们可以访问整个JAVA API集合。这就使它们非常适合实现复杂的商业应用逻辑,特别是访问企业中其他位置的数据。JDBC API就是一个示例,它允许JAVA程序访问关系数据库。可以多次调用一个Servlet来响应来自多个客户机的请求。一个Servlet可以同时处理多个请求,并且可以使这些请求同步。Servlet可以将请求转发到其他服务器和Servlet。
2.1.2 JAVA Servlet 为什么优于传统的CGI[2]
JAVA Servlet比传统的CGI或其它CGI类似替代技术来说,效率更高,使用更方便,功能更强大,更小巧也更便宜:
一、效率,传统CGI对每一个HTTP请求都要产生一个新的进程。如果某个CGI程序是一个执行非常快的操作,打开进程的时间也许占用了大部分执行时间。而对JAVA Servlets来说,在JAVA 虚拟机上,每一个请求由一个‘小’JAVA线程(thread)响应,而不是一个`大`操作系统进程。类似地,传统CGI如果对同一个CGI程序有N个同时请求,这个CGI程序的代码将被导入内存N次。JAVA Servlets 产生N个线程,但只有一个JAVA Servlets CLASS的copy。同时JAVA Servlets比CGI有更多的优化选择,象预先计算,打开数据库连接等。
二、方便,JAVA Servlets能自动的粘贴和解码HTML表单数据,读和设置HTTP头,处理COOKIES,跟踪SESSIONS,等其它大量功能。
三、强大的功能,JAVA Servlets可以很容易的实现对CGI来说是不可能或很困难的事务。JAVA Servlets能直接和服务器进行通讯而CGI是不能的。
四、JAVA Servlets之间能共享数据,很容易实现诸如数据库连接池。它能方便的实现管理从REQUEST到REQUEST请求,简化SESSION和获取前一页面。而CGI之间通讯差,由于每个CGI程序的调用都开始一个新的进程,调用间通讯通常要通过文件进行,因而相当缓慢。同一台服务器上的不同CGI程序之间的通讯也相当麻烦。
五、调用时间:CGI程序是作为单独过程运行的,通常调用时间较长,这个间接成本在每次调用的时候都要发生。在使用解释器的时候调用时间会更长。而内存中的servlet可以非常迅速地加载。
六、安全:有些CGI版本有明显的安全弱点。即使是使用最新的标准和PERL等语言,系统也没有基本安全框架,而要靠一组事实上的规则。而java定义有完整的安全机制,安全政策等规范。
七、小巧,JAVA Servlets使用JAVA编写,遵循标准API。它能直接或借助插件在几乎所有WEB服务器上运行。
八、价格低,显然,有很多都是FREE。
2.1.3 Servlet的一些应用范围[2]
一、用于处理HTML表单:通过HTTP产生POSTed数据,包括买卖订单或信用卡数据。因此 servlet可以成为订单处理系统的一部分,和产品存货数据库一道工作,也许可以用在在线支付系统上。
二、允许人们之间的合作:一个servlet能并发处理多个请求;他们可以使用在诸如在线会议这样的同步请求支持系统。
三、 转送请求:Servlet可以转送请求给其他的服务器和servlets。这就允许在镜象同样内容的几个服务器之间平衡负载。按照任务类型或组织范围,可以允许被用来在几个服务器中划分逻辑上的服务器。
四、 servlet 编写者们可以定义彼此之间共同工作的激活代理,每个代理者是一个servlet,而且代理者能够在他们之间传送数据。
2.1.4 Servlet的结构[2]
在具体掌握servlet之前,须对java语言有所了解。下面是基于您了解java基础上的,在Servlet API中最重要的是Servlet interface. 所有的servlets implement(执行)这个interface, 方式多种:或者是直接的,或者通过扩展类(class)执行它,如 HttpServlet。 这个Servlet interface 提供安排servlet与客户端联系的方法. Servlet 编写者可以在他们开发 servlet程序时提供更多一些或所有的这样方法.
当一个servlet接收来自客户端的调用请求, 它接收两个对象: 一个是ServletRequest,另外一个是ServletResponse. 这个ServletRequest类概括从客户端到服务器之间的联系, 而 ServletResponse类概括从servlet返回客户端的联系.
ServletRequest interface 可以获取到这样一些信息如由客户端传送的阐述名称,客户端正在使用的协议, 产生请求并且接收请求的服务器远端主机名. 它也提供获取数据流的servlet, ServletInputStream, 这些数据是客户端引用中使用HTTP POST 和 PUT 方法递交的. 一个ServletRequest的子类可以让 servlet获取更多的协议特性数据. 例如: HttpServletRequest 包含获取 HTTP-specific头部信息的方法.
ServletResponse interface 给出相应客户端的servlet方法. 它允许servlet 设置内容长度和回应的mime类型, 并且提供输出流, ServletOutputStream, 通过编写者可以发回相应数据. ServletResponse子类可以给出更多 protocol-specific容量的信息。 例如: HttpServletResponse 包含允许servlet 操作HTTP-specific头部信息的方法.
上面有关类和 interfaces描述构成了一个基本的Servlet框架. HTTP servlets有一些附加的可以提供session-tracking capabilities的方法. servlet编写者可以用这些API在有他人操作时维护servlet与客户端之间的状态.
2.1.5 Servlet的接口[2]
Servlet 从javax包的httpservlet类扩展,在HttpServlet中加入了一些附加的方法,这些方法可以被协助处理HTTP 基本请求的HttpServlet类中的方法service自动地调用。这些方法有:
一、 doGet 用来处理HTTP的GET请求。
这个GET操作仅仅允许客户从HTTP server上"取得"(GET)资源。重载此方法的用户自动允许支持方法HEAD。这个GET操作被认为是安全的,没有任何的负面影响,对用户来说是很可靠的。比如,大多数的正规查询都没有副作用。打算改变存储数据的请求必须用其他的HTTP方法。这要求方法也必须是个安全的操作。方法doGet的缺省执行将返回一个HTTP的BAD_REQUEST错误。
二、doPost 用来处理HTTP的POST请求。
这个POST操作包含了在必须通过此servlet执行的请求中的数据。由于它不能立即取得资源,故对于那些涉及到安全性的用户来说,通过POST请求操作会有一些副作用。方法doPost的缺省执行将返回一个HTTP的BAD_REQUEST错误。当编写servlet时,为了支持POST操作必须在子类HttpServlet中实现(implement)此方法。
三、doPut用来处理HTTP的PUT请求。
此PUT操作模拟通过FTP发送一个文件。对于那些涉及到安全性的用户来说,通过PUT请求操作也会有一些副作用。
四、doDelete用来处理HTTP的DELETE请求。
此操作允许客户端请求一个从server移出的URL。对于那些涉及到安全性的用户来说,通过DELETE请求操作会有一些副作用。方法doDelete的缺省执行将返回一个HTTP的BAD_REQUEST错误。当编写servlet时,为了支持DELETE操作,必须在子类HttpServlet中实现(implement)此方法。
五、doHead 用来处理HTTP的HEAD请求。
缺省地,它会在无条件的GET方法执行时期中运行,但是不返回任何数据到客户端。只返回包含内容信息的长度的header。由于用到GET操作,此方法应该是很安全的(没有副作用)也是可重复使用的。此方法的缺省实现(implement)自动地处理了HTTPDE的HEAD操作并且不需要通过一个子类实现(implement)。
六、doOptions用来处理HTTP的OPTIONS请求。
此操作自动地决定支持什么HTTP方法。比如说,如果一个servlet的作者创建HttpServlet的子类并重载方法doGet,然后方法doOptions会返回下面的header:Allow:GET,HEAD,TRACE,OPTIONS一般不需要重载方法doOptions。
七、doTrace用来处理HTTP的TRACE请求。
此方法的缺省执行产生一个包含所有在trace请求中的herder的信息的应(response)。在开发servlet时,多数情况下需要重载此方法。
在开发以HTTP为基础的servlet中,Servlet开发者关心方法doGet和方法doPost即可。
2.1.6 Servlet的生命周期[2]
如果你写过java的小应用程序(Apple),那Servlet对你来说就不会太难,更为简单因为Servlet不用考虑图形界面的应用,而与小应用程序一样,Servlet与有一个生命周期。Servlet的生命周期是当服务器装载运行servlets:接收来自客户端的多个请求并且返回数据给客户端. 然后在删除移开servlets.下面详细描述如下:
1)初始化时期
当一个服务器装载servlet时, 它运行servlet的 init() 方法.需要记住的是一定要在init()结束时调用super.init().init()方法不能反复调用,一旦调用就是重装载servlet. 直到服务器调用destroy方法卸载servlet后才能再调用.
2)Servlet的执行时期
在服务器装载初始化servlet后, servlet就能够处理客户端的请求. 用 service 方法做到这一点. 每个客户端请求有它自己service方法: 这些方法接收客户端请求, 并且发回相应的响应.Servlets能同时运行多个service. 这是很重要的, 这样, service方法可以按一个thread-safe 样式编写. 如:service方法更新servlet对象中的一个字段field, 这个字段可以同时存取的. 假如某个服务器不能同时并发运行 service方法,也可以用SingleThreadModel interface. 这个 interface 保证不会有两个以上的线程threads并发运行. 在Servlet执行期间其最多的应用是处理客户端的请求并产生一个网页。
3)Servlet结束时期
Servlets一直运行到他们被服务器卸载。在结束的时需地收回在init()方法中使用的资源,在Servlet中是通过destory()方法来实现的。
2.1.7 JDBC简介
JDBC是一种可用于执行SQL语句的JavaAPI(ApplicationProgrammingInterface应用程序设计接口)。它由一些Java语言编写的类和界面组成。JDBC为数据库应用开发人员、数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯Java语言编写完整的数据库应用程序。
一、 ODBC的结构模型[3]
ODBC的结构包括四个主要部分:应用程序接口、驱动器管理器、数据库驱动器和数据源。
应用程序接口:屏蔽不同的ODBC数据库驱动器之间函数调用的差别,为用户提供统一的SQL编程接口。
驱动器管理器:为应用程序装载数据库驱动器。
数据库驱动器:实现ODBC的函数调用,提供对特定数据源的SQL请求。如果需要,数据库驱动器将修改应用程序的请求,使得请求符合相关的DBMS所支持的文法。
数据源:由用户想要存取的数据以及与它相关的操作系统、DBMS和用于访问DBMS的网络平台组成。
虽然ODBC驱动器管理器的主要目的是加载数据库驱动器,以便ODBC函数调用,但是数据库驱动器本身也执行ODBC函数调用,并与数据库相互配合。因此当应用系统发出调用与数据源进行连接时,数据库驱动器能管理通信协议。当建立起与数据源的连接时,数据库驱动器便能处理应用系统向DBMS发出的请求,对分析或发自数据源的设计进行必要的翻译,并将结果返回给应用系统。
二、JDBC技术概述 [3]
JDBC是一种可用于执行SQL语句的Java API(Application Programming Interface,应用程序设计接口)。它由一些Java语言写的类、界面组成。JDBC给数据库应用开发人员、数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯Java语言编写完整的数据库应用程序。
通过使用JDBC,开发人员可以很方便地将SQL语句传送给几乎任何一种数据库。也就是说,开发人员可以不必写一个程序访问Sybase,写另一个程序访问Oracle,再写一个程序访问Microsoft的SQLServer。用JDBC写的程序能够自动地将SQL语句传送给相应的数据库管理系统(DBMS)。不但如此,使用Java编写的应用程序可以在任何支持Java的平台上运行,不必在不同的平台上编写不同的应用。Java和JDBC的结合可以让开发人员在开发数据库应用时真正实现“WriteOnce,RunEverywhere!”
Java具有健壮、安全、易用等特性,而且支持自动网上下载,本质上是一种很好的数据库应用的编程语言。它所需要的是Java应用如何同各种各样的数据库连接,JDBC正是实现这种连接的关键。
JDBC扩展了Java的能力,如使用Java和JDBCAPI就可以公布一个Web页,页中带有能访问远端数据库的Applet。或者企业可以通过JDBC让全部的职工(他们可以使用不同的操作系统,如Windwos,Machintosh和UNIX)在Intranet上连接到几个全球数据库上,而这几个全球数据库可以是不相同的。随着越来越多的程序开发人员使用Java语言,对Java访问数据库易操作性的需求越来越强烈。
MIS管理人员喜欢Java和JDBC,因为这样可以更容易经济地公布信息。各种已经安装在数据库中的事务处理都将继续正常运行,甚至这些事务处理是存储在不同的数据库管理系统中;而对新的数据库应用来说,开发时间将缩短,安装和版本升级将大大简化。程序员可以编写或改写一个程序,然后将它放在服务器上,而每个用户都可以访问服务器得到最新的版本。对于信息服务行业,Java和JDBC提供了一种很好的向外界用户更新信息的方法。
1. JDBC的任务[3]
简单地说,JDBC能完成下列三件事:
1)同一个数据库建立连接;
2)向数据库发送SQL语句;
3)处理数据库返回的结果。
2. JDBC—一种底层的API[3]
JDBC是一种底层API,这意味着它将直接调用SQL命令。JDBC完全胜任这个任务,而且比其他数据库互联更加容易实现。同时它也是构造高层API和数据库开发工具的基础。高层API和数据库开发工具应该是用户界面更加友好,使用更加方便,更易于理解的。但所有这样的API将最终被翻译为象JDBC这样的底层API。目前两种基于JDBC的高层API正处在开发阶段。
1) QL语言嵌入Java的预处理器。虽然DBMS已经实现了SQL查询,但JDBC要求SQL语句被当作字符串参数传送给Java程序。而嵌入式SQL预处理器允许程序员将SQL语句混用:Java变量可以在SQL语句中使用,来接收或提供数值。然后SQL的预处理器将把这种Java/SQL混用的程序翻译成带有JDBCAPI的Java程序。
2) 实现从关系数据库到Java类的直接映射。Javasoft和其他公司已经宣布要实现这一技术。在这种“对象/关系”映射中,表的每一行都将变成这类的一个实例,每一列的值对应实例的一个属性。程序员可以直接操作Java的对象;而存取所需要的SQL调用将在内部直接产生。还可以实现更加复杂的映射,比如多张表的行在一个Java的类中实现。
随着大家对JDBC兴趣的不断浓厚,越来越多的开发人员已经开始利用JDBC为基础的工具进行开发。这使开发工作变得容易。同时,程序员也正在开发对最终用户来说访问数据库更加容易的应用程序。
3. JDBC和ODBC及其他API的比较[3]
到目前为止,微软的ODBC可能是用得最广泛的访问关系数据库的API。它提供了连接几乎任何一种平台、任何一种数据库的能力。那么,为什么不直接从Java中直接使用ODBC呢?
回答是可以从Java中使用ODBC,但最好在JDBC的协助下,用JDBC-ODBC桥接器实现。那么,为什么需要JDBC呢?要回答这个问题,有这么几个方面:
1)ODBC并不适合在Java中直接使用。ODBC是一个C语言实现的API,从Java程序调用本地的C程序会带来一系列类似安全性、完整性、健壮性的缺点。
2)其次,完全精确地实现从C代码ODBC到JavaAPI写的ODBC的翻译也并不令人满意。比如,Java没有指针,而ODBC中大量地使用了指针,包括极易出错的空指针“void*”。因此,对Java程序员来说,把JDBC设想成将ODBC转换成面向对象的API是很自然的。
3)ODBC并不容易学习,它将简单特性和复杂特性混杂在一起,甚至对非常简单的查询都有复杂的选项。而JDBC刚好相反,它保持了简单事物的简单性,但又允许复杂的特性。
4)JDBC这样的JavaAPI对于纯Java方案来说是必须的。当使用ODBC时,人们必须在每一台客户机上安装ODBC驱动器和驱动管理器。如果JDBC驱动器是完全用Java语言实现的话,那么JDBC的代码就可以自动的下载和安装,并保证其安全性,而且,这将适应任何Java平台,从网络计算机NC到大型主机Mainframe。
总而言之,JDBC API是能体现SQL最基本抽象概念的、最直接的Java接口。它建构在ODBC的基础上,因此,熟悉ODBC的程序员将发现学习JDBC非常容易。JDBC保持了ODBC的基本设计特征。它们的最大的不同是JDBC是基于Java的风格和优点,并强化了Java的风格和优点。
4. JDBC两层模型和三层模型[3]
JDBC支持两层模型,也支持三层模型访问数据库。两层模型中,一个java Appple或者一个Java应用直接同数据库连接。这就需要能直接被访问的数据库进行连接的JDBC驱动器。用户的SQL语句被传送给数据库,而这些语句执行的结果将被传回给用户。数据库可以在同一机器上,也可以另一机器上通过网络进行连接。这被称为“Client/Server”结构,用户的计算机作为Client,运行数据库的计算机作为Server。这个网络可是intranet,比如连接全体雇员的企业内部网,当然也可以是internet。
在三层模型中,命令将被发送到服务的“中间层”,而“中间层”将SQL语句发送到数据库。数据库处理SQL语句并将结果返回“中间层”,然后“中间层”将它们 返回用户。MIS管理员将发现三层模型很有吸引力,因为“中间层”可以进行对访问的控制并协同数据库的更新,另一个优势就是如果有一个“中间层”用户就可以使用一个易用的高层的API,这个API可以由“中间层”进行转换,转换成底层的调用。而且,在许多情况下,三层模型可以提供更好的性能。
到目前为止,“中间层”通常还是用C或C++实现,以保证其高性能。但随着优化编译器的引入,将java的字节码转换成高效的机器码,用java来实现“中间层”将越来越实际。而JDBC是允许从一个java“中间层”访问数据库的关键。
2.2 Oracle 9i简介
2.2.1 什么是数据库
数据库系统由计算机软、硬件资源,它实现了有组织的、动态的存储大量关联数据,方便的用户访问,它与文件系统的主要区别是数据的充分共享、交叉访问、与应用程序的高度独立性。通俗的讲,数据库系统可以把日常一些表格、卡片等的数据有组织的集合在一起,输入的计算机,然后通过计算机处理,再按一定的要求输出结果。所以,对于数据库来说,主要应解决三个问题:第一,有效的组织数据,这主要指对数据进行合理设计,以便于计算机存取;第二,方便的将数据输入到计算机中;第三,根据用户的要求将数据从计算机中提取出来。
2.2.2 Oracle的体系结构[9]
Oracle提供了三层数据结构,如下图:
SQL
用户1
用户2
用户4
用户5
用户3
视图1
视图2
基本表1
基本表2
基本表3
基本表4
数据库文件
图2.1 Oracle数据结果图
Oracle的全局逻辑结构是一组基本表。一个基本表是数据库中实际被存储的关系。Oracle局部逻辑结构是由建立在基本表上的视图和基本表组成的,即Oracle中的用户可以直接通过SQL去查询视图和基本表。SQL是一组功能很强的关系数据库语言。Oracle中提供了两种形式的SQL:一种是供即席查询的SQL(在SQL*PLUS下),一种是供嵌入到程序设计语言中的SQL(在Pro*C中)。Oracle存储由数据库文件组成。在Oracle中,一个数据库对应一组数据库文件。
2.2.3 存储过程简介
存储过程是存储在数据库中的一段存储程序。当创建存储过程时,系统会对其进行编译,并将执行代码存储到数据库中。
一、设计存储过程的方针:在定义存储过程时,要使用其完成单一、相对集中的任务。在定义存储过程时,不要定义已经由其它特征所提供功能的过程。例如,不要定义强制数据完整性的过程(使用完整性约束)。
二、 存储过程的优点:
1、安全性
当创建了存储过程之后,可以将执行该过程的权限授予其它用户,从而使得他可以执行特定的数据库操作,而不能访问其它模式对象(例如表)。例如,你可以将执行过程(更新表)的权限授予其它用户,但不授予它们直接访问该表的权限。
2、性能
存储过程只被发送到数据库一次,相对于SQL语句或PL/SQL块而言,其网络通信量更小。当调用存储过程时,数据库会直接运行该存储过程,无需进行编译。相对于SQL语句PL/SQL块而言,其执行速度更快。
3、内存分配
展开阅读全文