<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-72  評論-63  文章-0  trackbacks-0
    在部署 J2EE 應用程序中最耗時的操作之一就要數建立到數據庫的連接了。應用程序服務器通常提供連接高速緩存或者連接池以盡量減小這一任務所帶來的開銷。(盡管術語“連接高速緩存”和“連接池”在 JDBC 中有不同的含義,這里我們將借鑒這些術語。)

    在 Oracle Application Server Containers for J2EE 10g (OC4J) 9.0.4 中,根據數據源的類型采用了不同的連接高速緩存機制。然而,OC4J 10g 10.1.3 在數據源中引入了幾項關鍵改進,其中之一就是新的連接高速緩存機制。它是所有 Oracle 數據源的統一連接高速緩存機制,并提供集成的真正應用集群 (RAC) 故障切換支持。 該機制利用了 Oracle 數據庫 10g 的新 JDBC 連接高速緩存特性。(注意:OC4J 10g 10.0.3 最近改版為 10.1.3,而且下一個公開發行版將反映這一變化。這里對 10.1.3 版的所有引用對當前可用的 10.0.3 版也適用。)
    這篇技術說明提供了對這一新特性的詳細描述,并闡明了它在應用程序中的用法。


    OC4J 10g 10.1.3 數據源:概要

    OC4J 10g 10.1.3 已經簡化了數據源分類:現在只有兩種類型的數據源:受管理的數據源 和原生數據源。

    受管理的數據源是由 OC4J 管理的數據源。具體來講,受管理的數據源就是一個 OC4J 提供的 java.sql.DataSource 實現,充當 JDBC 驅動程序或數據源的繞接器。J2EE 組件通過 JNDI 訪問受管理的數據源,而還不知曉該數據源竟是一個繞接器。OC4J 為受管理的數據源提供關鍵的系統基礎架構,如全局事務管理、連接高速緩存、通過 JMX 的動態配置以及錯誤處理。

    原生數據源還實現了 java.sql.DataSource 接口,這些數據源由 JDBC 驅動程序供應商如 Oracle 和 DataDirect 提供。原生數據源根本不用 OC4J 繞接。

    下表歸納了受管理的和原生數據源之間的主要差異:
    受管理的數據源 原生數據源
    從數據源檢索到的連接可以參與全局事務 是


    數據源利用 OC4J 的連接池和語句高速緩存 是 否

    從通過一個 OC4J 連接代理繞接的數據源返回的連接 是 否



    連接高速緩存

    連接高速緩存(通常在中間層實現)允許在不同的應用程序間共享一個數據庫連接。 中間層維護著一個預先分配的物理數據庫連接池,應用程序可以使用這些連接來與數據庫服務器交互。 當應用程序請求數據庫連接時,中間層首先查看連接池中是否有符合該請求的可用連接;如果有,則中間層就返回其中的一個連接。


    當請求連接而連接高速緩存中沒有空閑的池連接實例時,則會創建新的池連接實例。 “空閑”的池連接實例是指該實例當前沒有與其相關的邏輯連接實例;換言之,就是指該池連接實例的物理連接沒有使用。

    當應用程序關閉此連接時,中間層就會把此連接送回到池中,從而避免在發生連接請求執行打開新數據庫連接這樣耗費大量資源的任務。
    高速緩存中的池連接都有一些連接特性或屬性(數據庫名、服務器名、端口號等等)。大多數連接高速緩存都包括一個連接池,其中包含用于同一數據庫和同一用戶名的一個或多個連接。

    OC4J 10g 10.1.3 數據源中的連接高速緩存
    OC4J 10g 10.1.3 數據源中的高速緩存利用了 Oracle 數據庫 10g JDBC 提供的所有新高速緩存特性 — 特別是新的隱式連接高速緩存中的特性。


    在 Oracle 數據庫 10g 之前,將 Oracle JDBC 的連接高速緩存接口命名為 OracleConnectionCache,而將其實現命名為 OracleConnectionCacheImpl。此高速緩存只為指定用戶名提供到特定數據庫的物理連接池的支持。在 Oracle 10g JDBC 中,不建議使用 OracleConnectionCache 接口和 OracleConnectionCacheImpl 類,從而向一個更強健的以性能為導向的體系結構轉變。設計了新的體系結構,這樣就可以將連接高速緩存透明地集成到數據源中。

    隱式連接高速緩存是數據源的一個新的符合 JDBC 3.0 的連接高速緩存實現。 它通過提供對高速緩存的透明訪問,不再需要應用程序開發人員編寫自己的高速緩存實現。 它還支持多用戶,并能基于用戶定義的屬性請求連接。

    隱式連接高速緩存影響著物理和邏輯連接的概念。 它使用標準 OracleDataSource API 來獲得連接,并在底層應用程序啟用高速緩存后處理連接緩存中的所有連接。物理連接是由數據庫返回的實際連接,而邏輯連接可以看作是高速緩存用于處理物理連接的句柄。

    隱式連接高速緩存還提供一個新類 — OracleConnectionCacheManager,這樣應用程序就可以使用其豐富的管理 API 組來有效地創建、管理和維護連接高速緩存。應用程序可以通過單個 OracleConnectionCacheManager 實例或者通過與高速緩存相關聯的 OracleDataSource 來管理它們的高速緩存。這些 API 廣泛應用于 OC4J 10g 10.1.3 中。

    還為用戶提供了一個回調機制來定義高速緩存行為和確定通過用戶定義的連接屬性檢索到的確切連接。

    新的連接高速緩存機制還包括集成的為 Oracle 數據庫提供的 RAC 故障切換支持。 它通過監聽數據庫生成的 UP/DOWN RAC 事件實現了與數據庫自身同步的快速、高效的連接高速緩存中連接的連接故障切換。事件發布/訂閱機制由 Oracle 通知服務 (ONS) 提供。此類支持只用于 RAC 數據庫,這是由于 RAC 數據庫支持所需故障切換事件的生成。

    與 OC4J 10g 10.1.3 數據源中的新連接高速緩存相關的一些好處包括:
    驅動程序獨立
    連接高速緩存的透明訪問
    每個緩存可以有多個用戶和多個口令
    符合 JDBC 3.0 標準
    連接回收與陳舊連接的刷新
    基于屬性搜索連接
    啟用多個緩存的數據源
    連接高速緩存回調機制
    集成的對 RAC 快速連接故障切換的支持。
    應用程序可以輕松地利用 OC4J 10g 10.1.3 數據源中的新連接高速緩存功能。 該應用程序只需配置數據源和其連接高速緩存,從該高速緩存獲得一個連接,使用該連接實現一些業務邏輯,并在使用后把該連接返回該高速緩存。應用程序還可以使用 OracleConnectionCacheManager 重新初始化一些連接屬性。基本上說,應用程序仍將像通常那樣使用數據源,如數據源設置和查找。 此外,應用程序將配置它們要使用的連接高速緩存。對于大部分應用程序,這一目標是通過對受管理的數據源及原生數據源的簡單配置屬性更改而聲明性實現的。對于由 Oracle 10g JDBC 提供的原生數據源,這也可以通過調用特定的連接高速緩存管理 API 以編程方式實現。 同樣值得注意的是,這些 API 就是 OC4J 在提供其自己的連接高速緩存時使用的 API。

    以聲明的方式配置連接高速緩存

    在 OC4J 10g 10.1.3 中,指定連接高速緩存屬性相對簡單一些。 對于大多數應用程序來說,此種指定是在 data-sources.xml 配置文件中聲明式完成的。

    受管理的數據源
    對于受管理的數據源,配置連接高速緩存可以分兩個步驟完成:

    使用 <connection-pool> XML 元素在 data-sources.xml 中添加一個連接高速緩存,指定其所需屬性的詳細信息。
    在同一文件中的每個 <managed-data-source> XML 元素中使用“connection-pool-name”屬性,指定這個受管理的數據源用于匯聚其連接的連接高速緩存的名稱。
    第 2 步相對簡單,因此我們集中看第 1 步。<connection-pool> 元素具有以下屬性(每個屬性都是可選的,除非標記為“必要”):

    屬性名稱 說明 默認值
    name (Required) The name of the connection pool; must be unique


    min-connections 連接池將維護的最小連接數
    0

    max-connections 在任何給定時間能夠打開的連接的最大數量。值為 0 或小于 0(表示沒有最高限制)。
    0

    initial-limit
    在初次創建或重新初始化高速緩存時設置連接高速緩存的大小。當將該屬性設置為大于 0 的值,則可以預先創建許多連接并可隨時使用。這個屬性通常用于在將緩存設為其最優大小時減少“加速”時間。
    0

    used-connection-wait-timeout
    等待客戶端釋放使用的連接所需的時間(秒)。該屬性只適用于已從數據源獲得了最大數量的連接且這些連接都在使用的情形。在這種情況下,當一個客戶端嘗試從連接池中借一個連接而所有連接都在使用中時,連接池將等待將一個連接釋放回池中。
    60

    inactivity-timeout
    將一個未使用的連接從連接池中移除前其不活動的時間(秒)
    60

    login-timeout
    此數據源在嘗試連接到一個數據庫時將等待的時間的最大值(秒)。值為零說明使用默認的系統超時(如果有的話,否則不會超時)。
    0

    connection-retry-interval
    在重試一個失敗的連接嘗試前等待的間隔(秒),與“max-connnect-attempts”一起使用
    1

    max-connect-attempts
    重試進行一個連接的次數,與“connection-retry-interval”一起使用
    3

    validate-connection 表明從連接池借用一個連接時是否根據數據庫對其進行驗證。值為“true”表明從連接池借用一個連接時,執行由“validate-connection-statement”聲明的語句來驗證此連接是否有效;值為“false”表明從連接池借用連接時不會執行任何語句。與“validate-connection-statement”一起使用。
    false

    validate-connection-statement
    從連接池借用連接時執行的 SQL 語句。與“validate-connection”一起使用。


    num-cached-statements 應該為每個連接緩存的最大語句數。任何大于 0 的值自動為數據源啟用語句緩存。
    0

    time-to-live-timeout
    一個使用的連接保持活動的最長時間(秒)。 當這個超時時,所使用的連接會無條件地關閉,取消相關語句句柄,并將此連接返回連接池。值為 –1 表示這個特性沒有啟用。
    -1

    abandoned-connection-timeout
    只適用于 Oracle 數據庫。abandoned-connection-timeout 與 inactivity-timeout 類似,但是前者用在邏輯連接上。在設置了該屬性時,JDBC 監視這個邏輯連接(由用戶從高速緩存借來的連接)上的 SQL 數據庫活動。例如,當在此連接上調用 stmt.execute() 時,會注冊一個檢測信號 (heart beat) 以表示這個連接是活動的。只監視導致數據庫執行調用的地方的檢測信號以降低監視成本。如果一個連接不活動時間已達到某一指定值,則將底層的 PooledConnection 回收并返回緩存以重新使用。默認值為 -1,即這個特性未生效。
    -1

    disable-server-connection-pooling
    確定是否禁用應用服務器的連接池。之所以提供這個屬性是因為一些 JDBC 驅動程序本身就提供了連接池。如果 JDBC 驅動程序是 Oracle 且驅動程序正在使用隱式連接高速緩存,則忽略這個屬性。
    false

    property-check-interval
    只適用于 Oracle 數據庫。高速緩存后臺程序線程執行超時限制的時間間隔(秒)。
    900

    lower-threshold-limit
    只適用于 Oracle 數據庫。連接池上較低的閾值限制。默認為 max-connections 的 20%。
    20%


    除了上面的屬性,每個 <connection-pool> 元素都必須包含一個 <connection-factory> 元素,該元素定義用于為連接池創建連接的連接工廠 (connection factory)。它有如下屬性(每個屬性都是可選的,除非標記為“必要”):
    屬性名稱 說明 默認值
    factory-class (必要)定義連接工廠 (connection-factory) 實現的全路徑類。它必須是 java.sql.Driver、javax.sql.DataSource、javax.sql.ConnectionPoolDataSource 或 javax.sql.XADataSource 的一個實現。


    url (必要)用來連接底層數據庫的 url


    user 用來連接數據庫的默認用戶

    password
    用來連接數據庫的默認口令


    login-timeout
    嘗試連接數據庫時等待的最長時間(秒)。值為零表示此超時使用默認的系統超時(如果有的話),否則不會超時。
    0


    現在我們來看一些具體的例子:


    使用 XADataSource 連接工廠的受管理數據源


    <managed-data-source
    jndi-name="jdbc/ManagedXADS"
    description="Managed DataSource"
    connection-pool-name="myConnectionPool"
    name="ManagedXADS"/>

    <connection-pool
    name="myConnectionPool"
    min-connections="10"
    max-connections="30"
    inactivity-timeout="30"
    <connection-factory
    factory-class="oracle.jdbc.xa.client.OracleXADataSource"
    user="scott"
    password="tiger"
    url="jdbc:oracle:thin:@localhost:1521:oracle"/>
    <property name="nativeXA" value="true"/>
    </connection-factory>
    <!- <connection-pool> ?
    ????????
    使用 DataSource 連接工廠的受管理數據源

    <managed-data-source
    jndi-name="jdbc/ManagedDS" description="Managed DataSource"> connection-pool-name="myConnectionPool" name="ManagedDS"/>

    <connection-pool
    name="myConnectionPool"
    min-connections="10"
    max-connections="30"
    inactivity-timeout="30"
    <connection-factory
    factory-class="oracle.jdbc.pool.OracleDataSource"
    user="scott"
    password="tiger"
    url="jdbc:oracle:thin:@localhost:1521:oracle"/>
    <property name="loginTimeout" value="30"/>
    </connection-factory>
    <!- <connection-pool> ?

    原生數據源
    對于原生 Oracle 數據源,配置連接高速緩存主要是以編程的方式完成。(更多詳細信息參見接下來的部分。) 連接緩存的聲明式配置也可分兩個步驟完成:

    將“oracle.jdbc.pool.OracleDataSource”用作 data-sources.xml 中每個 <native-data-source> XML 元素的“data-source-class”屬性的值。這就是在 Oracle 10g JDBC 驅動程序中進行隱式連接高速緩存時的數據源實現。
    在 <native-data-source> 內的 <property> 元素中指定任何緩存特有的屬性來控制連接高速緩存的行為。
    對于第 2 步,下列屬性名稱可用于 <property> 元素的指定:
    名稱 類型 說明
    connectionCacheName String 高速緩存的名稱;一旦創建則無法更改。
    connectionCachingEnabled Boolean 是否啟用隱式連接高速緩存
    fastConnectionFailoverEnabled Boolean 是否啟用 RAC 快速連接故障切換

    下面是一個具體的例子:

    <native-data-source
    name="nativeDataSource"
    jndi-name="jdbc/nativeDS"
    description="Native DataSource"
    data-source-class="oracle.jdbc.pool.OracleDataSource"
    user="scott"
    password="tiger"
    url="jdbc:oracle:thin:@localhost:1521:oracle">
    <property name="connectionCacheName" value="ICC1"/>
    <property name="connectionCachingEnabled" value="true"/>
    <property name="fastConnectionFailoverEnabled" value="false"/>
    </native-data-source>

    以編程方式配置連接高速緩存

    受管理的數據源

    在使用受管理的數據源時,連接高速緩存是通過數據源配置文件以聲明的方式指定的。 這在“以聲明的方式配置連接高速緩存”中有詳細說明。

    原生數據源

    對于 Oracle 10g JDBC 提供的原生數據源,應用程序有附加的選項來以編程方式配置連接高速緩存。由于高速緩存是 OC4J 10g 10.1.3 統一的 Oracle 數據源,從而使它并不比聲明式方法難。 有了這個選項,應用程序又有了兩種利用連接高速緩存的方法:(1) 依賴于 OracleDataSource 中的隱式連接高速緩存行為,并在數據源上設置連接高速緩存屬性;(2) 直接使用連接高速緩存管理器 OracleConnectionCacheManager API。

    對于 (1),OracleDataSource 類為連接高速緩存屬性提供下列 setter() 和 getter() 方法:
    String getConnectionCacheName()
    void setConnectionCacheName(String cacheName)
    java.util.Properties getConnectionCacheProperties()
    void setConnectionCacheProperties(java.util.Properties cp)
    這里的每個連接高速緩存屬性對應“以聲明的方式配置連接高速緩存”中的受管理數據源情況下的一個配置屬性 — 盡管真正的屬性名稱可能略有不同。

    資源


    OC4J 10g 10.0.3 開發人員預覽版 2
    OC4J 10g (10.0.3) 開發人員預覽版 2 已通過了 J2EE 1.4 兼容性組合測試,正式兼容 J2EE 1.4。僅用于測試與開發!

    Oracle 10g JDBC 驅動程序
    在 Oracle 10g JDBC 中,JDBC Thin、OCI 和服務器端內部驅動程序已經徹底重新調整了結構以提高性能。包括 JDBC 3.0 和 J2EE 1.3 標準特性支持。

    Oracle 10g JDBC 示例代碼
    Oracle 10g JDBC 示例演示 JDBC 3.0 規范中引入的各種新特性的使用。

    Oracle 數據庫 10g JDBC 開發人員指南與參考
    Oracle 數據庫 10g JDBC 開發人員指南與參考 專門為基于 JDBC 的應用程序和小程序的開發人員而準備。

    保持連接:使用隱式連接高速緩存進行透明的高速緩存訪問 作者:Kuassi Mensah


    對于 (2),OracleConnectionManager 提供了應用程序可用于管理可用連接高速緩存的 API。 以下是其中的一些 API。(關于 (1) 和 (2) 的更多詳細信息,請參考 Oracle 數據庫 10g JDBC 開發人員指南與參考。)
    static OracleConnectionCacheManager getCacheManagerInstance()
    void createCache(String cacheName, javax.sql.DataSource ds, Properties cacheProperties)
    String createCache(javax.sql.DataSource ds, Properties cacheProperties)
    void removeCache(String cacheName, int mode)
    void refreshCache(String cacheName, int mode)
    java.util.properties getCacheProperties(String cacheName)
    下面的 configureDataSource 方法顯示了與高速緩存相關聯的 OracleDataSource 的一般設置。它用主機名稱、用戶名稱、密碼等的相應值配置 Datasource。它還加載一些存儲在 Connection.properties 文件中的連接屬性:

    private void configDataSource(OracleDataSource ods) {
    ......
    /* Load the properties file to get the connection properties??
    * from the Connection.properties file
    */
    Properties prop = this.loadParams("Connection");
    ods.setDriverType("thin");
    ods.setHostName("localhost");
    ods.setNetworkProtocol("tcp");
    ods.setPortNumber?? (1521);
    ods.setUser("scott");
    ods.setPassword("tiger");
    ods.setServiceName("oracle");
    ods.setConnectionProperties(prop);
    ......
    }??

    下面的代碼演示上面的方法 (1)。 方法 initializeConnectionCacheDataSrc 啟用連接高速緩存,并且設置了高速緩存的名稱,該名稱唯一地標識該連接高速緩存。然后它在 OracleDataSource 上設置一些連接高速緩存屬性,這些屬性將被傳遞給高速緩存。
    private void configCachingInDataSource(OracleDataSource ods)
    throws SQLException
    {
    ??......
    ods.setConnectionCachingEnabled(true);??// Enable caching
    ods.setConnectionCacheName(CACHE_NAME); // Set the cache name??

    Properties cacheProperties = new Properties();

    cacheProperties.setProperty("MinLimit", "1");?? // Set Min Limit for the Cache
    cacheProperties.setProperty("MaxLimit", "15");??// Set Max Limit for the Cache
    cacheProperties.setProperty("InitialLimit", "10");????// Set the Initial Limit??

    ods.setConnectionCacheProperties(cacheProperties);

    }

    下面的代碼演示上面的方法 (2):如何使用 OracleConnectionCacheManager 創建一個連接高速緩存。 createCache 方法用于創建高速緩存,同時用于接收 OracleDataSource 高速緩存名稱和高速緩存 Properties 對象。 請注意,連接高速緩存屬性是在創建連接高速緩存時設置的:
    private void initializeConnectionCache() throws Exception {
    ??..............

    OracleDataSource ods = new OracleDataSource();

    this.configureDataSource(ods);
    ods.setConnectionCachingEnabled(true);??// Enable caching

    // Initialize the Connection Cache
    OracleConnectionCacheManager connMgr =
    OracleConnectionCacheManager.getConnectionCacheManagerInstance();
    ??
    /* This object holds the properties of a cache and is passed to the
    * ConnectionCacheManager while creating the cache.
    ?? */
    Properties cacheProperties = new Properties();

    cacheProperties.setProperty("MinLimit", "1");?? // Set Min Limit for the Cache
    cacheProperties.setProperty("MaxLimit", "15");??// Set Max Limit for the Cache
    cacheProperties.setProperty("InitialLimit", "10");????// Set the Initial Limit??

    /* Create the cache by passing the cache name, data source and the
    * cache properties
    ?? */
    connMgr.createCache(CACHE_NAME, ods, properties);

    總結
    數據庫連接高速緩存是 Oracle 應用服務器一個功能強大的部分。有了 Oracle 數據庫 10g 簡化的數據源配置和集成的連接高速緩存管理,OC4J 10g 10.1.3 為構建分布式 J2EE 應用程序提供了一個可伸縮的平臺。
    posted on 2006-06-24 20:24 船長 閱讀(625) 評論(0)  編輯  收藏 所屬分類: J2EE
    主站蜘蛛池模板: 亚洲无线一二三四区手机| 性感美女视频在线观看免费精品 | 婷婷亚洲久悠悠色悠在线播放| 五级黄18以上免费看| 国产亚洲精品精品国产亚洲综合| 一级女性全黄久久生活片免费| 亚洲人成网站观看在线播放| 男女猛烈激情xx00免费视频| 国产啪亚洲国产精品无码| AAAAA级少妇高潮大片免费看| 亚洲av伊人久久综合密臀性色| 一个人免费视频观看在线www| 亚洲AV无码专区电影在线观看| 一级毛片**不卡免费播| 中文字幕亚洲免费无线观看日本| 57pao一国产成永久免费| 亚洲天堂2017无码中文| 可以免费观看一级毛片黄a| 日韩在线一区二区三区免费视频| 亚洲人成色7777在线观看| 久久永久免费人妻精品下载| 亚洲AV成人一区二区三区在线看| 国产亚洲精品免费| 青青草原1769久久免费播放| 亚洲一级高清在线中文字幕| 免费观看国产精品| 污视频在线观看免费| jiz zz在亚洲| 亚洲精品无码久久一线| 美女网站免费福利视频| 免费人成网站永久| 久久精品国产亚洲AV高清热| 精品剧情v国产在免费线观看| 国产黄色片免费看| 亚洲youjizz| 久久久无码精品亚洲日韩软件| 日本免费中文视频| 亚洲av无码专区青青草原| 亚洲国产精品无码久久久秋霞2| 国产精品久久久久免费a∨| 亚洲精品视频免费|