JSP中使用数据库

目录

8.1MySQL数据库管理系统

8.1.1 下载、安装MySQL

8.1.2  启动MySQL数据库服务器

8.1.3  MySQL客户端管理工具

8.2连接MySQL数据库

8.3查询记录

8.3.1 结果集与查询

8.3.2 随机查询

8.3.3 条件查询

8.4、更新、添加与删除记录

8.5、用结果集操作数据库中的表

8.5.1、更新记录

8.5.2、插入记录

8.6、预处理语句

8.6.1、预处理语句的优点

8.6.2、使用通配符

8.7、事务

(1) 用 setAutoCommit(boolean b)方法关闭自动提交模式

(2)用 commit()方法处理事务

(3)用 rollback()方法处理事务失败

8.8、使用连接池

8.8.1、连接池简介

8.8.2、建立连接池

(1)连接池配置文件

(2)使用连接池


前言
        JSP可以使用Java中的JDBC API来访问数据库。

8.1MySQL数据库管理系统

MySQL数据库管理系统,简称MySQL,是目前流行的开源数据库管理系统,其社区版(MySQL Community Edition)是可免费下载的开源数据库管理系统。MySQL最初由瑞典MySQL AB公司开发,目前由Oracle公司负责源代码的维护和升级。Oracle将MySQL分为社区版和商业版,并保留MySQL开放源码这一特点。目前许多Web开发项目都选用社区版MySQL,其主要原因是社区版MySQL的性能卓越,满足许多Web应用已经绰绰有余,而且社区版MySQL是开源数据库管理系统,可以降低软件的开发和使用成本。

8.1.1 下载、安装MySQL

1.下载

https://dev.mysql.com/downloads/mysql/

选择Windows (x86, 64-bit), ZIP Archive 8.0.18(272.3M) 这里我们下载的是mysql-8.0.18-winx64.zip(适合64位机器的Windows版)。

2.安装

将下载的mysql-8.0.18-winx64.zip解压缩到本地计算机,比如解压缩到D:\。本教材将下载的mysql-8.0.18-winx64.zip解压缩到D:\

8.1.2  启动MySQL数据库服务器

1.启动

■(安全初始化)首次启动之前必须进行安全初始化(以管理员身份启动命令行窗口).使用命令行进入MySQL安装目录的bin子目录,键入 mysqld --initialize-insecure命令,回车确认.

D:\mysql-8.0.18-winx64\bin>mysqld  --initialize-insecure

初始化后,必须用管理员身份(在cmd.exe上单击鼠标右键,选择以管理员身份运行cmd)启动命令行窗口,然后进入MySQL安装目录的bin子目录下键入mysqld或 mysqld -nt ,回车确认启动MySQL数据库服务器(以后再启动MySQL就不要再初始化了,以免引起系统混乱),MySQL服务器占用的端口是3306(3306是MySQL服务器默认使用的端口号)。启动成功后(无任何提示信息),MySQL数据库服务器将占用当前MS-DOS窗口

2.root用户

MySQL8.0版本必须对root用户进行身份确认,否则将导致MySQL 8.0自带的mysql客户端程序,以及其他的客户端程序,如Navicat for MySQL等无法访问MySQL 8.0数据库服务器。 再用管理员身份打开另一个命令行窗口(在cmd.exe上单击鼠标右键,选择以管理员身份运行cmd)

D:\mysql-8.0.18-winx64\bin>mysqladmin  -u root -p  password 

回车确认后,将提示输入root的当前密码(无密码就直接回车确认,初始是无密码),如果输入正确,将继续提示输入root的新密码(如果新密码仍然保持是无密码,就直接回车确认),以及确认新密码。

8.1.3  MySQL客户端管理工具

所谓MySQL客户端管理工具,就是专门让客户端在MySQL服务器上建立数据库的软件。可以下载图形用户界面(GUI)的MySQL管理工具,并使用该工具在MySQL服务器上进行创建数据库、在数据库中创建表等操作,MySQL管理工具有免费的也有需要购买的。例如Navicat for MySQL,登录: http://www.navicat.com.cn/download 下载试用版或购买商业版,例如下载navicat121_mysql_cs_x64.exe,安装即可。

