首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Tomcat JNDI 資料庫連線池配置遺失問題排查與標準配置流程

     編輯:程式設計疑難解答

現象

SSH 專案使用 Tomcat 7,conf/context.xml 設定的 JNDI 資料源,啟動 Tomcat 後設定消失,導致資料庫連線失敗。

根本原因分析

  • MyEclipse / IDE 部署時可能覆寫 conf/context.xml(專案內 META-INF/context.xml 優先級較高)。
  • Tomcat 版本升級或伺服器重新安裝導致 conf/context.xml 重置。
  • 專案發布為 WAR 時未包含 META-INF/context.xml,且依賴伺服器全域設定,遷移環境時遺失。

標準 JNDI 配置三步驟

1. Tomcat 全域 conf/context.xml 定義 Resource

<Resource name="jdbc/MyDB"
          auth="Container"
          type="javax.sql.DataSource"
          maxTotal="100"
          maxIdle="30"
          maxWaitMillis="10000"
          username="dbuser"
          password="dbpass"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8"
          validationQuery="SELECT 1"
          testOnBorrow="true" />

2. Web 應用 web.xml 宣告 resource-ref

<resource-ref>
    <description>MySQL DataSource</description>
    <res-ref-name>jdbc/MyDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

3. 驅動程式 JAR 放入 tomcat/lib(或專案 WEB-INF/lib)

  • 推薦放 tomcat/lib:mysql-connector-java-5.1.x.jar(或 8.x)。
  • 若放專案內,需注意類別載入器隔離問題。

Spring 整合 JNDI

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/MyDB" />
    <property name="proxyInterface" value="javax.sql.DataSource" />
</bean>

避免設定遺失的最佳實踐

  1. 版本控管:將 conf/context.xml、web.xml、server.xml 納入專案 Git 管理(或 Dockerfile/Ansible 腳本)。
  2. 專案自帶 META-INF/context.xml:覆蓋全域設定,隨 WAR 部署,環境遷移零配置。
    <Context>
        <ResourceLink name="jdbc/MyDB" global="jdbc/MyDB" type="javax.sql.DataSource" />
    </Context>
    
  3. 使用 Docker/容器化:映像檔內建完整 Tomcat 設定,啟動即一致。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved