Tomcat配置JNDI数据源

本文介绍如何在Tomcat服务器中配置JNDI数据源,包括将JDBC驱动放置于正确位置、创建context.xml及web.xml文件,并通过示例代码演示连接数据库的过程。

总结:
第一步:

将驱动程序(jar包)放到tomcat安装目录下的common\lib文件夹下
第二步:

在Tomcat的webapps目录随便创建一个工程目录,例如myjdbc。在myjdbc目录下创建META-INF目录,在此目录下创建一个context.xml文件,里面的内容如下:

<?xmlversion="1.0"encoding="UTF-8"?>
<Context>

<Resourcename="jdbc/test"
auth
="Container"

type
="javax.sql.DataSource"

maxActive
="100"
maxIdle
="30"

maxWait
="10000"

username
="sa"password=""
driverClassName
="net.sourceforge.jtds.jdbc.Driver"

url
="jdbc:jtds:sqlserver://localhost/pubs"/>
</Context>

附注如下:
Tomcat标准数据源资源工厂配置项如下:
* driverClassName - 所使用的JDBC驱动类全称。
* maxActive - 同一时刻可以自数据库连接池中被分配的最大活动实例数。
* maxIdle - 同一时刻数据库连接池中处于非活动状态的最大连接数。
* maxWait - 当连接池中没有可用连接时,连接池在抛出异常前将等待的最大时间,单位毫秒。
* password - 传给JDBC驱动的数据库密码。
* url - 传给JDBC驱动的连接URL。
* user - 传给JDBC驱动的数据库用户名。
* validationQuery - 一个SQL查询语句,用于在连接被返回给应用前的连接池验证。
* 如果指定了该属性,则必为至少返回一行记录的SQL SELECT语句。


jdbc/test是数据源的名称(随意写,要和web.xml文件中 <res-ref-name>jdbc/test</res-ref-name> 一样即可),
其他的参数按照自己的实际情况进行修改,例如数据库的名称、账号、密码。

第三步:

在myjdbc目录下创建WEB-INF目录,创建web.xml文件,内容如下:

<?xmlversion="1.0"encoding="UTF-8"?>
<web-appxmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation
="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

version
="2.4">


<resource-ref>

<description>DBConnection</description>

<res-ref-name>jdbc/test</res-ref-name>

<res-type>javax.sql.DataSource</res-type>

<res-auth>Container</res-auth>

</resource-ref>

</web-app>

说明:
<resource-ref>
<descrtiption>引用资源说明</descrtiption>
<res-ref-name>引用资源的JNDI名</res-ref-name>
<res-type>引用资源的类名</res-type>
<res-auth>管理者(Container)</res-auth><!--Container-容器管理 Application-Web应用管理-->
</resource-ref>
第四步:

写个jsp,试一下吧!

<%@pagecontentType="text/html;charset=utf-8"%>
<%@pageimport="java.sql.*,javax.sql.*,javax.naming.*,com.DBConnection"%>
<%
try
{
//初始化查找命名空间
Contextctx
=new
InitialContext();
//InitialContextctx=new
InitialContext();亦可
//找到DataSource,对名称进行定位java:comp/
env是必须加的,后面跟你的DataSource名
DataSourceds
=(DataSource)ctx.lookup("java:comp/env/jdbc/test"
);
//
取出连接
Connectionconn
=
ds.getConnection();
System.out.println(
"connectionpoolconnected!!"
);
}catch(NamingExceptione){
System.out.println(e.getMessage());
}catch(SQLExceptione){
e.printStackTrace();
}finally
{
//
注意不是关闭,是放回连接池.
conn.close();
}

}
%>


或写个JSP用标签库测试一下:

<%@pagelanguage="java"import="java.util.*"pageEncoding="ISO-8859-1"%>
<%@tagliburi="http://java.sun.com/jsp/jstl/sql"prefix="sql"%>
<%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%>

<sql:queryvar="rs"dataSource="jdbc/test">
select*fromauthors
</sql:query>

<html>
<head>
<title>DBTest</title>
</head>
<body>
<c:forEachvar="row"items="${rs.rows}">
${row.city}
<br/>
</c:forEach>
</body>
</html>

我成功了!Good Luck!
以下是配置JNDI的其他方法,个人不建议使用,因为修改服务器的
server.xml和web.xml,如果有一点错误,你的容器就会崩溃~

注:连接数据源的方法还有很多,在这里我简要说之:
比如说第二步还可以这么做:

在/tomcat/conf/Catalina/localhost(或其它主机名)/中添加以
虚拟目录名称(你的工程名)命名的XML文件来配置context.
比如我的主机下有个目录dbpool其地址为tomcat/webapps/test我可以这样来配置这个上下文:
在tomcat/conf/Catalina/localhost/目录下创建test.xml文件,内容和上面一样.

还可以:
在/tomcat/conf/server.xml中<host></host>标签之间添加

<Contextpath="/test"docBase="test"
debug
="5"reloadable="true"crossContext="true">
<Resourcename="jdbc/test"auth="Container"type="javax.sql.DataSource"
maxActive
="100"maxIdle="30"maxWait="10000"
username
="javauser"password="javadude"driverClassName="net.sourceforge.jtds.jdbc.Driver"
url
="jdbc:jtds:sqlserver://localhost/pubs"/>
</Context>

