06---tomcat数据源

tomcat数据源的原理、配置、使用:

在程序代码之中 使用数据源是可以提升操作性能的,这种性能的提升依靠于操作原理;

传统的JDBC操作步骤:
	<1>、加载数据库驱动程序,数据库驱动程序通过ClassPath配置;
	<2>、通过DriverManager类取得数据库连接对象
	<3>、通过Connection实例化PreparedStatement对象,编写sql操作数据库
	<4>、数据库属于资源操作,操作完成后要进行数据库的关闭;
对于不同的用户只有操作不同,但是对于1、2、4三个步骤很明显是一个重复的操作;

如果开发中直接使用JDBC操作的话,那么就会产生这种性能的问题,那么怎么做才是最合适的?
如果假设数据库不关闭,以后如果有新的用户使用的时候直接取一个已经有的连接的话,这样就把
	1、2、4三个步骤给省略了,可以拿过连接来直接进行3步骤;

就好比,我们为学生提供雨伞,一旦下雨将为学生准备雨伞,着用学生不用重新去找、去带、去买雨伞
	了;
假设有100把伞,如果现在不下雨,肯定不能都把所有的伞都摆上,所以一般平常如果没人用的时候至少
	摆上10把,当然,最大的时候只能提供100把伞;
	还需要一个等待的时间(等待学生把伞送回来);
	数据库存在最小维持的连接数,最大允许 打开的连接数,等待的时间;
而tomcat4.1版本之后就开始支持这种操作了,而这种操作就称为数据库连接池,存放的是所有的
	数据库连接;

在Tomcat中使用数据库连接池:
	·在WEB容器中,数据库的连接池都是通过数据源(javax.sql.DataSource)访问的,即:
		可以通过javax.sql.DataSource类取得一个Connection对象,但是如果要想得
		到一个DataSource对象需要使用JNDI进行查找。
	——————————————————————————————————
	客户端		DataSource    Connection Pool
					____________
		|			|Connection|
	客户	|			|Connection|
		|DataSource		|Connection|
		|			|Connection|---------------->DataBase
		|DataSource		|Connection|  JDBC Driver
		|			|Connection|
		JNDI Tree			|__________|
				   
	JNDI属于命名及目录查找接口,主要的功能是用于进行查找的,找对象的;
	但是,现在的数据库的连接池是需要在tomcat上完成配置的,在tomcat目录
		的conf/server.xml中进行配置;
	下面是一个mysql数据库的连接池的配置(前提mysql数据库服务启动)
		<Context path="/lid" docBase="D:\javaeedemo" reloadable="true">
			<Resource name="jdbc/lid"
				  auth="Container"
				  type="javax.sql.DataSource"
				  maxActive="100"
				  minIdle="30"
				  maxWait="10000"
				  username="root"
				  password="mysqladmin"
				  driverClassName="org.gjt.mm.mysql.Driver"
				  url="jdbc:mysql://localhost:3306/lid"/>
		</Context>
		此配置的几个参数:
			·name:表示数据源的名称,也是要查找的名称;
			·auth:表示由容器负责资源的连接
			·type:表示对象,数据源上每一个绑定的都是DataSource
			·maxActive:表示最大连接数
			·minIdle:表示最小维持的数量
			·maxWait:最大等待时间
		对于连接的授权有两种:Container、application;
	如果现在假设是oracle数据库的话,则直接换启动程序即可:
		<Resource name="jdbc/lid"
			  auth="Container"
			  type="javax.sql.DataSource"
			  maxActive="100"
			  maxIdle="30"
			  maxWait="10000"
			  username="root"
			  password="mysqladmin"
			  driverClassName="oracle.jdbc.driver.OracleDriver"
			  url="jdbc:oracle:thin:@localhost:1521:lid"/>

	但是现在使用的Tomcat版本是6.0的版本,所以要想让一个数据源起作用的话,
	还必须在WEB-INF\web.xml中进行配置:
		    <resource-ref>
		    	<res-ref-name>jdbc/lid</res-ref-name>
		    	<res-type>javax.sql.DataSource</res-type>
		    	<res-auth>Container</res-auth>
		    </resource-ref>
启动服务器;

查找数据源:
	数据源的操作使用的是JNDI方式进行查找的,所以如果要想使用数据源取得数据库连接的话,
	则必须按照如下的步骤进行:
		·初始化名称查找上下文:Context ctx=new InitialContext();
		·通过名称查找DataSource对象:DataSource ds=(DataSource)ctx.lookeup(JNDI名称);
		·通过DataSource取得一个数据库连接:Connection conn=ds.getConnection();

	实际上对于这种资源操作,本身是需要一个环境属性的支持的:java:comp/env,但是tomcat是免费的,
	他没有对这种属性提供支持,所以如果要想访问tomcat中的名称服务的话,则肯定要在前面加上次属性,
	即,现在的名称是:java:comp/env/jdbc/lid;

datasource.jsp:
	<%@ page contentType="text/html" pageEncoding="gbk"%>
	<%@ page import="java.sql.*"%>
	<%@ page import="javax.sql.*"%>
	<%@ page import="javax.naming.*"%>
	<html>
	<head><title>这是测试</title></head>
	<body>
		<%
			String DSNAME="java:comp/env/jdbc/lid";//名称
			Context ctx=new InitialContext();
			DataSource ds=(DataSource)ctx.lookup(DSNAME);
			Connection conn=ds.getConnection();//从连接池中去连接
		%>
		<%=conn%>
		<%
			conn.close();//表示将连接放到连接池中
		%>
		<h3></h3>
	</body>
	</html>

以后程序中只认名字,而具体是哪个数据库将有配置决定。
当然,如果现在使用的是DAO开发的,DatabaseConnection.java我们可以改成如下:
	package login.lid.dbc;
	import java.sql.*;
	import javax.sql.*;
	import javax.naming.*;

	public class DatabaseConnection{
			private static final String DSNAME="java:comp/env/jdbc/lid";//名称
			private Connection conn=null;		
			public DatabaseConnection() throws Exception{
				Context ctx=new InitialContext();
				DataSource ds=(DataSource)ctx.lookup();
				this.conn=ds.getConnection();
				}
			//得到数据库的连接
			public Connection getConnection() throws Exception{
					return this.conn;
				}
			//关闭连接
			public void close() throws Exception{
					if(conn!=null){
							conn.close();
						}
				}
		}
	可是有一点必须注意,现在的数据库连接池是在Tomcat上配置的,所以此程序只能用在
	WEB项目中,而不能使用Application程序运行;


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bzuld

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值