自定義PROXOOL監聽器整合SSH框架

文檔內容可以通過以下URL  下載:

    http://download.csdn.net/detail/attagain/5535283

B/S結構應用系統的建設,必然會遇到SSH的整合問題。使用PROXOOL配置數據庫連接池時,                                
相信都會爲連接池Servlet和Spring的啓動順序而煩惱。                                  
  首先,需要說明一下SSH架構,以及各個部分的分工。SSH架構是符合MVC模型的:Struts2,                                
承擔着控制器(Controller)的角色;Spring,則承擔着數據模型(Model)的角色,主要處理                                  
業務邏輯工作;Hibernate,則承擔着數據模型的延伸,持久層的數據處理角色。明白這些關係,                                  
接下來也就方便說明,SSH之間的邏輯處理關係,從而方便理清依賴關係。                                  
  Struts2和Spring的整合,藉助於struts2-spring-plugin-*.jar工具,要求Spring必須                                
以listener的方式加載;proxool方式配置數據庫連接池,比較常用的方式是,使用Servlet方式                                  
啓動;Web服務啓動依賴於Web.xml,按照類型加載啓動順序是,context-param、listener、                                  
filter、servlet;Spring依賴於數據庫連接池,因此,數據庫連接池需要先於Spring啓動。                                  
  如果,數據庫連接池採用傳統的Servlet方式,Spring採用listener方式,則必然存在啓                                
動加載順序的異常信息。事實證明,確實如此,Web服務啓動時,報出如下異常信息:                                  
java.sql.SQLException: org.logicalcobwebs.proxool.ProxoolException: Attempt to                                  
refer to a unregistered pool by its alias ‘Develop’。                                  
  從根本上解決此問題的方法是,讓數據庫連接池優先於Spring啓動。Spring必須以listener                                
方式啓動,Web服務啓動的最優順序也是listener方式。因此,我們的數據庫也必須以listener                                  
方式啓動,並且要放在Spring之前。                                  
  目前使用的proxool-0.9.1.jar,還沒有現成的listener類,所以,我們必須建立自己的                                
proxool監聽類。爲了實現該功能,本人蔘考了proxool源程序                                  
org.logicalcobwebs.proxool.configuration.ServletConfigurator,經過簡單改造,最終                                  
實現所要求功能。由於,線程池管理工具,只是普通的Servlet程序,一次也沒有改裝成listener                                  
的必要。基於此,接下來是本人圍繞proxool,整合SSH的具體步驟。                                  
                                  
  1、proxool官網,下載最新的proxool-0.9.1.jar                                
  官網下載URL:                                
  jar包下載                                
http://sourceforge.net/projects/proxool/files/proxool/0.9.1/proxool-0.9.1.zip/download                                  
  源碼下載                                
http://sourceforge.net/projects/proxool/files/proxool/0.9.1/proxool-0.9.1-source.zip/download                                  
                                  
  2、創建獨立的proxool.xml文件,同時存在Web的WEB-INF目錄下,根據自己的數據庫類型,                                
填寫不同的數據庫驅動信息及具體配置信息,本文以oracle爲例。                                  
  <?xml version="1.0" encoding="utf-8"?>                                
  <something-else-entirely>                                
   <!-- 開發環境配置 -->                               
   <proxool>                               
    <!-- 數據源別名 -->                              
    <alias>Develop</alias>                              
    <!-- 數據庫驅動 -->                              
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>                              
    <!-- 數據庫連接URL -->                              
    <driver-url>                              
     <!-- 開發環境配置 -->                             
     jdbc:oracle:thin:@127.0.0.1:1521:orcl                             
    </driver-url>                              
    <!-- 用戶驗證權限 -->                              
    <driver-properties>                              
     <!-- 用戶名 -->                             
     <property name="user" value="數據庫用戶名" />                             
     <!-- 密碼 -->                             
     <property name="password" value="數據庫登錄密碼" />                             
    </driver-properties>                              
    <!-- 最小連接數(默認2個) -->                              
    <minimum-connection-count>20</minimum-connection-count>                              
    <!-- 最大連接數(默認5個),超過了這個連接數,再有請求時,就排在隊列中等候 -->                              
    <maximum-connection-count>150</maximum-connection-count>                              
    <!-- 一個連接的最長活動時間4小時,單位毫秒 -->                              
    <maximum-connection-lifetime>14400000</maximum-connection-lifetime>                              
    <!--自動偵察各個連接狀態的時間間隔(毫秒),偵察到空閒的連接就馬上回收,超時的銷燬 默認30秒-->                              
    <house-keeping-sleep-time>90000</house-keeping-sleep-time>                              
    <!--最少保持的空閒連接數(默認2個)-->                              
    <prototype-count>5</prototype-count>                              
    <!--在使用之前測試-->                              
    <test-before-use>true</test-before-use>                              
    <!-- 用於保持連接的測試語句 -->                              
    <house-keeping-test-sql>                              
     SELECT 1 FROM DUAL                             
    </house-keeping-test-sql>                              
    <!-- 如果爲true,那麼每個被執行的SQL語句將會在執行期被log記錄(DEBUG LEVEL) -->                              
    <trace>true</trace>                              
    <verbose>true</verbose>                              
   </proxool>                               
  </something-else-entirely>                                
                                  
  3、創建自定義數據庫連接池監聽                                
                                  
  package com.jlinfo.framework;                                
                                  
  import java.io.File;                                
  import java.util.Enumeration;                                
  import java.util.Properties;                                
                                  
  import javax.servlet.ServletContext;                                
  import javax.servlet.ServletContextEvent;                                
  import javax.servlet.ServletContextListener;                                
                                  
  import org.apache.commons.logging.Log;                                
  import org.apache.commons.logging.LogFactory;                                
  import org.logicalcobwebs.proxool.ProxoolException;                                
  import org.logicalcobwebs.proxool.ProxoolFacade;                                
  import org.logicalcobwebs.proxool.configuration.JAXPConfigurator;                                
  import org.logicalcobwebs.proxool.configuration.PropertyConfigurator;                                
                                  
  /**                                
   * <b>Function Name:</b>系統框架_數據庫連接池監聽器。<br>                                
   * <b>History:</b>2013/05/10 attagain create<br>                                
   * <br>                                
   *                                 
   * @author attagain                                
   * @version 1.0.0 2013/05/10                                
   */                                
  public class DbPoolProxoolListener implements ServletContextListener {                                
   /**                               
    * LOG輸出對象                               
    */                               
   private static final Log LOG = LogFactory                               
     .getLog(DbPoolProxoolListener.class);                             
   /**                               
    * 上下文參數_xmlFile(XML文件)                               
    */                               
   private static final String CONTEXT_PARAM_XMLFILE = "xmlFile";                               
   /**                               
    * 上下文參數_propertyFile(屬性配置文件)                               
    */                               
   private static final String CONTEXT_PARAM_PROPERTYFILE = "propertyFile";                               
   /**                               
    * 上下文參數_autoShutdown(自動關閉)                               
    */                               
   private static final String AUTO_SHUTDOWN_PROPERTY = "autoShutdown";                               
   /**                               
    * 數據庫屬性前綴                               
    */                               
   private static final String PREFIX_JDBC = "jdbc";                               
   /**                               
    * Servlet上下路徑_根                               
    */                               
   private static final String SERVLET_PATH_ROOT = "/";                               
   /**                               
    * 自動退出                               
    */                               
   private boolean autoShutdown = true;                               
                                  
   /**                               
    * 數據庫連接池監聽初始化。<br>                               
    *                                
    * @param servletContextEvent                               
    *            servlet上下文事件參數對象                               
    */                               
   public void contextInitialized(ServletContextEvent servletContextEvent) {                               
    // 獲取Servlet上下文對象                              
    ServletContext context = servletContextEvent.getServletContext();                              
    // 獲取Servlet上下文根的絕對路徑                              
    String appDir = servletContextEvent.getServletContext().getRealPath(                              
      SERVLET_PATH_ROOT);                            
    // 定義屬性配置信息對象                              
    Properties properties = new Properties();                              
                                  
    // 獲取上下文初始化參數集合                              
    Enumeration<?> names = context.getInitParameterNames();                              
                                  
    // 逐個循環處理上下文參數信息                              
    while (names.hasMoreElements()) {                              
     // 獲取參數名                             
     String name = names.nextElement().toString();                             
     // 根據參數名,獲取參數值                             
     String value = context.getInitParameter(name);                             
                                  
     if (CONTEXT_PARAM_XMLFILE.equals(name)) {                             
      // XML配置的情況                            
                                  
      try {                            
       // 獲取配置文件句柄                           
       File file = new File(value);                           
                                  
       if (file.isAbsolute()) {                           
        // 相對路徑                          
        JAXPConfigurator.configure(value, false);                          
       } else {                           
        // 絕對路徑                          
        JAXPConfigurator.configure(appDir + File.separator                          
          + value, false);                        
       }                           
      } catch (ProxoolException e) {                            
       LOG.error("Problem configuring " + value, e);                           
      }                            
     } else if (CONTEXT_PARAM_PROPERTYFILE.equals(name)) {                             
      // 屬性文件配置的情況                            
                                  
      try {                            
       // 獲取配置文件句柄                           
       File file = new File(value);                           
                                  
       if (file.isAbsolute()) {                           
        // 相對路徑                          
        PropertyConfigurator.configure(value);                          
       } else {                           
        // 絕對路徑                          
        PropertyConfigurator.configure(appDir + File.separator                          
          + value);                        
       }                           
      } catch (ProxoolException e) {                            
       LOG.error("Problem configuring " + value, e);                           
      }                            
     } else if (AUTO_SHUTDOWN_PROPERTY.equals(name)) {                             
      // 自動關閉的情況                            
      autoShutdown = Boolean.valueOf(value).booleanValue();                            
     } else if (PREFIX_JDBC.startsWith(name)) {                             
      // 其他情況(JDBC開頭的字符)                            
      properties.setProperty(name, value);                            
     }                             
    }                              
                                  
    if (properties.size() > 0) {                              
     // 自定義屬性存在的情況                             
     try {                             
      // 配置自定屬性                            
      PropertyConfigurator.configure(properties);                            
     } catch (ProxoolException e) {                             
      LOG.error("Problem configuring using init properties", e);                            
     }                             
    }                              
   }                               
                                  
   /**                               
    * 數據庫連接池監聽銷燬。<br>                               
    *                                
    * @param servletContextEvent                               
    *            servlet上下文事件參數對象                               
    */                               
   public void contextDestroyed(ServletContextEvent servletContextEvent) {                               
    if (this.autoShutdown) {                              
     ProxoolFacade.shutdown(0);                             
    }                              
   }                               
  }                                
                                  
  4、整合Struts2、Spring和proxool,配置Web服務啓動配置文件[web.xml]                                
   4.1、開始的位置,配置數據庫連接池監聽,確保第一時間啓動;接着配置數據庫連接池管理Servlet。                               
                                  
    <!-- 對PROXOOL進行配置 -->                                
    <!-- 線程池監聽啓動參數 -->                                
    <context-param>                                
      <param-name>xmlFile</param-name>                                
      <param-value>WEB-INF/proxool.xml</param-value>                                
    </context-param>                                
    <!-- 線程池監聽 -->                                
    <listener>                                
      <listener-class>com.jlinfo.framework.DbPoolProxoolListener</listener-class>                                
    </listener>                                
    <!-- 線程池管理Servlet -->                                
    <servlet>                                
      <servlet-name>AdminP</servlet-name>                                
      <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>                                
    </servlet>                                
    <servlet-mapping>                                
      <servlet-name>AdminP</servlet-name>                                
      <url-pattern>/AdminP</url-pattern>                                
    </servlet-mapping>                                
                                  
   4.2、接下來配置Spring監聽                               
                                  
    <!-- 對spring進行配置 -->                                
    <listener>                                
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>                                
    </listener>                                
                                  
  5、整合Spring和proxool,配置應用上下文配置文件[applicationContext.xml]                                
   5.1、配置數據源bean                               
                                  
    <!-- 數據庫配置 -->                                
    <!-- PROXOOL 設置 -->                                
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">                                
        <property name="driverClassName" value="org.logicalcobwebs.proxool.ProxoolDriver" />                                
        <property name="url" value="proxool.Develop" />                                
    </bean>                                
                                  
    <!-- 持久層配置 -->                                
    <bean id="sessionFactory"                                
          class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">                                
      <property name="dataSource"                                
                ref="dataSource" />                                
      <property name="hibernateProperties">                                
        <props>                                
          <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>                                
          <prop key="hibernate.show_sql">false</prop>                                
        </props>                                
      </property>                                
      <property name="mappingResources">                                
        <list>                                
          <!-- 數據庫表映射,每一個Value配置代表一個表的映射關係 -->                                
          <value>com/wids/department/bean/DepBean.hbm.xml</value>                                
          <value>com/wids/userinfo/bean/UserInfoBean.hbm.xml</value>                                
          <value>com/wids/syslog/bean/SysLogBean.hbm.xml</value>                                
          <value>com/wids/treemenu/bean/TreeMenuBean.hbm.xml</value>                                
          <value>com/wids/integral/bean/IntegralBean.hbm.xml</value>                                
          <value>com/wids/integralgroups/bean/IntegralGroupsBean.hbm.xml</value>                                
          <value>com/wids/news/bean/NewsBean.hbm.xml</value>                                
          <value>com/wids/news/bean/NewsLogBean.hbm.xml</value>                                
          <value>com/wids/count/bean/StatisticBean.hbm.xml</value>                                
          <value>com/wids/count/bean/TempStatisticBean.hbm.xml</value>                                
          <value>com/wids/count/bean/TempAllStatisticBean.hbm.xml</value>                                
          <value>com/wids/sms/bean/SmsBean.hbm.xml</value>                                
          <value>com/wids/fjintegral/bean/FjiBean.hbm.xml</value>                                
          <value>com/wids/count/bean/TempStatisticUserBean.hbm.xml</value>                                
          <value>com/wids/filezn/bean/FileznBean.hbm.xml</value>                                
          <!-- [優秀專題]、[優秀信息]板塊 add attagain 2013/05/10 S -->                                
          <value>com/wids/news/bean/NewsExcBean.hbm.xml</value>                                
          <value>com/wids/news/bean/NewsCommentBean.hbm.xml</value>                                
          <!-- [優秀專題]、[優秀信息]板塊 add attagain 2013/05/10 E -->                                
          <!-- 數據庫表映射結束 -->                                
        </list>                                
      </property>                                
    </bean>                                
    <!-- 配置事務 -->                                
    <bean id="transactionManager"                                
          class="org.springframework.orm.hibernate3.HibernateTransactionManager">                                
      <property name="sessionFactory">                                
        <ref local="sessionFactory" />                                
      </property>                                
    </bean>                                
                                  
  至此,是一個完整的,可正常運行的SSH+PROXOOL的配置。需要說明的的是,如果需要通過Web                                
訪問數據庫連接池管理Servlet,URL(注意區分大小寫): http://127.0.0.1:8080/[網站Root]/AdminP                                   
                                  

文檔內容可以通過以下URL  下載:

    http://download.csdn.net/detail/attagain/5535283

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章