其中path是你的工程路径(相对或绝对亦可),其中docBase="test"说明,此主机已经指向到webapps目录下了,回头
来看test这个上下文,它实际目录是位于webapps的目录下的,所以
在Context中我们可以将docBase直接设置为test了。如果它在webapps/dbpool/test下,则设置为dbpool/test就可以了。

附:JNDI——Java Naming and Directory Interface是一套提供naming和 directory功能的 API,
Java应用程式开发者透过使用 JNDI,在naming和 directory方面的应用上就有了共通的准则.
<think>嗯,用户需要的是Spring Boot使用内置Tomcat配置JNDI数据源的具体方法。这个问题在Java企业级开发中挺常见的,特别是在需要连接生产环境数据库的场景。 用户提供的两篇参考资料挺有针对性,第一篇讲的是springboot内置tomcat集成jndi数据源的实际踩坑经验,第二篇则解释了JNDI数据源的优势。看来用户已经做过一些调研,现在需要的是具体实现步骤。 从技术实现角度,需要重点关注这几个层面: 首先要理解JNDI的核心价值在于解耦配置,这点在引用[2]里解释得很清楚。用户可能正在处理多环境部署的问题,所以才需要这种配置方式。 具体实现上,考虑分这几个步骤: 第一是配置Tomcat的server.xml,这个文件在Spring Boot项目中默认不存在,需要手动创建。这里要特别注意context.xml文件的关联配置,很多开发者容易漏掉这个环节。 第二是数据源定义,需要根据数据库类型选择合适的DBCP2连接池参数。考虑到用户可能使用不同数据库,建议列出MySQL示例但注明可替换驱动类。 第三是Spring Boot的适配层实现,这也是最容易出错的地方。需要特别强调必须使用TomcatServletWebServerFactory来覆盖默认配置,普通@ConfigurationProperties在这里不适用。 最后关于验证环节,考虑推荐两种方式:直接JNDI查找和DataSource注入。后者更符合Spring Boot的习惯写法,但前者更能验证JNDI本身的正确性。 用户可能遇到的典型坑点包括: - context.xml文件路径错误 - 忘记声明resourceRef导致JNDI查找失败 - 连接池参数配置不当 - 与HikariCP等默认连接池冲突 考虑到这是生产级配置,在回答里应该包含多环境配置建议和连接池参数调优提示。虽然用户没明确说,但这些往往是实际部署时必然遇到的问题。 </think>在 Spring Boot 中使用内置 Tomcat 配置 JNDI 数据源需要手动配置 Tomcat 并注册 JNDI 资源,以下是详细步骤: --- ### **1. 配置 Tomcat 的 `context.xml`** 在 `src/main/webapp/META-INF` 目录下创建 `context.xml`(若目录不存在需手动创建): ```xml <?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name="jdbc/myDataSource" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydb?useSSL=false" username="root" password="password" maxTotal="20" maxIdle="10" validationQuery="SELECT 1" /> </Context> ``` > **参数说明**: > - `name`:JNDI 名称(格式固定为 `jdbc/xxx`) > - `driverClassName`/`url`/`username`/`password`:数据库连接信息 > - `maxTotal`/`maxIdle`:连接池配置 --- ### **2. 排除默认数据源配置 Tomcat 支持 JNDI** 在 `pom.xml` 中排除默认数据源(如 HikariCP): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> </exclusion> </exclusions> </dependency> ``` --- ### **3. 创建 Tomcat 配置类** 通过 `TomcatServletWebServerFactory` 启用 JNDI: ```java @Configuration public class TomcatConfig { @Bean public TomcatServletWebServerFactory tomcatFactory() { return new TomcatServletWebServerFactory() { @Override protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) { // 启用 JNDI tomcat.enableNaming(); return super.getTomcatWebServer(tomcat); } @Override protected void postProcessContext(Context context) { // 绑定 JNDI 资源 ContextResource resource = new ContextResource(); resource.setName("jdbc/myDataSource"); resource.setType(DataSource.class.getName()); resource.setProperty("factory", "org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"); context.getNamingResources().addResource(resource); } }; } } ``` --- ### **4. 在 `application.properties` 中指定 JNDI 名称** ```properties spring.datasource.jndi-name=java:comp/env/jdbc/myDataSource ``` --- ### **5. 验证 JNDI 数据源** 注入 `DataSource` 并测试连接: ```java @SpringBootApplication public class DemoApp implements CommandLineRunner { @Resource private DataSource dataSource; // 注入 JNDI 数据源 public static void main(String[] args) { SpringApplication.run(DemoApp.class, args); } @Override public void run(String... args) throws Exception { try (Connection conn = dataSource.getConnection()) { System.out.println("JNDI 数据源连接成功!"); } } } ``` --- ### **关键问题排查** 1. **目录结构错误** `context.xml` 必须位于 `src/main/webapp/META-INF`(非 `resources` 目录)。 2. **未启用 Tomcat 命名服务** 配置类中必须调用 `tomcat.enableNaming()`。 3. **JNDI 名称格式** `spring.datasource.jndi-name` 需以 `java:comp/env/` 开头。 4. **依赖冲突** 确保排除了默认连接池(如 HikariCP)以避免冲突。 > **多环境优势**:通过 JNDI 解耦配置,只需在不同环境的 Tomcat 中修改数据源参数,无需重新编译代码 [^2]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值