IDC资讯

质量为本、客户为根、勇于拼搏、务实创新

< 返回IDC资讯列表

如何正确的使用Tomcat 数据源

发布时间:2022-05-30

今天我就来和大家谈谈如何正确使用Tomcat数据源,这个可能很多人都不太懂。为了让大家更好地了解,桂哥网络为大家总结了以下内容,希望大家能从这篇文章中有所收获。

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

在程序代码中使用数据源可以提高运算性能,这取决于运算原理。

传统JDBC操作步骤

1.加载数据库驱动程序,它由CLASSPATH配置;

2.通过DriverManager类获取数据库连接对象;

3.通过连接实例化PreparedStatement对象,编写SQL命令操作数据库;

4.数据库是一个资源操作。操作完成后,关闭数据库以释放资源。如图所示:

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

如果直接在开发中使用JDBC操作,会出现这种性能问题,那么最合适的方式是什么?

如果假设数据库没有关闭,如果将来有新用户使用它,他将直接使用现有的连接。

比如学校给学生提供雨伞,一旦下雨就给学生准备雨伞。这时候学生就不用再找伞了,然后再买。

假设有100把伞。如果现在不下雨,你不能把伞都带上,所以通常在没人用的时候至少要放10把伞。当然最多只能提供100把伞。

还需要一段等待时间。

维护的最小数据库连接数和允许的最大开放连接数。

从Tomcat版开始就支持这个操作。此操作称为数据库连接池,它存储所有数据库连接。

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

在web容器中,数据库的连接池是通过数据源(javax.sql.DataSource)来访问的,也就是说,可以通过javax.sql.DataSource类来获取连接对象,但是如果想要获取数据源对象,就需要使用JNDI来找到它。

JNDI (Java命名和目录接口)是一个命名和目录查找接口,它的主要功能是查找对象。

但是,当前的数据库连接池需要在Tomcat上配置。

文件server.xml需要修改才能生效。

如下,以连接mysql为例:

ContextdocBase=' d :/data/web demo ' path='/web demo ' debug=' 0 '可重新加载='true '

Resourcename='jdbc/mydb '

授权='容器'

type='javax.sql.DataSource '

maxActive='100 '

maxIdle='30 '

maxWait='10000 '

用户名='root '

密码='root '

driver classname=' org . gjt . mm . MySQL . driver '

URL=' JDBC : my SQL ://localhost :3306/mydb '/

/背景此配置有几个参数:

name:表示数据源名称,这也是JNDI正在寻找的名称。

auth:指示谁负责资源连接、容器:容器管理和应用程序:程序管理,后者通常设置为容器

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

maxActive:表示活动连接的最大数量,其中值为100,这意味着同时最多有100个数据库连接。一般情况下,maxActive设置为可能的并发量。

maxIdle:表示最大空闲连接数,这里的值是30,这意味着即使没有数据库连接,30个空闲连接仍然可以保持而不被清除,并且始终处于待机状态。

maxWait:表示等待的最大秒数,其中值为10000,表示10秒后超时。如果值为-1,则表示无限期等待,直到超时,如果超时,将会收到异常。

用户名:数据库用户名

password:数据库登录密码

驾驶员姓名:数据

库驱动名称

.url:数据库url

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

<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类。

packagecom.shawn.mvcdemo.dbc;
importjava.sql.*;
importjavax.sql.*;
importjavax.naming.*;
publicclassDatabaseConnection{
privatestaticfinalStringDSNAME="java:comp/env/jdbc/mldn";//java:comp/JNDI名称
privateConnectionconn=null;
publicDatabaseConnection()throwsException{
Contextctx=newInitialContext();//初始化名称查找上下文
DataSourceds=(DataSource)ctx.lookup(DSNAME);//通过名称查找DataSource对象
this.conn=ds.getConnection();  //通过DataSource取得一个数据库连接
}
publicConnectiongetConnection(){
returnthis.conn;
}
publicvoidclose()throwsException{
if(this.conn!=null){
try{
this.conn.close();//释放数据库连接
}catch(Exceptione){
throwe;
}
}
}
publicstaticvoidmain(Stringargs[]){
try{
System.out.println(newDatabaseConnection().getConnection());
}catch(Exceptione){
e.printStackTrace();
}
}
}

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

总结:

要使用数据库连接池

1、配置server.xml;

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

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

看完上述内容,你们对如何正确的使用Tomcat 数据源有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。


TikTok千粉号购买平台:https://tiktokusername.com/