tomcat配置jndi数据源

本文详细介绍了在Tomcat中通过修改server.xml文件全局配置数据库连接的方法,包括如何在<GlobalNamingResources>节点添加配置,以及如何在context.xml文件中链接数据库资源,并将Spring数据源配置改为使用JNDI查找方式。同时,提供了从全局数据库连接配置到Spring整合的完整步骤。



在tomcat中加全局数据库连接

server.xml文件修改 ,在<GlobalNamingResources>节点加下面红色字体的配置

<GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
   <!-- 注意jdbc/oracleCaodegao 这个要和context.xml配置一致-->
    <Resource acquireIncrement="2" acquireRetryAttempts="30" acquireRetryDelay="1000" auth="Container" breakAfterAcquireFailure="false" driverClass="oracle.jdbc.driver.OracleDriver" factory="org.apache.naming.factory.BeanFactory" idleConnectionTestPeriod="60" initialPoolSize="20" jdbcUrl="jdbc:oracle:thin:@服务器IP:1521:xe" maxIdleTime="7200" maxPoolSize="50" maxStatements="0" minPoolSize="20" name="jdbc/oracleCaodegao" password="密码" testConnectionOnCheckin="false" testConnectionOnCheckout="false" type="com.mchange.v2.c3p0.ComboPooledDataSource" user="用户名"/>
    
  </GlobalNamingResources>


context.xml这里加个配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- The contents of this file will be loaded for each web application --><Context>


    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->


    <!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) -->
    <!--
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
    -->
<ResourceLink name="jdbc/oracleCaodegao" global="jdbc/oracleCaodegao"  type="javax.sql.DataSource"/>
</Context>



最后一步,Spring数据源配置 改成下面的

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
          <property name="jndiName" value="java:comp/env/jdbc/oracleCaodegao" />
</bean>

以前的这些就不用了,注释掉

<!-- 
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="autoCommitOnClose" value="true" />
<property name="checkoutTimeout"
value="${cpool.checkoutTimeout}" />
<property name="initialPoolSize" value="${cpool.minPoolSize}" />
<property name="minPoolSize" value="${cpool.minPoolSize}" />
<property name="maxPoolSize" value="${cpool.maxPoolSize}" />
<property name="maxIdleTime" value="${cpool.maxIdleTime}" />
<property name="acquireIncrement"
value="${cpool.acquireIncrement}" />
<property name="maxIdleTimeExcessConnections"
value="${cpool.maxIdleTimeExcessConnections}" />
</bean>
-->


<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、付费专栏及课程。

余额充值