1.命令行客户端

打开一个新的命令行窗口(不必管理员身份),进入MySQL安装目录下的bin子目录。运行mysql:

mysql -h ip -u root -p

对于本机调试(即客户端和数据库服务器同机),执行格式为:

mysql  -u root -p

然后按要求输入密码即可(如果密码是空,可以不输入密码)。

 启动命令行客户端后就可以使用SQL语句进行创建数据库、建表等操作。在MS-DOS命令行窗口输入SQL语句需要用“;”号结束,在编辑SQL语句的过程中可以使用\c终止当前SQL语句的编辑。需要提醒的是,可以把一个完整的SQL语句命令分成几行来输入,最后用分号作结束标志即可。

2. 创建数据库

创建一个名字为bookDatabase的数据库

create database bookDatabase;

 删除已有数据库:

drop database bookDatabase;

3.建表

为了在数据库中创建表,必须首先进入该数据库(即使用数据库),命令格式是:“user 数据库名;”或“user 数据库名”。在当前命令行客户端管理工具占用的命令行窗口输入:

use  bookDatabase

回车确认(进入数据库也可以没有分号)进入数据库bookDatabase

 创建bookList表:

create table bookList(

ISBN varchar(100) not null,

name varchar(100) character set gb2312, price float,

publishDate date,

primary key(ISBN)

);

 创建bookList表之后就可以使用SQL语句对bookList表进行添加、更新和查询等操作(如果已经退出数据库,需要再次进入数据库)。在当前命令行客户端占用的窗口键入插入记录的SQL语句(如图8.10所示。),记录之间用逗号分隔:

insert into bookList values('7302014655','高等数学',28.67,'2020-12-10'),

('7352014658','大学英语',58.5,'1999-9-10'),

('7987302464259','Java2实用教程第5版',59.5,'2017-5-1');

 4.导入.sql文件中的SQL语句

在使用命令行客户端时,如果觉得在命令行输入SQL语句不方便,那么可以事先将需要的SQL语句保存在一个扩展名是.sql的文本文件中,然后在命令行客户端占用的命令行窗口使用source命令导入.sql文件中的SQL语句。a.sql如下:

insert into bookList values('8302084658','月亮湾',38.67,'2021-12-10'),

('9352914657','雨后',78,'1998-5-19'),

('9787302198048','Java设计模式',29,'1999-5-16'),

('97873902488644','Java课程设计第3版',32,'2018-1-10');

select * from bookList;

在当前命令行客户端占用的窗口键入如下命令: source D:/myFile/a.sql 回车确认,导入sql文件中的SQL语句。

如果a.sql文件中存在错误的SQL语句,将提示错误信息,否则将成功执行这些SQL语句

 5. 删除数据库或表

删除数据库的命令:drop database <数据库名>,例如:删除名为tiger的数据库:

drop database tiger;

删除表的命令:drop table <表名>,例如,使用bookDatabase数据库后,执行:

drop table booklist;

将删除bookDatabase数据库中的bookList表。

6.使用 Navicat for MySQL

登录:http://www.navicat.com.cn/download下载试用版或购买商业版,例如下载试用版navicat121_mysql_cs_x64.exe

8.2连接MySQL数据库

为了使Java编写的程序不依赖于具体的数据库,Java提供了专门用于操作数据库的API,即JDBC(Java Data Base Connectivity)。JDBC操作不同的数据库仅仅是加载的数据库连接器不同以及和数据库建立连接的方式不同而已,使用JDBC的应用程序和数据库建立连接之后,就可以使用JDBC提供的API操作数据库。

1.下载JDBC-MySQL数据库连接器表

https://dev.mysql.com/downloads/connector/j/

下载的是mysql-connector-java-8.0.18.zip(linux系统可下载tar.gz格式文件),将该zip文件解压至硬盘,在解压目录下的mysql-connector-java-8.0.18.jar文件就是连接MySQL数据库的JDBC-MySQL数据库连接器(作者也将该文件放在了教学资源的源代码文件夹中)。

■将MySQL数据库的JDBC-MySQL数据库连接器

mysql-connector-java-8.0.18.jar

保存到Tomcat安装目录下的lib文件夹中(例如D:\apache-tomcat-9.0.26\lib).

重新启动Tomcat服务器。

2.加载JDBC-MySQL数据库连接器

try{  Class.forName("com.mysql.cj.jdbc.Driver ");

}

catch(Exception e){}

MySQL数据库驱动是mysql-connector-java-8.0.18.jar文件中的Driver类,该类的包名是com.mysql.cj.jdbc.Driver(包名和以前的版本: com.mysql.jdbc.Driver不同)。Driver类不是Java运行环境类库中的类,是连接器mysql-connector-java-8.0.18.jar中的类

JDBC操作不同的数据库仅仅是加载的数据库连接器不同以及和数据库建立连接的方式不同而已,使用JDBC的应用程序和数据库建立连接之后,就可以使用JDBC提供的API操作数据库。

 3.连接数据库

Connection con;

String url =

"jdbc:mysql://192.168.100.1:3306/bookDatabase?useSSL=false&serverTimezone=GMT";

String user ="root";

String password ="";

try{        

con = DriverManager.getConnection(url,user,password); //连接代码

} catch(SQLException e){      

System.out.println(e);

}

4.注意汉字问题

需要特别注意的是,如果数据库的表中的记录有汉字,那么在建立连接时需要额外多传递一个参数characterEncoding,并取值gb2312或utf-8

String url =

"jdbc:mysql://localhost/bookDatabase?"+ "useSSL=false&serverTimezone=GMT&characterEncoding=utf-8";

con = DriverManager.getConnection(url, "root","");

8.3查询记录

和数据库建立连接后,就可以使用JDBC提供的API与数据库交互信息,比如查询、修改和更新数据库中的表等。JDBC与数据库表进行交互的主要方式是使用SQL语句(其他方式见8.5节)。JDBC提供的API可以将标准的SQL语句发送给数据库,实现和数据库的交互。

8.3.1 结果集与查询

对一个数据库中的表进行查询,然后将查询结果返回到一个ResultSet对象中,习惯称ResultSet对象为结果集对象。SQL查询语句与结果集 连接对象con调用方法createStatement()返回SQL语句对象,代码如下:

try{ Statement sql=con.createStatement();  

 }

catch(SQLException e ){      

System.out.println(e);

}

■结果集 sql对象就可以调用相应的方法查询数据库中的表,并将查询结果存放在一个ResultSet结果集中。ResultSet结果集由以列(也称字段)为结构的数据行组成。例如,对于

ResultSet rs=sql.executeQuery("SELECT * FROM bookList");

内存中的结果集对象rs的列数是4列,刚好和bookList表的列数相同,第1列至第4列分别是ISBN、name、price和publishDate列;而对于

ResultSet rs=sql.executeQuery("SELECT name,price FROM bookList");

结果集对象rs只有两列,第1列是name列,第2列是price列。

■ResultSet结果集一次只能看到一个数据行,使用next()方法可走到下一数据行。获得一行数据后,ResultSet结果集可以使用getXxx(int columnIndex)或getXxx(String columnName)方法获得字段值(列值)

无论列(字段)是何种属性,总可以使用getString(int columnIndex)或getString(String columnName)方法返回列(字段)值的串表示。

8.3.2 随机查询

默认的ResultSet结果集使用next()方法顺序地查询记录,但有时候需要在结果集中前后移动、显示结果集指定的一条(一行)记录或随机显示若干条记录等。这时,必须返回一个可滚动的结果集(结果集的游标可以上下移动)。

Statement stmt=con.createStatement(int type,int concurrency);  

 ResultSet re=stmt.executeQuery(SQL语句);

type:    

ResultSet.TYPE_FORWORD_ONLY  

 ResultSet.TYPE_SCROLL_INSENSITIVE:结果集的游标可以上下移动,当数据库变化时,当前结果集不变。

ResultSet.TYPE_SCROLL_SENSITIVE:结果集的游标可以上下移动,当数据库变化时,当前结果集同步改变。

Concurrency:  

