JDBC數據源 使用JNDI連接池實現數據庫的連接



0.引言

許多Web應用程序需要通過JDBC驅動程序訪問數據庫,以支持該應用程序所需的功能。Java EE平台規范要求Java EE應用程序服務器為此目的提供一個DataSource實現(即,用於JDBC連接的連接池)。Tomcat提供了完全相同的支持,因此使用此服務在Tomcat上開發的基於數據庫的應用程序將在任何Java EE服務器上保持不變。

有關JDBC的信息,請參考以下內容:

 - Tomcat中的默認數據源支持基於Commons 項目中的DBCP連接池 。然而,也可以使用實現任何其他連接池,通過編寫自己的自定義資源工廠,描述 如下javax.sql.DataSource

1.安裝JDBC驅動程序

使用JDBC數據源 JNDI資源工廠要求您為Tomcat內部類和Web應用程序提供適當的JDBC驅動程序。這很容易通過將驅動程序的JAR文件安裝到 WEB-INF/lib目錄中來完成,這使得驅動程序既可用於資源工廠,也可用於您的應用程序。

2.聲明您的資源要求

接下來,修改Web應用程序部署描述符(/WEB-INF/web.xml)以聲明JNDI名稱,您將在其中查找預配置的數據源。按照慣例,所有這樣的名字都應該解析為jdbc子上下文(相對於作為java:comp/env所有提供的資源工廠的根的標准命名上下文來說,典型的web.xml入口可能是這樣的:

 

 
<!--官網配置內容-->

<resource-ref>
  <description>
    Resource reference to a factory for java.sql.Connection
    instances that may be used for talking to a particular
    database that is configured in the <Context>
    configuration for the web application.
  </description>
  <res-ref-name>
    jdbc/EmployeeDB
  </res-ref-name>
  <res-type>
    javax.sql.DataSource
  </res-type>
  <res-auth>
    Container
  </res-auth>
</resource-ref>

<!--下面是我自己MySQL的配置內容-->
<resource-ref>
<description>
使用DataSource為jdbc/news創建新的數據源
</description>
<res-ref-name>
jdbc/news
</res-ref-name>
<res-type>
javax.sql.DataSource
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref>

 

警告 - 請確保您遵守DTD為Web應用程序部署描述符所需的元素排序!有關詳細信息,請參閱 Servlet規范

3.編寫你的應用程序使用這個資源

此資源引用的典型用法可能如下所示:

//獲取Context實例
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env/jdbn/news");  //java:comp/env/名后加上你自己的命名
 
         
DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB"); //這樣直接就可以獲得了數據庫連接了 
Connection conn = ds.getConnection(); ... use this connection to access the database ... conn.close();

 

 

請注意,應用程序使用在Web應用程序部署描述符中聲明的相同的資源引用名稱。這與<Context>Web應用程序的元素中配置的資源工廠相匹配, 如下所述。

4.配置Tomcat的資源工廠

要配置Tomcat的資源工廠,請將這樣的元素添加到<Context>Web應用程序的 元素中。

<!--官網配置內容-->


<Context ...>
  ...
  <Resource name="jdbc/EmployeeDB"
            auth="Container"
            type="javax.sql.DataSource"
            username="dbusername"
            password="dbpassword"
            driverClassName="org.hsql.jdbcDriver"
            url="jdbc:HypersonicSQL:database"
            maxActive="8"
            maxIdle="4"/>
  ...
</Context>

<!--下面是我自己的MySQL配置內容-->
<Resource name="jdbc/news"
      auth="Container"
      type="javax.sql.DataSource"
      username="root"
      password="1992121niu"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/news"
      maxActive="100"
      maxIdle="30"
      maxWaite="10000"/>

 

 

 

 

 

請注意,資源名稱(此處jdbc/EmployeeDB)必須與Web應用程序部署描述符中指定的值相匹配。

此示例假定您正在使用HypersonicSQL(我使用的是MySQL數據庫)數據庫JDBC驅動程序。自定義driverClassName和 driverName參數以匹配您的實際數據庫的JDBC驅動程序和連接URL。

Tomcat標准數據源資源工廠(org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory)的配置屬性如下所示:

  • driverClassName - 要使用的JDBC驅動程序的完全限定Java類名稱。

  • username - 要傳遞給我們的JDBC驅動程序的數據庫用戶名。

  • password - 數據庫密碼被傳遞給我們的JDBC驅動程序。

  • url - 要傳遞給我們的JDBC驅動程序的連接URL。(為了向后兼容,該屬性driverName 也被認可。)

  • initialSize - 池初始化期間將在池中創建的初始連接數。默認值:0

  • maxActive - 可同時從該池中分配的最大連接數。默認:8

  • minIdle - 同時在此池中閑置的最少連接數。默認值:0

  • maxIdle - 可同時在此池中閑置的最大連接數。默認:8

  • maxWait - 池在拋出異常之前等待的最大毫秒數(當沒有可用的連接時)。默認值:-1(無限)

一些額外的屬性處理連接驗證:

  • validationQuery - SQL查詢,可以在池返回到應用程序之前用於驗證連接。如果指定,這個查詢必須是一個返回至少一行的SQL SELECT語句。

  • validationQueryTimeout - 驗證查詢返回的超時秒數。默認值:-1(無限)

  • testOnBorrow - true或false:每次從池中借用驗證查詢是否驗證連接。默認值:true

  • testOnReturn - true或false:是否每次將連接返回到池時使用驗證查詢驗證連接。默認:false

可選的evictor線程負責通過移除任何長時間處於空閑狀態的連接來縮小池。退伍軍人不尊重minIdle。請注意,如果您只希望池根據配置的maxIdle屬性收縮,則不需要激活evictor線程。

evictor在默認情況下是禁用的,可以使用以下屬性進行配置:

  • timeBetweenEvictionRunsMillis - 逐出器連續運行之間的毫秒數。默認值:-1(禁用)

  • numTestsPerEvictionRun - 在逐出器的每次運行期間將由檢出器檢查空閑的連接數。默認:3

  • minEvictableIdleTimeMillis - 以秒為單位的空閑時間,在該時間之后,可以通過逐出器從池中刪除連接。默認值:30 * 60 * 1000(30分鍾)

  • testWhileIdle - true或者false:連接是否應該由evictor線程在池中閑置時使用驗證查詢進行驗證。默認:false

另一個可選功能是刪除廢棄的連接。如果應用程序長時間未將其返回到池,則稱該連接被放棄。游泳池可以自動關閉此類連接並將其從游泳池中移除。這是泄露連接的應用程序的解決方法。

放棄功能默認是禁用的,可以使用以下屬性進行配置:

  • removeAbandoned - true或false:是否從池中刪除放棄的連接。默認:false

  • removeAbandonedTimeout - 假定借用連接被放棄的秒數。默認值:300

  • logAbandoned - true或false:是否為放棄語句或連接的應用程序代碼記錄堆棧跟蹤。這增加了嚴重的開銷。默認:false

最后有各種屬性可以進一步調整池的行為:

  • defaultAutoCommit - true或false:由此池創建的連接的默認自動提交狀態。默認值:true

  • defaultReadOnly - true或false:由此池創建的連接的默認只讀狀態。默認:false

  • defaultTransactionIsolation - 這設置默認事務隔離級別。可以是一個 NONEREAD_COMMITTED, READ_UNCOMMITTEDREPEATABLE_READSERIALIZABLE。默認:沒有默認設置

  • poolPreparedStatements - true或false:是否要池PreparedStatements和CallableStatements。默認:false

  • maxOpenPreparedStatements - 可以從語句池同時分配的最大打開語句數。默認值:-1(無限制)

  • defaultCatalog - 默認目錄的名稱。默認:未設置

  • connectionInitSqls - 在創建連接后運行一次SQL語句。用分號(;)分隔多個語句。默認:沒有語句

  • connectionProperties - 傳遞給驅動程序以創建連接的驅動程序特定屬性的列表。每個屬性都給定為name=value,多個屬性用分號(;)分隔。默認值:沒有屬性

  • accessToUnderlyingConnectionAllowed - true或false:是否允許訪問基礎連接。默認:false

*Myeclipes下使用

  在myeclipes下使用可以不用配置web.xml直接將context.xml放入WebRoot的META-INF文件即可

  如圖:

                 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM