文檔內容可以通過以下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