首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JSP 連線池類別找不到錯誤排查:Tomcat 類載入機制與封裝部署實戰

     編輯:Java 相關知識

錯誤現場還原

package mybean does not exist
mybean.DBConnManager connManager = null;
...
connManager = (mybean.DBConnManager) pageContext.getAttribute(...)
...
connManager = (mybean.DBConnManager) Beans.instantiate(...)

錯誤核心:JSP 編譯產生的 Servlet 找不到 mybean 套件下的類別。

程式碼結構審視

兩個連線池類別均宣告 package mybean;:

  • DBConnPool:單一連線池實作(Vector 管理閒置連線、同步化取得/歸還、建立新連線、關閉所有)
  • DBConnManager:多連線池管理器(Vector/Hashtable 管理多組池配置,支援 Access、SQL Server、MySQL、Oracle 四種資料庫預設配置)

JSP 頁面:/shopping/index.jsp

根因分析:Tomcat 類載入與部署結構

標準 Web 應用目錄結構

webapps/
└── shopping/
    ├── index.jsp
    ├── WEB-INF/
    │   ├── web.xml
    │   ├── classes/
    │   │   └── mybean/
    │   │       ├── DBConnPool.class
    │   │       └── DBConnManager.class
    │   └── lib/          

常見部署錯誤

  1. 類別檔案未置於 WEB-INF/classes/mybean/,或目錄結構與 package 宣告不符
  2. 原始碼 .java 直接放置而非編譯後的 .class(JSP 容器不負責編譯 Java 類別)
  3. 未重新啟動應用導致類載入器未重新掃描
  4. 打包成 JAR 但未放入 WEB-INF/lib/

解決方案步驟

  1. 確認 DBConnPool.java、DBConnManager.java 已編譯為 .class
  2. 建立目錄:WEB-INF/classes/mybean/
  3. 複製兩個 .class 檔至該目錄
  4. 若使用 IDE,確認輸出路徑正確;若手動編譯:
    javac -d WEB-INF/classes DBConnPool.java DBConnManager.java
  5. 重新啟動 Tomcat 應用(或整個 Tomcat)
  6. 再次訪問 /shopping/index.jsp 驗證

進階建議:連線池最佳實踐

  • 生產環境建議使用成熟連線池:HikariCP、Druid、DBCP2、Tomcat JDBC Pool
  • 透過 web.xml 或 context.xml 設定 DataSource (JNDI),JSP 透過 InitialContext.lookup() 取得,解耦程式碼與配置
  • 關閉連線池時務必在 ServletContextListener.contextDestroyed() 中清理資源
  • 避免在 JSP 中直接實例化 Java 類別,改用 MVC 架構(Servlet/Controller + Service + DAO)

程式碼品質提醒

  • DBConnPool.getConnection() 遞迴呼叫自身處理已關閉連線,極端情況下可能導致堆疊溢位,建議改用迴圈
  • 硬編碼資料庫帳密(空字串)極不安全,應外部化配置
  • Vector、Hashtable 為舊式同步集合,高併發下效能不佳,建議改用 ConcurrentLinkedQueue + ConcurrentHashMap
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved