资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第7章,JSP,操作数据库核心技术,本章内容,学习内容,Java DataBase Connectivity(JDBC),访问关系数据库:,JDBC,的核心接口,JDBC,访问数据库的步骤,事务处理,数据库连接池,学习目标,能够在,WEB,应用程序中熟练应用,JDBC,访问关系数据库,理解并掌握数据库连接池,7.1 JDBC,技术概述,JDBC,是一套面向对象的应用程序接口,它制定了统一的访问各类关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现。,通过使用,JDBC,技术,开发人员可以用纯,Java,语言和标准的,SQL,语句编写完整的数据库应用程序,并且真正的实现了软件的跨平台型。,JDBC,的全称为“,Java DataBase Connectivity”,,它是一组使用,Java,语言编写的用于连接数据库的程序接口(,API)。,JDBC,技术简介,JDBC,主要完成以下4个步骤:,(1)与数据库建立连接。,(2)向数据库发送,SQL,语句。,(3)处理发送的,SQL,语句。,(4)将处理的结果进行返回。,使用,JDBC,操作数据库如图所示。,应用程序,JDBC API,JDBC,驱动管理器,数据库,驱动程序,数据库,7.2,JDBC,的结构,目前比较常见的,JDBC,驱动程序可以分为4种。,驱动类型名称,说明,JDBC-ODBC,桥,通过,JDBC,访问,ODBC,接口的驱动程序。在使用过程中,客户机上首先必须加载,ODBC,的二进制代码程序,必要时还需要加载数据库客户机代码。此驱动程序常常应用与企业网,本地,API,此驱动是将客户机上的,JDBC API,转换为数据库管理系统(,DBMS),来调用,实现数据库连接。同,JDBC-ODBC,桥驱动类型相似的是客户机必须加载某些必须的二进制代码程序,网络,Java,驱动程序,此驱动程序通过网络协议进行数据库连接。首先将,JDBC,转换成一种网络协议,该网络协议不同与,DBMS,使用的交互协议。然后再将该网络协议转换为,DBMS,协议。网络纯,Java,驱动是最灵活适用的驱动程序,利用网络服务可以将,Java,客户机连接到多种数据库上。但是交互过程中使用的协议需要由网络服务器提供,本地协议纯,Java,驱动程序(最快),此驱动程序将,JDBC,调用直接转换为,DBMS,使用的协议,客户机可以直接调用,DBMS,服务器,进行数据库操作。数据库制造商提供专用的,DBMS,使用协议,数据库驱动程序,使用,JDBC,操作数据库首先必须要安装驱动程序,通常去数据库供应商网站下载,常见的驱动程序如表所示。,数据库名称,类包名,驱动名称与,URL,地址,SQL Server2000,msbase.jar、mssqlserver.jar、msutil.jar,com.microsoft.jdbc.sqlserver.SQLServerDriver,jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=,数据库名称,SQL Server2005,sqljdbc.jar,com.microsoft.sqlserver.jdbc.SQLServerDriver,jdbc:sqlserver:/localhost:1433;databaseName=,数据库名称,MYSQL,mysql-connector-java-3.0.16-ga-bin.jar,com.mysql.jdbc.Driver,jdbc:mysql:/localhost:3306/,数据库名称,oracle,class12.jar,oracle.jdbc.driver.OracleDriver,jdbc:oracle:thin:dssw2k01:1521:,数据库名称,DB2,db2jcc.jar,.DB2Driver,jdbc:db2:/localhost:6789/,数据库名称,Derby,derby.jar,org.apache.derby.jdbc.EmbeddedDriver,jdbc:derby:/localhost:1527:,数据库名称;,create=false,7.3,JDBC,核心编程接口和类,驱动器接口:,Driver,驱动管理类:,DriverManager,数据库连接接口:,Connection,执行静态,SQL,语句接口:,Statement,执行预编译的,SQL,语句接口:,PreparedStatement,处理存储过程语句接口:,CallableStatement,返回查询结果集接口:,ResultSet,以上接口与类均在,java.sql,包中。,驱动管理类:,DriverManager,负责管理,JDBC,驱动程序的基本服务,作用于用户和驱动程序之间,负责追踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。另外,,DriverManager,类也处理驱动程序登录时间限制及登录和跟踪消息的显示等事务。,1追踪有用的驱动程序,DriverManager,类中一系列驱动类通过调用,DriverManager,类中的,registerDriver(),方法进行了注册。程序员将不用直接调用,DriverManager,类中的,registerDriver(),方法;而是在加载驱动程序时,由驱动程序自动调用并加载驱动类,然后自动在,DriverManager,类中注册。,驱动管理类:,DriverManager,(1)通过,Class,静态类中的,forName(),方法进行调用。,Class.forName(db.Driver);,(2)通过将数据库驱动名称添加到,java.lang.System,类中的,jdbc.drivers,属性中。该方式是一个由,DriverManager,类加载的驱动程序类名的列表,并用冒号(:)分隔。,DriverManager,注册的方式有以下两种:,数据库连接接口:,Connection,java.sql.,Connection,接口表示与特定数据库的连接,并在连接的上下文中可以执行,SQL,语句并返回结果。通过,Connection,对象可以获取一个数据库和表等数据库对象的详细信息。,Connection,接口中常用的方法如表所示。,方法名称,功能描述,setAutoCommit(boolean bln),指定事务处理方式,参数设置为,true,时自动提交事务,,false,为手动提交事务,getAutoCommit(boolean bln),查看当前的,Connection,实例是否为自动事务提交模式,如果是返回,true,,否则返回,false,createStatement(),创建,Statement,对象示例,prepareStatement(String sql),获得,PreparedStatement,对象实例,参数为预编译的,SQL,prepareCall(String SQL),获得,CallableStatement,对象实例,参数为存储过程名称,setReadOnly(boolean bln),设置,Connection,实例的读取模式,默认为,false,,关闭只读模式,commit(),提交事务,rollback(),回滚事务,sClosed(),判断当前的连接是否关闭,如果关闭返回,true,,否则返回,false,close(),关闭当前数据库连接,执行静态,SQL,语句接口:,Statement,1创建,Statement,对象,取得数据库连接对象后,就可以通过该连接发送,SQL,语句。,Statement,对象可以通过,Connection,对象中的,createStatement(),方法进行创建,例如:,Connection con=DriverManager.getConnection(url,sa,);,Statement stmt=con.createStatement();/,获取,Statement,对象,为了执行,Statement,对象,被发送到数据库的,SQL,语句将被作为参数提供给,Statement,类中的指定方法。例如,通过,Statement,对象执行查询的,SQL,语句:,ResultSet rs=stmt.executeQuery(select*from wy_user);,执行静态,SQL,语句接口:,Statement,2使用,Statement,对象执行,SQL,语句,Statement,接口提供了3种执行语句的方法,如表所示。,方法名称,功能描述,executeQuery,(String sql),用于产生单个结果集的语句,例如,执行,SELECT,查询语句,executeUpdate,(String sql),用于执行,INSERT、UPDATE,或,DELETE,语句以及,SQL DDL(,数据定义语言)语句,例如,,CREATE TABLE,和,DROP TABLE。INSERT、UPDATE,或,DELETE,语句的效果是修改表中零行或多行中的一列或多列。,executeUpdate,的返回值是一个整数,指示受影响的行数(即更新计数)。对于,CREATE TABLE,或,DROP TABLE,等不操作行的语句,,executeUpdate,的返回值总为零,execute,(String sql),用于执行返回多个结果集、多个更新计数或二者组合的语句,执行预编译的,SQL,语句接口:,PreparedStatement,PreparedStatement,接口继承并扩展了,Statement,接口,用来执行动态的,SQL,语句。,PreparedStatement,接口包含已编译的,SQL,语句,并且包含于,PreparedStatement,对象中的,SQL,语句可具有一个或多个参数。该语句为每个参数保留一个问号(?)作为占位符。每个问号的值必须在该语句执行之前,通过适当的,setXXX(),方法来提供。由于,PreparedStatement,对象已预编译过,所以其执行速度要快于,Statement,对象。,作为,Statement,的子类,,PreparedStatement,除了,继承,Statement,的所有功能外,还添加了一些方法,用于设置发送给数据库以取代参数占位符的值。同时,,execute(),方法、,executeQuery(),方法和,executeUpdate(),方法已被更改,从而不再需要参数。这些方法的,Statement,形式(接受,SQL,语句参数的形式)不应该用于,PreparedStatement,对象。,执行预编译的,SQL,语句接口:,PreparedStatement,1,创建,PreparedStatement,对象,例如,创建包含带两个参数占位符的,SQL,语句的,PreparedStatement,对象:,PreparedStatement pstmt=,con.prepareStatement(UPDATE wy_table SET m=?WHERE x=?);,2,传递多参数,例如,将第一个参数设为,“,王,”,,第二个参数设为,“,毅,”,:,pstmt.setString(1,“,王”);,pstmt.setString(2,“,毅,”);,PreparedStatement,类常用传递参数的方法如表所示。,执行预编译的,SQL,语句接口:,PreparedStatement,方法名称,描述,setBoolean(int,boolean),设置一个,Java boolean,类型的参数值,setByte(int,byte),设置一个,Java byte,类型的参数值,setBoolean(int,boolean),设置一个,Java boolean,类型的参数值,setBytes(int,byte),设置一个,Java,字节数组,setBigDecimal(int,BigDecimal),设置一个,java.lang.BigDecimal,类型的参数值,setDate(int,Date),设置一个,java.sql.Date,类型的参数值,setDouble(int,double),设置一个,Java double,类型的参数值,setFloat(int,float),设置一个,Java float,类型的参数值,setInt(int,int),设置一个,Java int,类型的参数值,setLong(int,long),设置一个,Java long,类型的参数值,setNull(int,int),设置一个,SQL,语句中的,NULL,值,setObject(int,Object),使用一个对象设置参数值;对于整数值使用和,java.lang,等价的对象,setObject(int,Object,int),该方法类似于,setObject,方法,但是假设小数位数为零,setObject(int,Object,int,int),使用一个对象设置参数值;对于整数值使用与,java.lang,等价的对象,setShort(int,short),设置一个,Java short,类型的参数值,setString(int,String),设置一个,Java String,类型的参数值,setTime(int,Time),设置一个,java.sql.Date,类型的参数值,setTimestamp(int,Timestamp),设置一个,java.sql.Timestamp,类型的参数值,setUnicodeStream(int,InputStream,int),将一个非常大的,unicode,值输入到,longvarchar,参数时可以通过,java.io.InputStream,类,setAsciiStream(int,InputStream,int),将一个非常大的,ASCII,值输入到,longvarchar,参数,它的参数类型是,Java,的输入流,setBinaryStream(int,InputStream,int),将一个非常大的二进制值输入到,longvarchar,参数时可以通过,java.io.InputStream,类,执行预编译的,SQL,语句接口:,PreparedStatement,3,执行,预编译的,SQL,语句,设置完预编译的,SQL,语句后,就可以通过,PreparedStatemen,类中的方法执行该,SQL,语句。,PreparedStatemen,类,执行,SQL,语句的方法,如表所示。,4,参数中数据类型的一致性,方法名称,描述,execute(),执行保存操作,executeUpdate(),执行更新或删除数据操作,setXXX(),方法中的,XXX,是,Java,类型。它是一种隐含的,JDBC,类型(一般,SQL,语句类型),因为驱动程序将把,Java,类型映射为相应的,JDBC,类型,并将该,JDBC,类型发送给数据库。在编写代码时要确保将每个参数的,Java,类型映射为与数据库所需的,JDBC,数据类型兼容的,JDBC,类型。,处理存储过程语句接口:,CallableStatement,CallableStatement,对象为所有的关系性数据库提供了一种以标准形式调用已储存过程的方法。该对象可以处理两种形式的存储过程:一种形式带结果参数,另一种形式不带结果参数。结果参数是一种输出参数,是已储存过程的返回值。两种形式都可带有数量可变的输入、输出或输入和输出的参数。问号将用作参数的占位符。在,JDBC,中,调用存储过程的语法如下:,call,过程名,(?,?,.),返回结果参数的过程的语法如下:,?=,call,过程名,(?,?,.),处理存储过程语句接口:,CallableStatement,CallableStatement cstmt=con.prepareCall(call getTestData(?,?);,cstmt.registerOutParameter(1,java.sql.Types.TINYINT);,cstmt.registerOutParameter(2,java.sql.Types.DECIMAL,3);,cstmt.executeQuery();,/,从第,1,个输出参数中取出一个,Java,字节,byte x=cstmt.getByte(1);,/,从第,2,个输出参数中取出一个,BigDecimal,对象(小数点后面带,3,位数),java.math.BigDecimal n=cstmt.getBigDecimal(2,3);,3,执行,存储过程,当设置完存储过程的参数后,就可以通过,CallableStatement,类中的方法执行该存储过程。,CallableStatement,类,执行存储过程的方法,如表所示。,方法名称,描述,execute(),执行保存操作,executeUpdate(),执行更新或删除数据操作,返回查询结果集接口:,ResultSet,java.sql.ResultSet,接口类似于一个数据表,通过该接口的实例可以获得检索结果集以及对应的数据表相关信息。,Result,实例通过执行查询数据库的语句生成。一个,Statement,对象在同一时刻只能打开一个,ResultSet,对象。可以通过字段的序号或者字段的名字来制定获取某个字段的值。,ResultSet,对象的常用方法如表所示。,方法名称,功能描述,next(),得到查询结果数实例。,ResultSet,初始化时定位于它的第一行数据之前;使用,next,方法可以将第一行数据放到,ResultSet,对象当中,通过该实例对象的,getXXX(),方法得到数据,close(),用来释放,ResultSet,占用的系统资源,getBigDecimal(int,int),取得指定列值的,java.lang.BigDecimal,类型数据。第一个参数是列对应的位置,第二个参数是小数点后面的位数,getBigDecimal(String,int),取得指定列值的,java.lang.BigDecimal,类型数据。第一个参数是字段的名称,第二个参数是小数点后面的位数,getBinaryStream(int),获取列值为字节流的数据,参数是指定字段的位置,getBinaryStream(String),获取列值为字节流的数据,参数是指定字段的名称,返回查询结果集接口:,ResultSet,方法名称,功能描述,getBoolean(int),获得一个,boolean,类型的数据,参数为指定字段的位置,getBoolean(String),获得一个,boolean,类型的数据,参数为指定字段的名称,getByte(int),获得,byte,类型的数据,参数是指定的字段位置,getByte(String),获得,byte,类型的数据,参数是指定字段的名称,getBytes(int),获得,byte,数组类型的数据,参数是指定字段的位置,getBytes(String),获得,byte,数组类型的数据,参数是指定字段的名称,getCursorName(),获取,ResultSet,的,SQL,游标名,getDate(int),获取,java.sql.Date,类型的数据,参数为指定字段的位置,getDate(String),获取,java.sql.Date,类型的数据,参数为指定字段的名称,getDouble(int),获得,double,类型的数据,参数是指定字段的位置,getDouble(String),获得,double,类型的数据,参数是指定字段的名称,getFloat(int),获得,float,类型的数据,参数是指定字段的位置,getFloat(String),获得,Java float,类型的数据,参数是指定字段的名称,getInt(int),获得,int,类型的数据,参数是指定字段的位置,getInt(String),获得,int,类型的数据,参数是指定字段的名称,getLong(int),获得,Java long,类型的数据,参数是指定字段的位置,getLong(String),获得,Java long,类型的数据,参数是指定字段的名称,7.4,JDBC,操作数据库的步骤,7.4,JDBC,操作数据库的步骤,通过实例演示数据库访问的步骤,加载数据驱动,取得数据库连接,执行各种,SQL,语句,获取查询的结果,关闭数据库连接,数据库事务的特性,原子性(,atomicity),指事务执行单元是一个不可分割的单元,这些单元要么都执行,要么都不执行。例如当我们使用银行的,ATM,提款机取钱时,如果出现机器卡死或者断电,那么即使已经执行了取钱操作,但是数据库中的数据不会发生改变。,一致性(,consistency),指无论执行了什么操作,都应保证数据的完整性和业务逻辑的一致性。例如银行系统中的取钱操作,当取钱成功时,我们得到的钱款数目要和数据库中个人账号钱款减少的数目相同。,隔离性(,isolation),隔离性是在事务执行过程中,每一个执行单元操作的数据都是其它单元没有操作或者操作结束后的数据,保证执行单元操作的数据都有完整的数据空间。事务的执行过程中不存在当前所处理数据正被另一个事务处理的情况。隔离性也称为事务的串行化。,持久性(,durability):,持久性针对的是事务结束后,执行单元操纵的数据被保存在数据库中,这些数据的保存状态是永久性的,即使数据库系统崩溃,数据也不会消失。,JDBC,事务的流程,JDBC,事务的执行流程:,JDBC,中的事务处理有两种方式:通过,Connection,接口中的,setAutoCommit(),方法设置手动提交或者自动提交事务。自动提交事务时,每当执行一条,SQL,时就会提交事务;手动提交事务时,必须调用,Connection,接口的,commit(),方法才会提交事务。,JDBC,对事务管理级别,为了解决这些由于多个用户请求相同数据而引起的问题,事务之间必须用锁相互隔开。多数数据库支持不同类型的锁;因此,,JDBC,编程接口支持不同类型的事务,它们由,Connection,对象的,setTransactionLevel(),方法指定。在,JDBC,编程接口中获得事务级别如表所示。,名称,说明,TRANSACTION_NONE,不支持事务,TRANSACTION_READ_UNCOMMITTED,事务在提交前其变化对于其他事务来说是可见的。这样脏读、不可重复的读和虚读都是允许的,TRANSACTION_READ_COMMITTED,读取未提交的数据是不允许的。这个级别仍然允许不可重复的读和虚读产生,TRANSACTION_REPEATABLE_READ,事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现,TRANSACTION_SERIALIZABLE,最高的事务级别,它防止脏读、不可重复的读和虚读,例如:,con.setTransactionLevel(TRANSACTION_SERIALIZABLE);,JDBC,对事务的设置,在默认情况下,,JDBC,驱动程序运行在“自动提交”模式下,这样做虽然方便,但程序运行时的开销比较大。可以利用批处理操作减小这种开销,但批处理操作要求事务不能处于自动提交模式下。为此,我们首先要禁用自动提交模式:,con.setAutoCommit(false);,然后执行批处理操作:,Statement stmt=connection.createStatement();,stmt.addBatch(insert into tbl_User values(user,1,5000,40),”),;,stmt.addBatch(insert into tbl_User values(user,2,1500,24),”),;,stmt.addBatch(insert into tbl_User values(user,3,6400,18),”),;,int updateCounts=stmt.executeBatch();,mit();,executeBatch(),方法返回一个更新计数的数组,每个值对应于批处理操作中的一个命令。批处理操作可能会抛出一个类型为,BatchUpdateException,的异常,这个异常表明批处理操作中至少有一条命令失败了。,7.6,JDBC,对数据库操作实例,JDBC+JSP+Servlet+JavaBean,综合应用实例,图书管理,7.7,数据库连接池,数据库连接池指定是在应用服务器启动时,预先建立一定数量的数据库连接,然后将它们放置到池中进行统一管理。,一旦客户端请求数据连接时,服务器立即给它将分配一个连接,而不需要为它重新创建数据库连接。,数据库连接池概述,数据库连接池的优点,服务器为客户端请求数据而与数据库建立连接时,会耗费一定的系统资源,如果服务器为每一次交易都建立独立的连接将加重服务器的负担,严重时会导致服务器崩溃。而采用连接池技术,将预先建立的连接分配给客户端的请求,一方面缩短了服务器响应时间,另一方面通过池化管理减轻了服务器负担。,数据库连接池的缺点,服务器启动时就会创建一定数量的数据库连接,事实上,这些连接都在等待服务器为其分配客户端的请求,当请求数目远远少于连接数目时,就会导致许多空连接,它们消耗了一定的系统资源。,连接池的实现原理,服务器在启动时创建连接池,同时建立一定数量的数据库连接。当客户端请求数据库时,服务器立即为其分配连接。当客户端请求数量超出了已经创建的连接数目时,服务器将为其创建新的连接。当请求数目少于连接数时,将关闭不必要的空连接。,连接池的实现原理如图所示:,连接池的实现原理,1,连接池的分配与释放,连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。每当用户请求一个连接时,系统首先检查空闲池内有没有空闲连接。如果有就把建立时间最长(通过容器的顺序存放实现)的那个连接分配给他(实际是先做连接是否有效的判断,如果可用就分配给用户,如不可用就把这个连接从空闲池删掉,重新检测空闲池是否还有连接);如果没有则检查当前所开连接池是否达到连接池所允许的最大连接数(,maxConn),,如果没有达到,就新建一个连接,如果已经达到,就等待一定的时间(,timeout)。,如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户,如果等待时间超过预定时间,timeout,,则返回空值(,null)。,系统对已经分配出去正在使用的连接只做计数,当使用完后再返还给空闲池。,连接池的实现原理,2,连接池的配置与维护,连接池中到底应该放置多少连接,使系统的性能处于最佳状态呢?系统可采取设置最小连接数(,minConn,),和最大连接数(,maxConn,),来控制连接池中的连接。最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应速度却很慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。最大连接数是连接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过反复测试,找到最佳点。,确保连接池中的最小连接数可以有动态和静态两种策略:动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转;静态是发现空闲连接不够时再去检查。,Tomcat,连接池的实现,JDBC2.0,提供了,javax.sql.DataSource,接口,负责与数据库建立,在应用时不需要编写连接数据库代码,可以直接从数据源中获得数据库连接。在,DataSource,接口中预先建立了多个数据库连接,这些数据库连接保存在数据库连接池中,当程序访问数据库时,只需从连接池中取出空闲的连接,访问结束后,在将连接返回给连接池。,Tomcat,服务器正是通过,DataSource,接口获取数据库连接,但是不能通过创建实例的方法来获得,DataSource,对象,需要通过,Java,的,Java,命名和目录接口(,JDNI),来获取,DataSource,对象。,JNDI,是一种将对象和名称绑定的技术,对象工厂负责生产对象,并将其与唯一的名称绑定,在程序中可以通过名称来获得,DataSource,对象。,Tomcat,连接池的实现,(1)配置数据源,在,Tomcat,安装目录下的,confserver.xml,文件中配置,也可以在,Web,工程下的,META-INFcontext.xml,文件中配置,在,context.xml,文件中配置数据源的具体代码如下(,Tomcat 5.5,以上的版本):,Tomcat,连接池的实现,属性名称,描述,name,数据源的,JNDI,名称,type,数据源类型,auth,数据源的管理者,可以选择容器,Container,和应用服务,Application,driverClassName,JDBC,驱动,url,连接数据库的,URL,username,登录数据库用户名称,password,登录数据库用户密码,maxActive,连接池中最多的连接数目,0表示不限制,maxIdle,连接池空闲时的连接数目,0表示不限制,maxWait,当没有空闲连接时,允许请求的等待时间,-1表示不限制,说明:上面配置的数据源是连接的,SQL Server2000,数据库,因此还需要该数据库的3个驱动包(,msbase.jar、mssqlserver.jar、msutil.jar),拷贝到,Tomcat,安装目录下的,lib,文件夹下。,配置数据源需要用到,元素,其属性及描述如下表所示。,Tomcat,连接池的实现,如果使用该版本(5.5)之前的,Tomcat,服务器,配置连接池的代码不同相同。因为,Tomcat5.5,及更早的版本需要配置数据库工厂,指定,mons.dbcp.BasicDataSourceFactory,来创建连接池和数据库连接。还需要在,Tomcat,安装文件中的,server.xml,配置连接池,例如,与前面同样的配置:,factory,mons.dbcp.BasicDataSourceFactory,maxActive20,maxIdle10,maxWait-1,usernamesa,password,driverClassName,com.microsoft.jdbc.sqlserver.SQLServerDriver,url,jdbc:microsoft:sqlserver:/127.0.0.1:1433;DatabaseName=sy_users,Tomcat,连接池的实现,(2)获取连接,public class JDBConnection,private Connection con=null;,private DataSource ds;,public JDBConnection()/,通过构造方法加载数据库驱动,try,Context ctx=new InitialContext();,ctx=(Context)ctx.lookup(java:comp/env);,ds=(DataSource)ctx.lookup(“TestJNDI”);/,获取,JNDI,的名称,con=ds.getConnection();,catch(Exception e),e.printStackTrace();,Proxool,连接池的实现,(1),Proxool,是一个,Java SQL Driver,驱动程序,它提供了对其它类型的驱动程序的连接池封装,可以透明的为现存的,JDBC,驱动程序增加连接池功能。,Proxool,同时也是一个开源的连接池,它的性能优异,可实时监控连接池状态。,1,Proxool,连接池类库下载,Proxool,连接池类库的下载是,“,”,,,根据页面中的提示可以下载到该连接池的最新类库版本:,proxool-0.9.0RC2,。,下载后的文件是一个,“,proxool-0.9.0RC2.zip”,压缩文件,解压后的文件中的,“,proxool-0.9.0RC2.jar”,拷贝到当前,Web,工程下的,WEB-INF/lib,文件夹即可。,2,Proxool,连接池,Proxool,连接池通过配置文件显式的指定各个配置选项。该配置文件在,WEB-INF,文件创建名称,“,proxool.xml”,,,该文件的代码如下:,Proxool,连接池的实现,(2),proxoolConnectionProvider,jdbc:microsoft:sqlserver:/localhost;databaseName=bookdb,com.microsoft.jdbc.sqlserver.SQLServerDriver,25,select CURRENT_DATE,300000,5,10,3600000,4,20,Proxool,连接池的实现,(3),配置选项,描述,连接池的别名,连接数据库的,URL,用于驱动数据库的工具类,驱动的属性,可以设置连接数据库的用户名和密码,线程处于睡眠状态的最长时间,默认值是30毫秒,测试连接的,SQL,语句,若未指定,测试过程将会被忽略,线程最大存活时间,超过此时间的线程将被守护线程清除掉,单位毫秒,最小的数据库连接数,最大的数据库连接数,一个线程的最大寿命,单位为毫秒,连接池中可用的连接数量,如果当前连接池中的连接数少于此值,新的连接将被建立,因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的连接将会被拒绝,Proxool,连接池配置文件中元素的描述如下表所示:,Proxool,连接池的实现,(4),获取连接,public class,JDBConnection,private,Connection conn=,null,;,public,JDBConnection(),try,conn=DriverManager.getConnection(proxool.proxoolConnectionProvider);,catch,(Exception e),e.printStackTrace();,连接池的名字,其他连接池简介,Java,常用连接池组件如表所示。,连接池名称,描述,C3P0,它是一个开放源代码的,JDBC,连接池,它在,lib,目录中与,Hibernate,一起发布,包括了实现,JDBC3.0,和,JDBC2.0,扩展规范说明的,Connection,和,Statement,池的,DataSources,对象,Jakarta DBCP,它是一个依赖,Jakarta commons-pool,对象池机制的数据库连接池.,DBCP,可以直接
展开阅读全文