tomcat配置JNDI数据源

本文详细介绍了如何在项目中配置JNDI数据源,包括全局配置、web.xml配置及程序中调用数据源的方法,并指出配置文件中的常见错误及解决办法。

昨天在项目中配置了一下jndi数据源。从网上搜了好多文章,介绍配置方法。

全局是这种配置方法:

在tomcat的conf文件夹下,打开context.xml在里面加入如下节点:


	<Resource name="jndi/mybatis" 
				auth="Container" 
				type="javax.sql.DataSource" 
				driverClassName="com.mysql.jdbc.Driver" 
				url="jdbc:mysql://localhost:3306/appdb" 
				username="root" 
				password="123456" 
				maxActive="20" 
				maxIdle="10" 
				maxWait="10000"/>	


然后在web.xml配置文件中配置:

<resource-ref>
  <description>JNDI DataSource</description>
  <res-ref-name>jndi/mybatis</res-ref-name>
  <res-ref-type>javax.sql.DataSource</res-ref-type>
  <res-auth>Container</res-auth>
</resource-ref>

程序中调用:

	public void test() throws Exception{
		Context ctx = new InitialContext();
		DataSource ds = (DataSource) ctx.lookup("java:comp/env/jndi/mybatis");
		Connection conn = ds.getConnection();
		System.out.println(conn.isClosed());

	}

我在项目中使用的是这个方法,是使用工具类读取配置文件中的数据源进行使用的。我的配置是:

	<Resource name="jdbc/jysy" 
				auth="Container" 
				type="javax.sql.DataSource" 
				driverClassName="oracle.jdbc.driver.OracleDriver" 
				url="jdbc:oracle:thin:@10.12.1.89.111:orcl" 
				username="pro_test" 
				password="pro_test" 
				maxActive="20" 
				maxIdle="10" 
				maxWait="10000"/>


配置文件中写入的是这一句:

dataSource.jndiName=java:comp/env/jdbc/jysy


一开始没用过,因此我在写修改上述context.xml的时候,直接写了 :

name = "java:comp/env/jdbc/jysy" 然后启动就开始报错了。

排查到最后,发现是这个name错误, java:comp/evn 这句话的意思是:定义了一个javaee的环境变量。因此他不应该出现在resource节点的name中,在name中 只是写"jdbc/jysy"就够了。

<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]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值