tomcat配置jndi连接池的3种方式
- 格式:doc
- 大小:102.00 KB
- 文档页数:7
1.简介DBCP(DataBase Connection Pool),数据库连接池。
是 apache 上的一个 java 连接池项目,也是tomcat 使用的连接池组件。
单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
dbcp提供了数据库连接池可以在spring,iBatis,hibernate中调用dbcp完成数据库连接,框架一般都提供了dbcp连接的方法;tomcat中也提供了dbcp的jndi设置方法,也可以不在框架中使用dbcp,单独使用dbcp 需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar2.参数说明翻译自这里可以开启PreparedStatements池. 当开启时, 将为每个连接创建一个statement 池,并且被下面方法创建的PreparedStatements将被缓存起来:●public PreparedStatement prepareStatement(String sql)●public PreparedStatement prepareStatement(String sql, int resultSetType, intresultSetConcurrency)如果容许则可以使用下面的方式来获取底层连接:Connection conn = ds.getConnection();Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate();...conn.close()默认false不开启, 这是一个有潜在危险的功能, 不适当的编码会造成伤害.(关闭底层连接或者在守护连接已经关闭的情况下继续使用它).请谨慎使用,并且仅当需要直接访问驱动的特定功能时使用.注意: 不要关闭底层连接, 只能关闭前面的那个如果开启"removeAbandoned",那么连接在被认为泄露时可能被池回收. 这个机制在(getNumIdle() < 2) and (getNumActive() > getMaxActive() - 3)时被触发。
jndi原理一、什么是jndiJava命名和目录接口(Java Naming and Directory Interface,简称JNDI)是Java平台提供的一个用于访问命名和目录服务的API。
它允许Java应用程序通过统一的方式访问不同的命名和目录服务,如DNS、LDAP、NIS等。
JNDI提供了一种标准化的方式来管理和查找Java对象,使得开发者可以轻松地将不同类型的资源绑定到Java命名空间中,并通过命名的方式进行访问和管理。
二、JNDI的使用场景JNDI主要用于以下几个方面:1.连接数据库:通过JNDI可以将数据库连接池配置为一个资源,然后通过命名的方式在应用程序中访问数据库连接池,从而降低了应用程序与特定数据库连接池的耦合性,使得数据库的切换更加方便。
2.连接消息队列:JNDI可以将消息队列配置为一个资源,应用程序可以通过命名的方式访问消息队列,从而发送和接收消息。
3.访问企业级资源:在企业级开发中,往往需要访问多个不同的资源,如EJB、JMS、JDBC等。
通过将这些资源配置为JNDI资源,可以通过统一的方式在应用程序中访问这些资源。
4.配置中心:在分布式系统中,经常需要集中管理各个子系统的配置信息。
通过使用JNDI,可以将配置信息存储为JNDI资源,然后在各个子系统中通过命名的方式访问配置信息。
三、JNDI的工作原理JNDI的工作原理可以分为以下几个步骤:1.创建一个初始上下文(Initial Context):应用程序通过调用JNDI提供的API创建一个初始上下文,用于获取其他JNDI资源的入口。
初始上下文是整个JNDI操作的起点。
2.查找JNDI资源:通过初始上下文,应用程序可以通过命名的方式查找指定的JNDI资源。
JNDI提供了一套命名规范,用于标识不同类型的资源。
应用程序可以通过这些命名规范指定要查找的资源。
3.绑定和解绑JNDI资源:应用程序可以将一个Java对象绑定到JNDI上下文中,使得其他应用程序可以通过命名的方式访问该对象。
Tomcat 部署项目的三种方法1、下载Tomcat 服务器官网下载地址:/回到顶部2、启动并部署Tomcat 服务器①、解压tomcat 安装包到一个非中文目录下②、配置环境变量。
JAVA_HOME(指向JDK 安装的根目录)③、双击apache-tomcat-6.0.16\bin 目录下的startup.bat,启动服务器(如果一闪而过,那就是没有配置JAVA_HOME 的环境变量)④、在浏览器中输入http://localhost:8080注意:Tomcat 启动不了的时候注意配置JAVA_HOME:C:\ProgramFiles\Java\jdk1.6.0_43这是安装JDK的根目录回到顶部3、Tomcat 的目录结构4、部署项目的第一种方法(项目直接放入webapps 目录中)1、将编写并编译好的web项目(注意要是编译好的,如果是eclipse,可以将项目打成war 包放入),放入到webapps 中2、启动tomcat服务器(双击apache-tomcat-6.0.16\bin 目录下的startup.bat,启动服务器)3、在浏览器输入:http://localhost:8080/项目名/访问的文件名5、部署项目的第二种方法(修改conf/server.xml 文件)①、打开tomcat下conf/server.xml,在1path:浏览器访问时的路径名docBase:web项目的WebRoot所在的路径,注意是WebRoot的路径,不是项目的路径。
其实也就是编译后的项目reloadble:设定项目有改动时,tomcat是否重新加载该项目②、双击startup.bat,启动tomcat 服务器,然后在浏览器输入访问的项目名称路径注意:如果你配置的path="/xx",那么访问的时候就是这样:6、部署项目的第三种方法(apache-tomcat-7.0.52\conf\Catalina\localhost )①、进入到apache-tomcat-7.0.52\conf\Catalina\localhost 目录,新建一个项目名.xml 文件②、在那个新建的xml 文件中,增加下面配置语句(和上面的是一样的,但是不需要path 配置,加上也没什么用)1③、在浏览器输入路径:localhost:8080/xml文件名/访问的文件名总结:①、第一种方法比较普通,但是我们需要将编译好的项目重新copy 到webapps 目录下,多出了两步操作②、第二种方法直接在server.xml 文件中配置,但是从tomcat5.0版本开始后,server.xml 文件作为tomcat 启动的主要配置文件,一旦tomcat 启动后,便不会再读取这个文件,因此无法再tomcat 服务启动后发布web 项目③、第三种方法是最好的,每个项目分开配置,tomcat 将以\conf\Catalina\localhost 目录下的xml 文件的文件名作为web 应用的上下文路径,而不再理会中配置的path 路径,因此在配置的时候,可以不写path。
tomcat面试题及答案Tomcat是一个被广泛应用的开源Web服务器,它是Java Servlet和JavaServer Pages(JSP)的参考实现。
在Tomcat面试中,面试官通常会涉及一些关于Tomcat的基本知识、架构、配置以及优化方面的问题。
本文将为您提供一些常见的Tomcat面试题及答案,帮助您准备好面试。
一、Tomcat的基本知识1. 请简要介绍一下Tomcat。
Tomcat是一个用于处理Java Servlet和JavaServer Pages的开源Web应用服务器。
它由Apache软件基金会开发和维护,并且是Apache HTTP Server的一部分。
Tomcat具有高性能、可靠性和可扩展性,并且支持JavaEE规范。
2. Tomcat和其他Web服务器(如Apache HTTP Server)有什么区别?Apache HTTP Server是一个通用的Web服务器,而Tomcat是专门用于Java Servlet和JSP的应用服务器。
Tomcat能够解析和执行Servlet和JSP,而Apache HTTP Server只能处理静态内容和基本的动态内容。
通常,Apache HTTP Server和Tomcat一起使用,以提供完整的Web应用程序环境。
3. 如何启动和停止Tomcat服务器?在Windows系统中,您可以运行`startup.bat`来启动Tomcat服务器,运行`shutdown.bat`来停止Tomcat服务器。
在Linux系统中,可以通过运行`./startup.sh`和`./shutdown.sh`来实现相同的功能。
4. 请解释一下Tomcat的架构。
Tomcat的架构主要由三个组件组成:连接器(Connector)、容器(Container)和组件(Component)。
- 连接器(Connector):负责在Tomcat和客户端之间处理网络通信。
JAVA使用JDBC连接数据库的几种方式JDBC(Java Database Connectivity)是Java编程语言用于连接数据库的一种标准API。
它提供了一种访问和操作不同类型数据库的方法。
在JDBC中,有几种不同的方式可以连接数据库。
下面是常见的几种方式以及它们的详细介绍。
1.使用JDBC驱动程序连接数据库2. DriverManager类连接数据库DriverManager是一个Java类,用于管理JDBC驱动程序。
它提供了一种简单的方法来注册和获取特定驱动程序的连接。
使用DriverManager 连接数据库时,首先需要加载驱动程序,并使用驱动程序的URL、用户名和密码创建连接。
然后可以使用这个连接执行SQL查询和更新操作。
3. DataSource接口连接数据库DataSource是一个接口,用于从数据库连接池获取连接。
连接池是一组预先创建的数据库连接,可以重复使用,从而提高应用程序的性能。
通过使用DataSource接口,可以通过配置连接池的方式来连接和管理数据库连接。
这种方式通常适用于大型应用程序或需要高并发连接的场景。
4. 使用JNDI(Java Naming and Directory Interface)连接数据库JNDI是Java提供的一种用于在Java应用程序中查找和访问命名服务的API。
通过使用JNDI,可以在应用程序中配置数据库连接信息,并使用统一的方式访问数据库。
这种方式通常适用于企业级应用程序,其中数据库连接信息可以统一管理。
5.使用第三方库连接数据库除了使用JDBC标准API连接数据库,还可以使用一些第三方库来简化数据库访问。
例如,Hibernate是一个流行的Java持久化框架,它提供了一种简单的方式来与数据库进行交互。
使用Hibernate,可以通过简单的配置来连接和管理数据库。
总结:上述是几种使用JDBC连接数据库的方式。
每种方式都有自己的优势和适用场景。
Tomcat6.0配置jndi连接池的几种方式博客分类:∙Tomcat6.0连接池∙tomcat连接池配置Tomcat6.0连接池配置11.配置tomcat下的conf下的context.xml文件,在之间添加连接池配置:<Resource name="jdbc/oracle"auth="Container"type="javax.sql.DataSource"driverClassName="oracle.jdbc.driver.OracleDriver"url=" jdbc:oracle:thin:@host:port:databse"username=" user "password="password"maxActive="100"maxIdle="30"maxWait="10000" />2.配置你的应用下的web.xml中的之间加入:<resource-ref><description>DB Connection</description><res-ref-name>jdbc/oracle</res-ref-name><res-type>javax.sql.DataSource</res-type><res-auth>Container</res-auth></resource-ref>3.把连接数据库的第三方驱动放到common/lib下面就ok了Tomcat6.0 连接池的配置2配置步骤如下:1.Tomcat 6的配置和以前的不同了,不推荐在server.xml中进行配置,而是在%Tomcat_Home%\webapps\yourApp\META-INF \context.xml中进行配置才是更好的方法。
而不是以前版本%Tomcat_Home%\conf下的context.xml文件。
这样就可以在不同的web应用下单独配置连接池了,且Tomcat会自动重载。
当然你也可以更改%Tomcat_Home%\conf下的context.xml文件,将所有web应用下的连接池进行统一配置。
2.将代码修改如下:view plaincopy to clipboardprint?<Context reloadable="true"><WatchedResource>WEB-INF/web.xml</WatchedResource><Resource name="jdbc/oracleds" auth="Container"type="javax.sql.DataSource"maxActive="100"maxIdle="30"maxWait="10000"username="scott"password="tiger"driverClassName="oracle.jdbc.driver.OracleDriver"url="jdbc:oracle:thin:@localhost:1521:ora9"/></Context><Context reloadable="true"><WatchedResource>WEB-INF/web.xml</WatchedResource><Resource name="jdbc/oracleds" auth="Container" type="javax.sql.DataSource"maxActive="100"maxIdle="30"maxWait="10000"username="scott"password="tiger"driverClassName="oracle.jdbc.driver.OracleDriver"url="jdbc:oracle:thin:@localhost:1521:ora9"/></Context>name 为当前数据源JNDI的名字,可以随意设定;auth 为验证方式;type 资源类型;driverClassName 为Oracle驱动引用;maxActiv 为连接池最大激活的连接数,设为0表示无限制;maxIdle 为连接池最大空闲的连接数,数据库连接的最大空闲时间。
超过空闲时间,数据库连接将被标记为不可用,然后被释放。
设为0表示无限制;maxWait 为连接最大的等待时间,单位毫秒,如果超过此时间将接到异常。
设为-1表示无限制。
;username 为oracle数据库的一个用户名;password 为username的密码;url 为连接oracle的连接地址;注:本人尝试将代码“driverClassName="oracle.jdbc.driver.OracleDriver"”改为“driverClassName="oracle.jdbc.OracleDriver"”程序依然运行正常,刚开始以为老师的代码有问题3.在程序中的调用形式为:view plaincopy to clipboardprint?Context context = new InitialContext();DataSource ds = (DataSource)context.lookup("java:/comp/env/jdbc/oracleds"); Connection conn = ds.getConnection();Context context = new InitialContext();DataSource ds = (DataSource)context.lookup("java:/comp/env/jdbc/oracleds"); Connection conn = ds.getConnection();注:“java:/comp/env/jdbc/oracleds”红色标记文字为步骤1里设置的Resource name 则可以将建立connection的方式以上述形式取代传统方式:view plaincopy to clipboardprint?String driver = "oracle.jdbc.driver.OracleDriver";String url = "jdbc:oracle:thin:@localhost:1521:ora9";String username = "scott";String password = "tiger";Class.forName(driver);Connection conn = DriverManager.getConnection(url, username, password); String driver = "oracle.jdbc.driver.OracleDriver";String url = "jdbc:oracle:thin:@localhost:1521:ora9";String username = "scott";String password = "tiger";Class.forName(driver);Connection conn = DriverManager.getConnection(url, username, password);4.另外还需将用到的jdbc驱动类库导入到%Tomcat_Home%\lib目录下否则会抛出如下异常:org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'依上述步骤就能成功的配置Tomcat6.0 连接池,还有网友贴文说需在web.xml文件中的web-app节点下加入如下代码形式:<resource-ref><res-ref-name>jdbc/myoracle</res-ref-name><res-type>javax.sql.DataSource</res-type></resource-ref>因本人未添加此项,程序依然正确,故本人认为此步骤为非必要项今天需要在另一台机器上重新部署系统,重新设置db的连接池。
当我把tomcat 拷贝到那台机器,并且修改META-INF\context.xml,然后重新启动tomcat,但发现系统连接的仍然是老的db。
再次检查了META-INF\context.xml文件,确信了这个文件已经正确设置db连接了,这也说明这个文件并没有真正起作用。
查看了tomcat下conf\context.xml也没有设置db的连接池。
那是哪个文件在起作用呢?折腾了办法,后来发现tomcat在conf\Catalina\localhost下生成了一个和原来META-INF\context.xml相同内容的文件,怀疑一定是这个文件在起作用?删除conf\Catalina\localhost目录,重启tomcat,问题消失。
Tomcat6.0 连接池的配置3不管是tomcat5,Tomcat5.5或Tomcat6.0. 用下面的这两中方法配置连接池,都可以成功.1. 应该算是全局的连接池的配置(1).不管是tomcat5 还是tomcat6 ,都首先找到Tomcat目录下面的conf目录中的server.xml文件.找到<GlobalNamingResources> </GlobalNamingResources>这对标签.将这样的一段配置加到标签中间.<Resourcename="jdbc/TestDB"auth="Container"type="javax.sql.DataSource"driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/test?autoReconnect=true"maxActive="50"maxldle="10"maxWait="5000"username="root"password="admin" />当然,样例是使用 MYSQL配置, 根据不同的需要,将url,driverClassName,username,passsword等参数改变就行.然后再找到和server.xml同目录下面的context.xml文件.在<Context></Context>标签中添加如下配置.<ResourceLink global="jdbc/TestDB" name="jdbc/TestDB" type="javax.sql.DataSou rce"/>global="jdbc/TestDB" 中的参数值("jdbc/TestDB")必须和上一段<Resource >配置中的name属性的值保持一样.name="jdbc/TestDB" 这个可以随便取,但是在程序中调用的时候,就应该与name的值保持一致.到这里,连接池已经配置好啦写个jsp测试<%@ page language="java" pageEncoding="gbk"%><%@page import="java.sql.Connection"%><%@page import="javax.naming.Context"%><%@page import="javax.naming.InitialContext"%><%@page import="javax.sql.DataSource"%><%@page import="java.sql.Statement"%><%@page import="java.sql.ResultSet"%><%//连接池的获取Connection conn = null;DataSource ds = null;ResultSet rs =null;Statement stmt = null;Context initCtx = new InitialContext();ds =(DataSource)initCtx.lookup("java:comp/env/jdbc/TestDB");if(ds!=null){out.println("已经获得DataSource!");out.println("<br>");conn = ds.getConnection();try{stmt = conn.createStatement();String sql ="select * from tree_table";rs = stmt.executeQuery(sql);out.println("以下是从数据库中读取出来的数据:<br>");while(rs.next()){out.println("<br>");out.println(rs.getString("nodeName"));}}catch(Exception ex){ex.printStackTrace();}finally{conn.close();rs.close();stmt.close();}}%>在这ds =(DataSource)initCtx.lookup("java:comp/env/jdbc/TestDB");这句代码中的jdbc/TestDB必须和<ResourceLink global="jdbc/TestDB" name="jdbc/TestDB" ........ />中的name 属性保持一样."lookup("java:comp/env/..."这都是固定写法.2. 应该算是局部的连接池的配置吧.(针对工程而言)本身我们的工程中META-INF 中,没有context.xml文件,例如 :E:\apache-tomcat-5.5.16\webapps\myproj\META-INF\此时我们可以在META-INF目录下面新建一个context.xml文件.里面写下如下的配置,具体的配置参数,按需改变.Xml代码<?xml version="1.0" encoding="UTF-8"?><Context reloadable="true" crossContext="true"><Resourcename="jdbc/TestDB"auth="Container"type="javax.sql.DataSource"driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/test?autoReconnect=true"maxActive="50"maxldle="10"maxWait="5000"username="root"password="admin"/></Context>。