基于Tomcat 数据源的原理、配置、使用介绍

时间:2022-06-01 18:16:29

1、数据源的作用及操作原理  

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

传统jdbc操作步骤

1、加载数据库驱动程序,数据库驱动程序通过classpath配置;

2、通过drivermanager类取得数据库连接对象;

3、通过connection实例化preparedstatement对象,编写sql命令操作数据库

4、数据库属于资源操作,操作完成后进行数据库的关闭以释放资源。如图所示:

基于Tomcat 数据源的原理、配置、使用介绍

对于不同的用户只有操作不同,但是对于1、2、4三个步骤很明显是一个重复的操作。

如果开发中直接使用jdbc操作的话,那么就会产生这种性能的问题,那么怎么做最合适呢?

如果假设数据库不关闭,以后如果有新的用户使用的时候直接取一个已经有的连接的话。

就好比,学校为学生提供雨伞,一旦下雨将为学生准备雨伞,这个时候学生不用再重新去找雨伞,之后再重新去买雨伞。

假设有100把伞,如果现在不下雨,肯定不能把所有的伞都摆上,所以一般平常如果没人用的时候至少摆上10把。当然,最大的时候只能提供100把伞。

还需要一个等待的时间。

最小维持的数据库连接数,最大允许打开的连接数。

tomcat 4.1 版本之后就开始支持这种操作了,这种操作就称为数据库连接池,存放的是所有的数据库连接。

2、在tomcat中使用数据库连接池

在web容器中,数据库的连接池都是通过数据源(javax.sql.datasource)访问的,即:可以通过 javax.sql.datasource 类取得connection对象,但是如果要想得到一个datasource对象需要使用jndi进行查找。

基于Tomcat 数据源的原理、配置、使用介绍

jndi(java naming and directory interface)属于命名及目录查找接口,主要的功能是用于进行查找的,查找对象。
但是,现在的数据库的连接池是需要在tomcat上完成配置的。

要修改server.xml文件才可以起作用。

如下,以连接mysql为例:

?
1
2
3
4
5
6
7
8
9
10
11
12
<context docbase="d:/data/webdemo" path="/webdemo" debug="0" reloadable="true">
  <resource name="jdbc/mydb"
    auth="container"
    type="javax.sql.datasource"
    maxactive="100"
    maxidle="30"
    maxwait="10000"
    username="root"
    password="root"
    driverclassname="org.gjt.mm.mysql.driver"
    url="jdbc:mysql://localhost:3306/mydb"/>
</context>

此配置有几个参数:

·name:表示数据源名称,也是jndi要查找的名称

·auth:表示由谁负责资源连接,container:容器管理,application:程序管理,一般设置为 container

·type:表示对象,数据源上每一个绑定的都是datasource

·maxactive:表示最大激活连接数,这里取值为100,表示同时最多有100个数据库连接,一般把maxactive设置成可能的并发量

·maxidle:表示最大的空闲连接数,这里取值为30,表示即使没有数据库连接时依然可以保持30空闲的连接,而不被清除,随时处于待命状态

·maxwait:表示最大等待秒钟数,这里取值10000,表示10秒后超时,如果取值-1,则表示无限等待,直到超时为止,如果超时将接到异常

·username:数据库用户名

·password:数据库登录密码

·driverclassname:数据库驱动名称

.url:数据库url

但是现在使用的tomcat版本是6.0以上的版本,所以想让一个数据源起作用的话,还必须在web.xml(注意:此web.xml是web项目的web.xml文件,而不是tomcat服务器的web.xml文件)文件之中完成配置。

?
1
2
3
4
5
<resource-ref>
 <res-ref-name>jdbc/mydb</res-ref-name>
  <res-type>javax.sql.datasource</res-type>
 <res-auth>container</res-auth>
</resource-ref>

 

3、查找数据源 

数据源的操作使用的是jndi方式进行查找的,所以如果要想使用数据源取得数据库连接的话,则必须按照如下的步骤进行

初始化名称查找上下文:context ctx = new initialcontext();

通过名称查找datasource对象:datasource ds = (datasource)ctx.lookup(jndi名称);

通过datasource取得一个数据库连接:connection conn = ds.getconnection()。

此时调用数据库会出现一个exception:

javax.servlet.servletexception: javax.naming.namenotfoundexception: name jdbc is not bound in this context

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

以后程序中只认名字,而具体是哪个数据库将由配置决定。

当然,如果现在使用的是dao开发的,databaseconnection.java类。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.shawn.mvcdemo.dbc;
 
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
 
public class databaseconnection{
 private static final string dsname = "java:comp/env/jdbc/mldn";//java:comp/jndi名称
 
 private connection conn = null;
 
 public databaseconnection() throws exception{
  context ctx = new initialcontext();//初始化名称查找上下文
  datasource ds = (datasource)ctx.lookup(dsname); //通过名称查找datasource对象
  this.conn = ds.getconnection();  //通过datasource取得一个数据库连接
 }
 
 public connection getconnection(){
  return this.conn;
 }
 
 public void close() throws exception{
  if(this.conn != null){
   try{
    this.conn.close();//释放数据库连接
   } catch(exception e){
    throw e;
   }
  }
 }
 
 public static void main(string args[]){
  try{
   system.out.println(new databaseconnection().getconnection());
  } catch(exception e){
   e.printstacktrace();
  }
 }
}

可是有一点也必须注意的是,现在的数据库连接池实在tomcat上配置的,所以此程序只能在web下运行,而不能使用application程序运行。

总结:

要使用数据库连接池

1、配置server.xml;

2、配置web项目中的(比如:webdemo项目)web.xml文件,添加 resource-ref 配置;

3、修改程序中获取connection的方式。

以上这篇基于tomcat 数据源的原理、配置、使用介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:http://www.cnblogs.com/ShawnYang/archive/2017/08/30/7451459.html