今天我就来和大家谈谈如何正确使用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/
TOP