ResultSet.CONCUR_READ_ONLY:不能用结果集更新数据库中的表。   ResultSet.CONCUR_UPDATABLE:能用结果集更新数据库中的表。

8.3.3 条件查询

1. where子语句

一般格式:  

select 字段 from 表名 where 条件

(1)字段值和固定值比较,例如:

select name,price from bookList where name='高等数学'

(2)字段值在某个区间范围,例如:

select * from bookList where price>28.68 and price<=87.7

select * from bookList where price>56 and name != '月亮湾'

使用某些特殊的日期函数,如year,month,day:

select * from bookList where year(publishDay)<1980

select * from bookList where year(publishDay) between 2015 and 2020

(3)用操作符like进行模式般配,使用%代替0个或多个字符,用一个下划线_代替一个字符。例如查询name含有“程序”二字的记录:  

select * from bookLidt where name like '%程序%'

2. 排序

用order by子语句对记录排序,

select * from 表名 order by 字段名(列名)

select * from 表名 where 条件 order by 字段名(列名)

例如:

select * from bookList order by price

select * from bookList where name like '%编程%' order by name

将例子8_1中的查询bookList表中SQL语句:

String SQL = "SELECT * FROM bookList";

替换成:

String SQL="select * from bookList "+      

         "where year(publishDate) between 1999 and 2021 and price>=30 "+    

            " order by publishDate";

8.4、更新、添加与删除记录

Statement 对象调用方法:

public int executeUpdate( String sqlStatement ) ;

通过参数 sqlStatement 指定的方式实现对数据库表中记录的更新.添加和删除操作。方法执行成功(成功更新.添加或删除) ,将返回一个正整数,否则返回 0。

(1)更新

update 表 set 字段 = 新值 where <条件子句>

(2)添加

insert into 表(字段列表) values (对应的具体的记录)

insert into 表 values (对应的且体的记录)

(3)删除

delete fronm 表名 where <条件子句>

8.5、用结果集操作数据库中的表

8.5.1、更新记录

使用结果集更新数据库表中第 n 行记录中某列的值的步骤如下 。
(1) 游标移动到第 n行。结果集 rs 调用 absolute()方法将游标移到第 n 行:

rs.absolute(n) ;

(2) 结果集 rs 将第 n行的 column 列的列值更新。结果集可以使用下列方法更新列值:

updateInt(String column,int x) ,updateInt( int column int x)
updateLong(String column,1ong x) ,updateLong( int column,1Long )
updateDouble(String column, double x),updateDoublel( int column,double x)
updateString(String column,String x),updateString( int column, String )
updateDate(String column,Date x),updateDate( int column,Date x)

(3) 更新数据库中的表。最后,结果集 rs 调用 updateRow()方法用结果集中的第 n 行更新数据库表中的第 n 行记录。
以下代码片段按照上述步又,更新 bookList 表中的第 3 行记录的 name 列(字段)的值。

rs.absolute(3) ;
rs.updateString(2, “操作系统”) ; //也可以写成 rs.updateString(“name”, “操作系统”) ;
rs.updateRow( ) ;

8.5.2、插入记录

使用结果集回数据库表中插入(添加)一行记录步骤如下 :

(1) 将结果集 rs 的游标移动到插和人人行。结果集中有一个特殊区域,用作构建要搬入的行的暂存区域,习惯上将该区域位置称作结果集的插入行。为了辐数据库表中插入一行新的记录 ,必须首先将结果集的游标移动到搬入行,代码如下:

rs.moveToInsertRow( ) ;

(2) 更新搬人行的列值,即设置搬入行的列值。结果集可以用 updateXxx()方法更新搬人入行的列值,例如,准备插入的记录是(‘7307014659 ’ ,‘数据结构’, 58 ,’ 2020-08-107 ,那委执行下列操作 :

rs.updateString(1,“7307014659” ) ;
rs.updateString(2, “数据结构”) ;
rs.updateFloat(3,58) ;
rs.updateDate(4,‘2020–08–10’);

(3) 搬入记录。结果集调用 insertRow()方法用结果集中的插和信行问数据库表中插入一行新记录。

8.6、预处理语句

Java 提供了更高效率的数据库操作机制 ,就是 PreparedStatement 对象 ,该对象被习惯地称作预处理语句对象。本节学习怎样使用预处理语句对象操作数据库中的表。

8.6.1、预处理语句的优点

如果不断地向数据库提交 SQL 语句势必增加数据库中 SQL 解释器视频讲解 ”的负担,影响执行的速度。如果应用程序能针对连接的数据库,事先就将 SQL 语句解释为数据库底层的内部命令,然后直接让数据库去执行这个命令,显然不仅减轻了数据库的负担,而且也提高了访问数据库的速度。

Connection 连接对象 con 调用 prepareStatement(CString sql)方法:

PreparedStatement pre = con. prepareStatement( String sq]l ) ;

对参数 sql 指定的 SQL 语句进行预编译处理,生成该数据库底层的内部命令,并将该命令圭装在PreparedStatement 对象 pre 中 ,那么该对象调用下列方法都可以使得该底层内部命令被数据库执行:

ResultSet executeOuery( )
boolean execute() (执行成功返回 false)
int executeUpdate() (执行成功返回 1)

只要编译好了 PreparedStatement 对象 pre,那么 pre 可以随时执行上述方法,显然提高了访问数据库的速度。

8.6.2、使用通配符

在对 SQL 进行预处理时可以使用通配符? (英文问号)来代替字段的值,只要在预处理语句执行之前再设置通配符所表示的具体值即可。例如

Pre = con. PrepareStatement( "SELECT * FROMbookList WHERE price<? ”);

那么在 pre 对象执行之前,必须调用相应的方法设置通配符? 代表的具体值,

Pre. setFloat(1,65) ;

指定上述预处理语句 pre 中通配符? 代表的值是 65。

8.7、事务

事务由一组 SQL 语句组成。所谓*事务处理?是指应用程序保证事务中的 SQL 语句要么全部都执行,要么一个都不执行。

JDBC 事务处理步又如下 :

(1) 用 setAutoCommit(boolean b)方法关闭自动提交模式

 事务处理的第一步骤是使用 setAutoCommit(boolean autoCommit)方法关闭自动提交模式。这样做的理由是,和数据库建立连接的对象 con 的提交模式是自动提交模式,即该连接con 产生的 Statement 或 PreparedStatement 对象对数据库提交任何一个 SQL 语句操作都会立刻生效 ,使得数据库中的数据发生变化,这显然不能满足事物处理的要求。例如 ,在转账操作时 ,将用户 geng 的 userMoney 的值由原来的 100 更改为 50(减去 50 的操作)的操作不应当立刻生效,而应等到 zhang 的用户的 userMoney 的值由原来的 20 更新为 70(增加 50 的操作 )后一起生效。如果第 2 个语句 SQL 语句操作未能成功,那么第一个 SQL 语句操作就不应当生效。因此,为了能进行事务处理,必须关闭 con 的自动提交模式(自动提交模式是连接 con的默认设置)。连接 con 首先调用 setAutoCommit (boolean autoCommit ) 方法,将参数autoCommit 取值为 false来关闭自动提交模式 :

con. setRAutoCommit(false) ;

(2)用 commit()方法处理事务

连接 con 调用 setAutoCommit(false)后,产生的 Statement 对象对数据库提交任何一个SQL 语句操作都不会立刻生效,这样一来,就有机会让 Statement 对象(PreparedStatement 对象)提交多个 SQL 语句,这些 SQL 语句就是一个事务。事务中的 SQL 语句不会立刻生效,直到连接 con 调用 commit()方法。con 调用 commit()方法就是让事务中的 SQL 语句全部生效。

(3)用 rollback()方法处理事务失败

连接 con 调用 commit()方法进行事务处理时,只要事务中任何一个 SQL 语句没有生效,就抛出 SQLException 异常。在处理 SQLException 异稼时,必须让 con 调用 rollback()方法,其作用是: 撤销事务中成功执行过的 SQL 语句对数据库数据所做的更新.插入或删除操作 ,即撤销引起数据发生变化的 SQL 语句操作,将数据库中的数据恢复到 commit()方法执行之前的状态。

8.8、使用连接池

8.8.1、连接池简介

Web 应用程序必须首先和数据库建立连接,即得到 Connection 对象,才能进行后续的操作 ,例如查询.更新.添加记录等操作。和数据库建立连接属于比较耗os 时的操作 ,连接池的思想是,由一个管理者,例如 Tomcat 服务器,事先建立好若干个连接,即创建各和干个 Connection 对象放在一起(存放在一个实现 DataSource 接口的对象中) ,称作一个连接池。当 Web 应用程序需要连接数据库时,只需到连接池中获得一个 Connection 对象即可。当 Web 应用程序不再需要 Connection 对象时,就让 Connection 对象调用 close()方法,这样就可以把这个 Connection 对象再返回到连接池中,以便其他 Web 应用程序使用这个 Connection 对象。需要注意的是,Tomcat 服务需提供的连接池中的Connection 对象调用 close()方法不会关闭和数据库的TCP连接,其作用仅仅是把Connection 对象返回到连接池(这一点和 Web 应用程序自己创建的 Connection 对象不同,其原理不必深究) 。简单地说,连接池可以让 Web 应用程序方便地使用 Connection 对象(用完务必放回) ,再用再取,节省了创建 Connection 的时间,提高了 Web 应用程序访问数据库的效率。

8.8.2、建立连接池

(1)连接池配置文件

为了让 Tomcat 服务器创建连接池 ,必须编写一个 XML 文件,Tomcat 服务器通过读取该文件创建连接池。XML 文件的名字必须是 context. xml。内容如下 :

context. Xml

<?xml verslion = "1.0”encoding= "utf -8”?>
< Context >
< Resource>
name = “gxv
type = “Javax. sql1.DataSource””
driverClassName = “com.mysql.c]j. jdbc. Driver”
url =” jdbc:mysql://127.0.0.1:3306/bookDatabase?useSSL = false
& amp; serVverTimezone = CST&characterFEncoding= utf 一8”
Username = “root”
password = " "
maxRActive = “15”
maxIdle = "15”
minIdle = “1”
maxWait = "1000”
/>
< /Context >

