Mysql

如何在沒有 JNDI 數據源的情況下使用 JDBC 連接池?(在 Apache Tomcat 中)

  • September 24, 2021

我有一個 Apache Tomcat 7 伺服器。我有一個非常複雜的 Java Servlet 應用程序在其上執行,每個 POST 都需要一些 MySQL 查詢。因此我需要一個 MySQL 數據庫連接來進行查詢。目前我使用以下 Java 程式碼來創建數據源:

//db is for example: jdbc:mysql://127.0.0.1:3306/databasename
DataSource ds = new DataSource(initPoolProperties(db, user, pass));

private PoolProperties initPoolProperties(String db, String user, String pass)
{
   PoolProperties defaultPoolProperties = new PoolProperties();
   defaultPoolProperties.setUrl(db);
   defaultPoolProperties.setUsername(user);
   defaultPoolProperties.setPassword(pass);
   defaultPoolProperties.setDriverClassName("com.mysql.jdbc.Driver");
   // And a long list of properties here ...

   return defaultPoolProperties;
}

在我的整個分層 Java Servlet 應用程序中,我只為每個 POST 的每個數據庫連接創建一個數據源(通過 HTML 表單瀏覽網站)。在此之後,我使用了幾次ds.getConnection()來獲取執行一些 MySQL 查詢所需的連接。

每個人似乎都使用 JNDI 數據源。這意味著他們在其應用程序的 context.xml 中定義了一個標記,並使用 JNDI 查找來獲取數據源,並按照我的方式使用連接。

問題是我是否真的在這裡做同樣的事情。我使用的連接是否在多個訪問者/客戶之間匯集和共享?因為我的線上網站應用程序將被大量使用,並且一些頁麵包含相當繁重的 SQL 查詢。而且我不想冒一個人等待超過 0.01 秒載入頁面的風險。

我在這個網站上讀到了我這樣做的方式(如上面的小簡化程式碼範例所示):http: //tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html向下滾動一點,你會找到 Good ol’ Java 部分,我認為它與使用 . 相同,但我不確定。我如何確定我的應用程序使用連接池並在客戶端之間共享它們?

PS 我更喜歡使用 PoolProperties 而不是在 context.xml 中放置一些東西,因為我使用了在配置數據庫中定義的多個數據庫。選擇的數據庫取決於使用者。因此,我可以通過這種方式在 MySQL 管理程序中更輕鬆地維護數據庫,而不是在 context.xml 中放置大量程式碼。

如果您想在不使用 Tomcat 7 提供的內置功能的情況下進行池化,則必須自己管理(不推薦)或引入 c3p0 之類的第三方庫,不再推薦 DBCP:請參閱此處

在我看來,我將在 context.xml 中定義所有可能的數據源(從 Tomcat 7 JDBC 池中受益),我將在服務層中實現邏輯,以根據您的上下文選擇必須使用的數據源。Spring 框架對定義此類服務和 DAO 有很大幫助。

引用自:https://serverfault.com/questions/381302