如何使用JSP访问Oracle数据库
本章内容
●数据引擎JDBC
●通过JDBC-ODBC访问Oracle数据库
●使用JDBC访问数据库
●使用JavaBean模式访问数据库
●使用连接池访问数据库
●其他典型JSP数据库访问
本章目标
●熟悉JDBC数据引擎技术,掌握其在Windows下的配置和使用方法
●掌握JavaBean+JSP访问Oracle数据库的方法
8.1 数据引擎JDBC
数据库连接对动态网站来说是最为重要的部分,Java中连接数据库的技术是JDBC(Java Database Connectivity)。JDBC是一种可用于执行SQL语句的Java API,它为数据库应用开发人员、数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯Java语言编写完整的数据库应用程序。在了解JDBC之前,有必要了解一下Microsoft公司制订的统一数据库编程接口的解决方案,即ODBC(Open DataBase Connectivity,开放式数据库互连)。
Microsoft推出的ODBC技术为不同数据库的访问提供了统一的接口。ODBC在不同的数据库各自的驱动之上建立了一组对数据库访问的标准API,这些API利用SQL语句来完成其大部分任务。数据库的ODBC驱动程序负责所有的底层数据库访问操作,然后给上层的应用程序提供统一的编程接口,上层的应用程序只需调用ODBC的统一编程接口就能与数据库打交道。因此,基于ODBC的应用程序对数据库的操作不依赖于具体的数据库,不论是Access,SQL Server、DB2还是Oracle数据库,均可以用ODBC API进行访问,程序代码都完全相同,也就是说,ODBC能以统一的方式处理所有的数据库。
ODBC可以为不同的数据库提供相应的驱动程序。对于Microsoft公司自己的数据库产品,比如SQL Server和Access,在Windows操作系统里内置了支持这些数据库的ODBC驱动程序,而对于其他公司的数据库产品,则需要安装相应的ODBC驱动程序。ODBC数据源是作为数据源使用的数据库或数据库服务器。在数据库应用程序中,通过ODBC数据源来连接数据库。在连接数据库之前,要在Windows的控制面板中使用ODBC管理程序来注册这个数据源。ODBC驱动程序是一个动态链接库,它将数据源与应用程序相连接。
ODBC在数据库技术发展的过程中占有极其重要的地位,它如此成功,以至于成为当时数据库技术中的一个标准。但是ODBC对数据库的兼容性是以效率的降低为代价的,ODBC
JSP+Oracle动态网站开发
可以看作是在数据层和应用程序之间的一个中间层,因此利用ODBC访问数据库的效率要低于直接通过数据库专用驱动的访问。ODBC最大的问题不是效率,而是平台的支持,这是因为ODBC产生于Windows操作系统,只有在Windows平台下才能得到最好的支持。
最初的Java应用程序也是通过ODBC连接数据库的,由于ODBC的API是使用C语言进行调用的,这就使得Java的许多优秀特性无法充分发挥,比如平台无关性、面向对象的特性等。基于这些技术上的缺陷,Sun公司不失时机地推出了具有Java语言特性的独有的数据库解决方案——JDBC。JDBC在继承ODBC接口与具体数据库无关的设计理念的基础上,进一步利用了Java语言的平台无关性,使得程序员可以轻松利用JDBC的API对数据库进行操作,从而编写出真正不依赖于具体数据库、具体操作平台的代码。这些JDBC的API就是Java基础类库中的java.sql包,任何一个需要访问数据库的Java应用程序都需要导入这个包。
Java应用程序通过JDBC接口访问数据库有5种具体的底层处理机制。
(1) JDBC-ODBC桥结合ODBC驱动程序
一个JDBC-ODBC驱动程序提供了能够访问一个或多个ODBC驱动程序的JDBC API,它是一个本地的解决方案。这种方式将JDBC请求转换为ODBC请求,因此在每一个数据库的客户端都必须安装ODBC驱动,这种方式不适合远程访问数据库。
(2) 原生API结合Java驱动程序
这种方式同样也是一种本地解决方案。它将对JDBC API的调用转换为对Oracle、SQL Server、Sybase等其他数据库客户端API的调用,因而每个客户端上要安装对应于具体数据库的驱动程序。
(3) 网络协议结合纯Java驱动程序
这种方式通过一个服务器将JDBC API调用转换为中间网络协议发送给网络上的另一个服务器,然后再由这个服务器将这种中间网络协议转换为对指定数据库系统的调用。这里,中间网络协议起到一个读取数据库的中间件的作用,能够连接许多类型的数据库,而在客户端上无须安装特定的数据库驱动,因而是最灵活的JDBC模式。这种驱动程序适合于通过Internet访问数据库,但要考虑安全认证的问题。
(4) 原生协议结合纯Java驱动程序
这种驱动程序一般由数据库厂商实现。它将Java API的调用转换为指定的数据库系统使用的网络协议。这种驱动程序使用的中间转换最少,而且一般都是由数据库厂商直接提供的,因此使用起来稳定性最高。
(5) JDO
JDO(Java Data Object)是Sun公司新推出的一个访问数据库的API,它定义了新的数据存取的模型。JDO的实现方式是在JDBC技术的基础上进行封装,将数据库相关的JDBC连接细节封装隐藏起来,使程序员在设计连接数据库的应用程序时只需关注创建那些实现商业逻辑的类和用它们来表现数据源的数据,而这些类和数据源之间的映射则由专家来完成,这样一来就给开发数据库的程序员带来了极大的便利。
纵观上面这5种使用JDBC接口访问数据库的驱动机制,后3种驱动是比较理想的选择,而前两种驱动是用Java访问数据库时最常用的方式。
一般来说,Java应用程序访问数据库的过程(见图8.1)如下。
352
错误!未找到引用源。
①装载数据库驱动程序。
②通过JDBC建立数据库连接。
③访问数据库,执行SQL语句。
④断开数据库连接。
图8.1 JDBC的数据库访问机制
JDBC的功能十分强大,而且得到了绝大部分数据库厂商的支持,数据引擎的称号对JDBC
来说是当之无愧的。
8.2 通过JDBC-ODBC访问Oracle数据库
JDBC-ODBC桥作为JDBC API访问具体数据库的中间环节,是使用JSP访问数据库常用
的一个办法。
这里,我们以一个在Windows XP系统下访问Oracle 10g的实例来讲解如何在JSP中使用JDBC-ODBC桥结合ODBC驱动程序的机制来访问数据库。
8.2.1 创建ODBC数据源
如果要通过ODBC访问数据库,就必须为建立好的数据库添加一个数据源以便与应用程
序交互。每一个ODBC数据源对应于某一个数据库系统中一个指定的数据库。比如要以SCOTT
用户身份访问myorc数据库中的emp表,这时,就要为数据库myorc建立一个数据源。
在Windows系统中为myorc数据库建立一个ODBC数据源的步骤如下。
(1) 在控制面板的“管理工具”中,双击打开“数据源(ODBC)”,在弹出的【ODBC数
据源管理器】对话框中,选择【系统DSN】选项卡,如图8.2所示,
(2) 单击【添加】按钮,弹出【创建新数据源】对话框,如图8.3所示,在对话框中选择“Oracle in OraDb10g_home1”。
(3) 单击【完成】按钮,弹出Oracle ODBC Driver Configuration对话框,如图8.4所示,
在Data Source Name一栏中填入数据源名“myOracle_conn”;在TNS Service Name下拉列表
353
JSP+Oracle动态网站开发
框中选择数据库“MYORC”;在User栏中输入用户名“scott”。其他选项保持默认。
(4) 单击Test Connection按钮,测试当前设置是否能成功连接Oracle,在弹出的Oracle ODBC Driver Connect对话框中输入以SCOTT身份登录MYORC数据库的密码,如图8.5所示。
图8.2 【ODBC数据源管理器】对话框图8.3 选择
Oracle in OraDb10g_home1
图8.4 配置数据库信息图8.5 输入密码
(5) 单击OK按钮,如果弹出如图8.6所示的提示对话框,则说明我们已成功配置。
(6) 单击【确定】按钮,返回Oracle ODBC Driver Configuration对话框,继续单击OK按
钮,就会看到在【ODBC数据源管理器】对话框中添加了一个名为myOracle_conn的数据源,如图8.7所示。
图8.6 配置成功的提示信息图8.7 完成数据源myOracle_conn的创建工作
354
错误!未找到引用源。
(7) 在图8.7中单击【确定】按钮,至此ODBC数据源的创建工作结束。
8.2.2 编写JSP测试程序
既然已经完成了数据源myOracle_conn的创建工作,下面就要开始编写访问数据库的JSP
程序了。
由于我们采用JDBC-ODBC桥的方式进行访问,因此就不需要再安装JDBC驱动了,因为JDBC-ODBC驱动程序是由JDK系统自带的。下面的程序清单显示了如何通过JDBC-ODBC桥
来访问数据库。
在Eclipse中创建一个J2EE项目,名称为“odbc_test”,然后新建一个名为“Test_jdbc.jsp”
的文件,输入以下代码。
【代码8.1】Test_jdbc.jsp
<%@ page contentType="text/html;charset=GB2312"%>
<%@ page import="java.sql.*"%>
通过JDBC-ODBC桥访问数据库
员工号 | 姓名 | 工作性质 | 所属领导编号 | 入职时间 | 薪资 | 奖金 | 部门编号 |
<%=rs.getInt(1)%> | <%=rs.getString(2)%> | <%=rs.getString(3)%> | <%=rs.getInt(4)%> | <%=rs.getDate(5)%> | <%=rs.getInt(6)%> | <%=rs.getInt(7)%> | <%=rs.getInt(8)%> |
这个JSP程序用来从数据库myorc中读出所有的信息,并在浏览器中将这些信息以一张表的形式显示出来。
在Eclipse中启动Tomcat服务器,在浏览器的地址栏中输入:
http://localhost:8089/odbc_test/Test_jdbc.jsp
运行这个JSP程序,结果如图8.8所示。
图8.8 通过JDBC-ODBC桥访问数据库
错误!未找到引用源。
8.2.3 JDBC编程详解
上面这个JSP实例给我们展示了如何使用JDBC的编程语句对数据库进行访问。接下来我
们将深入JDBC内部,详细介绍它们的作用以及具体用法。
1. 导入java.sql包
所有与数据库有关的对象和方法都在java.sql包中,包java.sql包含了用Java操纵关系数
据库的类和接口。因此在使用JDBC的程序中必须要加入“import java.sql.*”。
2. 加载驱动程序
在JDBC连接到ODBC数据库之前,必须要加载JDBC-ODBC桥驱动程序:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
这里,使用了Class类(https://www.wendangku.net/doc/77706522.html,ng包)中的方法forName,来装入该驱动程序的类定义sun.jdbc.odbc.JdbcOdbcDriver,从而创建了该驱动程序的一个实例。
3. 连接数据库
完成上述操作后,就可以连接一个特定的数据库了。这需要创建Connection(java.sql包)类
的一个实例,并使用DriverManager(java.sql包)的方法getConnection来尝试建立用url指定的
数据库的连接。下面是JDBC与数据源myOracle_conn相连接的代码:
String url = "jdbc:odbc:myOracle_conn";
String username = "scott";
String password = "scott";
Connection con = DriverManager.getConnection(url, username, password);
这里,java.sql.Connection类用于管理JDBC与数据库之间的连接,它还提供了对SQL语
言的支持,以便操纵数据库进行事务处理。java.sql.DriverManager类是驱动程序管理器,其方
法getConnection用来建立与url指定的数据库的连接,它的第一个参数是数据源的url,后面
两个参数分别为数据源的用户名和密码。
数据源的url的作用是定位一个数据库以便使驱动程序能够找到这个数据库并与其进行连
接,它的格式如下:
协议标识:驱动程序标识:数据库标识
其中:
协议标识总是“jdbc”;驱动程序标识代表所使用的驱动程序协议名;数据库标识是数据
库的定位方式,它根据驱动程序协议的不同而有所不同。比如在ODBC的协议下,数据库标
识就是ODBC数据源的名称,而在dbnet的协议下,它是一个表示数据库位置的url。在我们
这个实例中,采用JDBC-ODBC桥的方式连接数据库,因而驱动程序标识为“odbc”,数据库
标识就是实例中创建的那个ODBC数据源myOracle_conn,由此方法getConnection中的第一个
参数url就要设置为url=“jdbc:odbc:myOracle_conn”。
4. 访问数据库
连接到数据源MyOracle_conn以后就可以访问数据库了。这需要先用Connection类对象的createStatement方法从指定的数据库连接得到一个Statement(java.sql包)的实例,然后用这个实
357
JSP+Oracle动态网站开发
例的executeQuery方法来执行一条SQL语句。代码如下:
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from Users");
这里,java.sql.Statement类用来向数据库递交查询或修改请求。Statement.executeQuery()用来执行一条SQL语句的查询结果。如果要对数据库中的记录进行修改,则要使用Statement.updateQuery()方法。
java.sql.ResultSet类用来保存SQL语句的执行结果,还可以存取结果中的数据。对数据库的查询或修改等操作将返回一个包含了查询结果的ResultSet对象。
5. 获取数据库记录中的字段值
ResultSet对象是JDBC中比较重要的一个对象,几乎所有的查询和修改等操作都将数据作为ResultSet对象返回。Result包含任意数量的命名列,可以按名称访问这些列,它还包含一个或多个行,也可以按顺序自上而下逐一访问这些列。下面是访问并显示数据源MyOracle_conn 的代码:
<%
...
while(rs.next())
{
%>
<%
}
...
%>
这里,rs.next()方法用来得到数据结果中的下一条记录。在进行前面的查询操作之后,得到的ResultSet中的指针指向第一条记录之前的一个位置,因此先要调用一次next方法使指针指向第一条记录。Next方法返回一个boolean值,表示能否定位下一条记录,如返回值为false,则表示不存在更多的记录,否则就可以提取下一条记录。
rs.getString方法用来得到当前记录中的某一字段的值,返回类型为String,其他的方法还有getFloat()、getInt()的等。注意,所要读取的字段名应该与数据库内的相应字段名完全一致,包括大小写也要一致。
6. 关闭数据库连接,释放资源
对数据库的操作完成之后,要及时关闭ResultSet对象和数据库连接对象Connection,从而释放占用的资源,这就要用到close的方法。
358
错误!未找到引用源。
代码如下:
rs.close();
con.close();
这样,对查询结果使用完毕后及时关闭了ResultSet对象;在全部数据库操作结束后及时
关闭了Connection连接对象。
8.3 使用JavaBean模式访问数据库
JavaBeans和ActiveX控件一样,可以通过封装业务逻辑建立一整套可重复利用的对象库。JSP对于在Web应用中集成JavaBeans组件提供了完善的支持,这种支持不仅能缩短开发时间
(可以直接利用经过测试和可信任的已有组件)、避免重复开发,也为JSP应用带来了更多的可
伸缩性。JavaBeans组件可以用来执行复杂的计算任务、或负责与数据库的交互以及数据提取
等,这里将以一个实例来介绍如何在JSP中利用JavaBeans通过JDBC-ODBC桥访问客户信
息数据库。
通过前面章节对JavaBean的学习,我们已经能够熟练地使用“JSP+JavaBean”的开发模式
将复杂的、重复性的事务处理代码封装进JvaaBean中供JSP调用。在用JSP访问数据库时,
每一次对数据库进行操作时都要进行一系列相同的操作:设置驱动程序,连接数据库,生成一
条语句,进行SQL操作,最后断开连接。将这些操作全部放在JSP页面中运行是很繁琐的,
因此完全可以把这些对数据库的操作放到JavaBean中去。这样当系统更换后台的数据库时,
只需在JavaBean中改变驱动程序以及连接方法即可,从而能够提高代码的可重用性和运行时
的效率。
下面我们来将8.2.2小节中的实例改写为“JSP+JavaBean”的模式。
【代码8.2】odbc_javabean.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.sql.*" %>
通过JDBC-ODBC桥访问数据库,其中使用了JavaBean。
员工号 | 姓名 | 工作性质 | 所属领导编号 | 入职时间 | 薪资 | 奖金 | 部门编号 |
<%=rs.getInt(1)%> | <%=rs.getString(2)%> | <%=rs.getString(3)%> | <%=rs.getInt(4)%> | <%=rs.getDate(5)%> | <%=rs.getInt(6)%> | <%=rs.getInt(7)%> | <%=rs.getInt(8)%> |
【代码8.3】JdbcBean.java
package https://www.wendangku.net/doc/77706522.html,;
import java.sql.*;
public class JdbcBean
{
Connection con = null;
ResultSet rs = null;
//实例化、装载JDBC驱动程序
public JdbcBean()
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e)
{
}
}
//返回查询后的数据集
public ResultSet executeQuery(String sql)
{
String url = "jdbc:odbc:MyOracle_conn";
String username = "scott";
String password = "scott";
try
360
361
错误!未找到引用源。
{
con = DriverManager.getConnection(url, username, password); Statement stmt = con.createStatement(); rs = stmt.executeQuery(sql); }
catch(SQLException e) { }
return rs;
}
//关闭数据库
public void closeDB() {
try {
rs.close(); con.close(); }
catch(SQLException e) { } }
}
我们在JavaBean 程序JdbcBean.java 中定义了3个方法函数。其中构造函数JdbcBean()用来装载JDBC-ODBC 桥驱动程序;函数executeQuery(String sql)用来执行对数据源MyOracle_conn 的查询操作,并将查询所得的数据结果以ResultSet 对象的形式返回;函数closeDB()用来关闭数据源和连接,释放资源。
JSP 程序odbc_javabean.jsp 中调用了这个JavaBean ,并将对数据源MyOracle_conn 的查询结果信息显示出来。运行这个JSP 程序,效果如图8.9所示。
图8.9 使用JavaBean 通过JDBC-ODBC 桥访问数据库
可以看出,JSP 是一种开发Web 应用的理想构架,利用跨平台运行的JavaBeans 组件,JSP 为分离处理逻辑及显示样式提供了卓越的解决方案。
JSP+Oracle动态网站开发
8.4 直接使用JDBC访问数据库
除了通过JDBC-ODBC桥的方式来访问数据库外,我们也可以直接使用JDBC来访问这些数据库。这样,访问的流程就可以简化为:JSP→JDBC驱动程序→数据库。当然,这还需要为指定的数据库安装相应的JDBC驱动程序。
下面我们以在Windows XP系统下访问Oracle 10g数据库为例,讲解如何在JSP中直接使用JDBC来访问数据库。
1. 安装JDBC驱动程序
在Oracle安装目录Oracle\jdbc\lib下,找到classes12.jar文件,它就是用于连接Oracle数据库的JDBC驱动程序。将其拷贝到Tomcat安装目录中的“C:\Tomcat 5.5\common\lib”目录下。也可以在Windows系统的环境变量CLASSPATH中指定此jar文件。重新启动Tomcat后,这个驱动程序即可生效。
2. 编写JSP程序
JSP程序的具体代码如下。
【代码8.4】jdbc.jsp
<%@ page contentType="text/html;charset=GB2312"%>
<%@ page import="java.sql.*"%>
使用JDBC直接访问数据库
员工号 | 姓名 | 工作性质 | 所属领导编号 | 入职时间 | 薪资 | 奖金 | 部门编号 |
<%=rs.getInt(1)%> | <%=rs.getString(2)%> | <%=rs.getString(3)%> | <%=rs.getInt(4)%> | <%=rs.getDate(5)%> | <%=rs.getInt(6)%> | <%=rs.getInt(7)%> | <%=rs.getInt(8)%> |
运行这个JSP 程序,结果如图8.10所示。
图8.10 直接使用JDBC 访问Oracle 数据库
3. 程序说明
这个JSP 程序与前面的代码8.1“Test_jdbc.jsp ”仅有两处区别,一处是加载驱动程序的方法Class.forName()中的参数改为了“oracle.jdbc.driver.OracleDriver ”,这个字符串代表的是Oracle 的驱动程序。另一处是在与Oracle 数据库建立连接时,使用了:
Connection con = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:myorc", "scott", "scott");
这里,连接方式也发生了变化,不用通过ODBC 数据源去连接,而是使用了一个URL 指定要访问的数据库的位置。
364JSP+Oracle动态网站开发
8.5 使用连接池访问数据库
JDBC作为一种数据库访问技术,具有简单易用的优点。但使用这种模式进行Web应用程序开发,存在很多问题。
首先,每一次Web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费一定的时间,而且系统还要分配内存资源。这个时间对于一次或几次数据库操作,或许感觉不出系统有多大的开销。可是对于现在的Web应用,尤其是大型电子商务网站,同时有几百人甚至几千人在线是很正常的事。在这种情况下,频繁地进行数据库连接操作势必占用很多的系统资源,网站的响应速度必定下降,严重时甚至会造成服务器的崩溃。这就是制约某些电子商务网站发展的技术瓶颈问题。
其次,对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。还有,这种开发不能控制被创建的连接对象数,系统资源会被毫无顾忌地分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。
由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理。而在共享资源的创建中,有一个很著名的设计模式,即资源池(Resource Pool)。该模式正是为了解决资源的频繁分配、释放所造成的问题。为解决上述问题,同样也可以采用数据库连接池(Connection Pool)技术。下面就来详细介绍数据库连接池。
8.5.1 连接池的工作原理
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无限度地与数据库连接。更为重要的是,我们可以通过连接池的管理机制监视数据库的连接的数量及使用情况,为系统开发、测试和性能调整提供依据。其工作原理如图8.11所示。
图8.11 数据库连接池的原理
365
错误!未找到引用源。
(1) 一个数据库连接池应具备以下的功能: ● 能够存储n 个有效的连接。 ● 能够为其他方法提供有效连接。 ● 能够验证连接是否正常。 ● 能够取回使用过的连接。
● 如果当前连接池中没有可用连接,就创建新的连接提供给应用程序。 ● 连接池关闭时关闭所有连接。
(2) 有时候在一个应用程序需要访问不同的数据库,这就需要为每一个数据库都建立一个连接池,其实最好的办法是设计一个连接池管理器专门用于连接池的管理,这个管理器应该有以下的功能:
● 根据初始设置创建不同的连接池。
● 能够存储多个不同的连接池,每个连接池存储一类连接。 ● 根据不同的请求提供不同连接池中的连接。 ● 将使用完的连接放回到相应的连接池中去。 ● 关闭所有连接池中的连接
8.5.2 实例:在JSP 中使用连接池访问数据库
下面我们来看一个例子,在这个例子中,我们要用到两个数据库:MyOracle_conn(Oracle 数据库)和testAccess(Access 数据库)。将创建数据库的连接池,并用连接池管理器对这两个连接池进行管理。在JSP 程序中通过对连接池管理器的调用获取这两个数据库中的信息。由于我们以前没有创建testAccess 数据库,所以应首先创建它并进行JDBC 配置。
1. 创建Access 数据库并进行配置
(1) 在桌面上选择“开始”→“所有程序”→“Microsoft Office ”→“Microsoft Office Access 2003”命令,将出现如图8.12所示的对话框。新建一个名为“mydb.mdb ”的数据库。
图8.12 新建“mydb.mdb ”数据库
JSP+Oracle动态网站开发
(2) 单击【创建】按钮,就会出现名为【mydb : 数据库】的窗口,如图8.13所示。
图8.13 数据表的设计界面
(3) 双击【使用设计器创建表】,按照图8.14来设计一个数据表,表名为“student”。
(4) 最后为student表添加几条记录,如图8.15所示。
将这些数据信息保存,然后关闭Access,完成数据表的创建工作。接下来就要创建ODBC 数据源了。
图8.14 设计数据表
图8.15 为表Users添加数据信息
2. 创建ODBC数据源
要访问上面创建的mydb数据库中的student表,就要为数据库mydb建立一个数据源。创建方法与8.2.1小节创建Oracle数据库ODBC数据源的操作类似,步骤如下。
(1) 在控制面板的“管理工具”中,双击“数据源(ODBC)”,选择“系统DSN”。
366
367
错误!未找到引用源。
(2) 单击“添加”按钮,在弹出的【创建新数据源】对话框中选择“Microsoft Access Driver(*.mdb)”,如图8.16所示。
图8.16 选择Microsoft Access Driver
(3) 单击【完成】按钮,弹出【ODBC Microsoft Access 安装】对话框,在【数据源名】一栏中填入数据源名“Access_Database ”,再单击【选择】按钮。在弹出的【选择数据库】对话框中找到所需的数据库文件mydb.mdb ,如图8.17所示。
图8.17 找到所需的数据库文件mydb.mdb
(4) 单击【确定】按钮,即可将数据源Access_Database 映射到数据库文件mydb.mdb ,如图8.18所示。最后单击【确定】按钮完成配置。
图8.18 将数据源Access_Database 映射到数据库文件mydb.mdb
JSP+Oracle动态网站开发
3. 用JavaBean实现连接池类DBConnPool
下面给出连接池类的主要属性及所要实现的方法。
【代码8.5】DBConnPool.java
package https://www.wendangku.net/doc/77706522.html,;
import java.sql.*;
import java.util.*;
/* 连接池类。能够根据要求创建新连接,直到最大连接数为止 */
public class DBConnPool
{
private int inUse = 0; // 实际使用中的连接数
private Vector connections = new Vector(); // 空闲连接
private String poolname; // 连接池名
private String dbid; // 数据库标识
private String drivername; // 数据库驱动程序名
private String username; // 数据库用户名
private String passwd; // 数据库密码
private int maxconn; // 连接池里允许存在的最大连接数
public DBConnPool(String poolname, String drivername, String dbid,
String username, String passwd, int maxconn)
{
this.poolname = poolname; // 连接池名
this.dbid = dbid; // 数据库标识
this.drivername = drivername; // 驱动程序名
https://www.wendangku.net/doc/77706522.html,ername = username; // 数据库用户名
this.passwd = passwd; // 数据库访问密码
this.maxconn = maxconn; //最大连接数
}
/* 将连接返回给连接池 */
public synchronized void releaseConnection(Connection con)
{
connections.addElement(con); // 将指定连接加入到向量末尾
inUse--; // 连接数减1
}
/* 从连接池得到一个连接 */
public synchronized Connection getConnection()
{
Connection con = null;
if(connections.size() > 0)
{
// 从连接列表中获得第一个连接
con = (Connection)connections.elementAt(0);
connections.removeElementAt(0);
// 如果此连接已关闭,则继续获取
try
{
if(con.isClosed())
con = getConnection();
}
catch(Exception ex)
368
错误!未找到引用源。
{
ex.printStackTrace();
}
}
// 如果实际使用的连接小于最大连接数,就新创建一个连接
else if (maxconn == 0 || inUse < maxconn)
{
con = newConnection();
}
if(con != null)
{
inUse++; // 连接数加1
}
return con; // 返回一个连接
}
/* 创建新的连接 */
private Connection newConnection()
{
Connection con = null;
try
{
Class.forName(drivername); // 加载驱动程序
// 建立连接
con = DriverManager.getConnection(dbid, username, passwd);
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
return con; // 返回该连接
}
/* 关闭所有连接 */
public synchronized void closeConn()
{
Enumeration allConnections = connections.elements();
while(allConnections.hasMoreElements())
{
Connection con = (Connection)allConnections.nextElement();
try
{
con.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
}
connections.removeAllElements();
}
}
369
JSP+Oracle动态网站开发
在上面这个连接池类中,有一个向量connections用于存储连接对象,它所存储的就是空闲状态的可用连接;应用程序通过getConnection()方法得到连接,如果此时有空闲的可用连接,那么就将连接向量的第一个连接对象返回,并将这个对象从队列中删去。如果此时没有空闲连接,但是连接数又没有达到连接总数的上限,那么就使用newConnection()创建一个新的连接返回给应用程序。如果连接数已经达到上限,那么就返回空指针,要求应用程序等待。
在将连接对象交给外部程序之前,连接池还要通过isClosed()方法判断该连接是否已经中断,如果是的话,还应该继续调用getConnection()方法得到一个可用连接。在将一个可用连接提供给应用程序后,要将使用中的连接数inUse加1。
需要提醒用户的是,应用程序使用连接后,一定要注意及时调用releaseConnection()方法将连接返回给连接池,连接池类将这个连接对象加入到连接向量的末尾,并将使用中的连接数减1。这样一来,每次得到的连接对象都是在连接向量中闲置时间最长的连接,从而减少了因为闲置时间过长而导致连接被中断的可能。
4. 用JavaBean实现连接池管理类DBConnManager
下面给出连接池管理类的主要属性及所要实现的方法。
【代码8.6】DBConnManager.java
package https://www.wendangku.net/doc/77706522.html,;
import java.sql.*;
import java.util.*;
/*连接池管理类,可以管理多个数据库连接池*/
public class DBConnManager
{
private Vector poolnames = new Vector(); // 连接池名列表
private Vector drivernames = new Vector(); // 驱动程序名列表
private Vector dbids = new Vector(); // 数据库标识列表
private Vector usernames = new Vector(); // 用户名列表
private Vector passwds = new Vector(); // 密码列表
private Vector maxconns = new Vector(); // 最大连接数列表
private Hashtable connPools = new Hashtable(); // 连接池队列
public DBConnManager()
{
// 添加Oracle数据库的连接信息
poolnames.addElement("Oracle");
drivernames.addElement("oracle.jdbc.driver.OracleDriver");
dbids.addElement("jdbc:oracle:thin:@localhost:1521:myorc");
usernames.addElement("scott");
passwds.addElement("scott");
maxconns.addElement("10");
// 添加Access数据库的连接信息
poolnames.addElement("Access");
drivernames.addElement("sun.jdbc.odbc.JdbcOdbcDriver");
dbids.addElement("jdbc:odbc:Access_Database");
usernames.addElement(""); //由于没有设置访问的用户名,所以为空
passwds.addElement(""); //由于没有设置访问密码,所以为空
maxconns.addElement("5");
370