将连接池配置文件 context. xml 文件保存在 Web 服务目录的 META-INEF 子目录中。例如,对于 Web 服务目录 ch8 ,需要在 ch8 下新建一个子目录 META-INF(字母大写) ,将连接池配置文件 context. xml 保存在\ch8\META-INF\目录路径下(不必重新启动 Tomcat 服务吉) 。Tomeat 服务器会立刻读取 context. xml,创建连接池。如果修改 context. xml 文件,重新保存,Tomcat 服务融会立刻再次读取 context. xml,创建连接池。

连接池配置文件 context. xml 中的 Resource 标记(元素)通知 Tomcat 服务器创建数据源(连接池) ,Resource 标记中各个属性的意义如下 :

(1) name: 设置连接池的名字(命名一个喜欢的名字即可) ,例如 gxy,该名字是连接池的id,context. xml 文件中 ,如果有多个 Resource 标记(一个 Resource 标记对应一个连接池) ,必须保证这些 Resource 标记中的 name 互不相同,即 context. xml 文件可以给出多个不同连接池的配置信息。

(2) type: 设置连接池的类型 ,这里必须是 javax. sql. DataSource ,即 Tomcat 服务需把创建的 Connection 对象存放在实现 DataSource 接口的对象中,即连接池是一个 DataSource 型对象。Tomeat 服务器使用 org. apache. tomcat. dbcp. dbcp2 包中的 BasicDataSource 类创建连接池(包含该包的 jar 文档在 Tomcat 安装目录的\lib 子目录中) 。

(3) driverClassName: 设置数据库连接需,即数据库驱动的类。如果是为 MySQL 8. 0 数据库建立连接池, driverClassName 的值就是 com. mysql. cj. jdbc. Driver (MySQL 5. 6 是com. mysdql. jdbc. Driver) ,如果是 SQL Server 数据库 ,其值是 com. microsoft. sqlserver. jdbc.SQLServerDriver ,如果是 Access 数据库 ,其值是 com. hxtt. sql. access. AccessDriver。不要坏记把相应的数据库连接需保存到 Tomcat 安装目录下的1lib 文件夹中,例如,把 JDBC-MySQL数据库连接器 mysql-connector-java-8.0. 18. jar 保存到 Tomcat 安装目录下的1lib 文件夹中,并重新启动了 Tomcat 服务需。

(4) url: 设置连接数据库的 URL ,注意 url 要小写。需要注意的是对于 url 中的 亿 字符要写成“&”,这是 XML 文件对特殊字符的一个特殊规定。

(5) username: 给出可以访问数据库的用户名,例如 root。

(6) password: 给出访问数据库的密码,例如,root 用户的默认密码是无密码。

(7) maxActive: 设置连接池的大小,即连接池中处于活动状态 Connection 对象的数目(Tomeat 服务器创建的 Connection 对象的最大数目)。maxActive 取值不可以超过数据库系统人允许的最大连接数目(同一时刻允许的最多连接数目,细节参看有关数据库系统的说明)。在设计 Web 应用程序时,通过使用连接池 ,不仅可以提高访问数据库的效率,也可以防止数据库系统连接数目过多导致数据库系统性能下降。取值 0 表示不受限制。

(8) maxIdle: 设置连接池中可处于空闲状态的 Connection 对象的最大数目,取值非正整数,例如 0,表示不限制,如果取正整数,例如6,那么当空闲状态的 Connection 对象多余 6 个时,Tomcat 服务器会释放多余的 Connection 对象,即从连接池中删除某些 Connection 对象 。

(9) minIdle : 设置连接池中保证处于空闲状态的 Connection 对象的最小数目。例如 ,取值 1 ,当连接池中仅仅剩下两个空闲状态 Connection 对象时 ,此刻如果同时有两个用户需要使用连接池中的 Connection 对象 ,那么二者只能有一个获得 Connection 对象 ,另一个用户必须等待(因为 Tomecat 服务需必须保证连接池中有 1 个 Connection 对和象空闲) 。

(10) maxWait: 设置连接池中没有空闲状态 Connection 对象可用时,用户请求获得连接池中 Connection 对象需要等待的最长时间(单位是毫秒) ,如果超出 maxWait 设置的时间,Tomcecat 服务器将抛出一个 TimeoutException 给用户。取值负数,例如一1,表示用户可以无限时等待。

(2)使用连接池

应用程序必须到 Tomcat 服务需中去获得连接池。步骤如下 :
(1) Context 接口 。

首先创建一个实现 Context(上下文)接口的对象 :

Context context = new InitialContext( ) ;

然后让 context 去寻找 Tomceat 服务需曾绑定在运行环境中的另一个 Context 对象 ;

Context contextNeeded = (Context)context. lookup(" java:compVenv" ) ;

其中的 java:compyenv 是 Tomcat 服务需绑定这个 Context 对象时使用的资源标志符(不可以写错) 。

(2) 得到连接池 。

Tomecat 服务需通过连接池配置文件 context. xml 将连接池绑定在 Context 对和象contextNeeded 中(见步骤(1))。绑定用的资源标志符是连接池配置文件 context. xml 中name 给的值,例如 gxy。因此,从 contextNeeded 中获得连接池的代码是:

DataSource ds = (DataSource)contextNeeded. lookup(“gxV” ) ;

(3) 从连接池中获得连接。

获得连接池之后,就可以从连接池中获得 Connection 对象。连接池中都是已经创建好的Connection 对象 ,连接池调用 getConnection()方法,如果有空闲的 Connection 对象 ,该方法就返回一个 Connection 对象,如果没有空闲的 Connection 对象,该方法将使得用户线程处于waiting 状态,即等待该方法返回 Connection 对象(见连接池配置文件 context. xml 中maxWait 值的设置)。代码如下 :

Connection con = ds. getConnection( ) ;

(4) 将连接返回连接池 。

当 Web 应用程序不再需要 Connection 对象时,就让 Connection 对象调用 close()方法,这样就可以把这个 Connection 对象再放回连接池中,以便其他 Web 应用程序使用这个Connection 对象。如果用户都忘记 Connection 对象再返回连接池中,将可能很快导致连接池中无 Connection 对象可用。
 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值