:::

DSpace改用Proxool增加連線效率

布丁布丁吃布丁

DSpace改用Proxool增加連線效率

image

Proxool 是一個開放原始碼的連線池(Connection Pool)管理套件,引用一下「Proxool - 快速入門」來介紹一下什麼連線池:

在資料庫應用程式中,資料庫連線的取得是一個耗費時間的動作,為了避免花費時間在連線的取得與關閉上,我們會將連線資源放置在一個池中,有需要連線時就從池中取得,不需要連線時就將之放回池中,以求重複利用連線,連線池也擔任連線數量、連線時間的控制等等動作。

連線池的設置可以讓資料庫連線比較不容易當機(當然,你要惡意地一直對伺服器發出請求,伺服器還是會當的)。DSpace的資料庫連也有設置連線池,但是連線數量一多的時候,系統卻不會踢掉已經發呆太久的連線,而導致發生「PSQLException: This statement has been closed (這個statement已經被關閉)」的例外錯誤。

Proxool在JDBC的連線池當中似乎是頗富盛名的套件,我們試著以Proxool取代DSpace預設的連線池,也大幅度地改善了DSpace的資料庫連線容易當機的問題!此外我順便撰寫了一個可直接使用SQL語法查詢的類別,可直接輸入SQL語法而回傳ResultSet物件,而不需要另外去學習DSpace的DatabaseManager怎麼使用。

以下教學都是基於我之前撰寫的DSpace 1.5.1安裝法,如果你也是照著這方法安裝,那麼以下的路徑設定幾乎不需要更動。如果不是的話,那麼請你務必注意到路徑的地方必需要改成你的環境!

DSpace的路徑我們通常會用[dspace-source]表示DSpace原始的程式檔,在本文中則是「/opt/dspace-1.5.1-src-release」,而[dspace]則是表示DSpace的安裝檔,本文中是「/dspace」,請依照你實際的情況來調整。

安裝步驟

Step 1. 在伺服器上安裝Proxool到Java的函式庫中

請到下載網頁下載Proxool的編譯打包檔,檔案類型為jar。

請取出壓縮檔裡面的proxool-0.9.1.zip/proxool-0.9.1/jarjar/jarjar-0.6.jar

接下來安裝到Java的函式庫當中,請把jarjar-0.6.jar擺到JAVA_HOME/jre/lib/ext/[dspace]/lib/當中。JAVA_HOME是你Java環境路徑檔,以我以前的DSpace安裝法來說,jarjar-0.6.jar的位置應該在/usr/java/jdk1.6.0_12/jre/lib/ext/jarjar-0.6.jar以及/dspace/lib/jarjar-0.6.jar

Step 2. 修改DatabaseManager.java

請修改你的[dsapce-source]/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseManager.java,也就是請修改/opt/dspace-1.5.1-src-release2/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseManager.java

請找到getConnection()的方法:

    public static Connection getConnection() throws SQLException
    {
        initialize();

        return DriverManager
                .getConnection("jdbc:apache:commons:dbcp:" + poolName);
    }

請修改成以下程式碼:

    public static Connection getConnection() throws SQLException //, ClassNotFoundException
    {
        boolean useProxool = ConfigurationManager.getBooleanProperty("db.proxool",true);
		if (useProxool != true)
		{
			initialize();

        	return DriverManager
                .getConnection("jdbc:apache:commons:dbcp:" + poolName);
		}
		else
		{
			Connection conn = null;
			try {
				Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
				conn = DriverManager.getConnection("proxool."+ConfigurationManager.getProperty("db.poolname")+":org.postgresql.Driver:"+ConfigurationManager.getProperty("db.url") 
					, ConfigurationManager.getProperty("db.username")
					, ConfigurationManager.getProperty("db.password"));
			}
			catch (ClassNotFoundException e) {e.printStackTrace();}
			return conn;
		}
    }

如果你的DatabaseManager.java之前並沒有修改過,那麼你也可以用我已經改好的DatabaseManager.java檔案 (http://0rz.tw/a4Vat)。

Step.3 加入SQLQuery.java

請新增[dspace-source]/dspace-api/src/main/java/org/dspace/storage/rdbms/SQLQuery.java。或是用我已經寫好的SQLQuery檔案 (http://0rz.tw/a4Vat)。

SQLQuery是直接用SQL語法直接查詢資料庫的類別,內容也很簡單(版權宣告反而比內容還要長),後面章節會教讀者如何使用,程式碼如下:

package org.dspace.storage.rdbms;

import org.dspace.core.Context;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;

public class SQLQuery
{
	private Context context = null;
	private Statement statement = null;
	
	public SQLQuery(Context c)
	{
		context = c;
	}
	
	public ResultSet query(String query) throws SQLException   
    {
		try{
			if (statement != null)
			{
				statement.close();
			}
			statement = context.getDBConnection().createStatement();
			ResultSet rs = statement.executeQuery(query);
			return rs;
		}
		catch (SQLException sqle)
        {
            throw sqle;
        }
		
    }
}
Step.4 修改web.xml

請修改

[dspace-source]/dspace-jspui/dspace-jspui-webapp/src/main/webapp/WEB-INF/web.xml,一樣地你也可以選擇用我已經寫好的web.xml檔案 (http://0rz.tw/a4Vat)。

修改的過程如下:

先找到「</web-app>」,這應該在web.xml的最後一行。

然後在</web-app>之前,加入以下xml設定:

<!-- proxool setting -->
<servlet>
  <servlet-name>ServletConfigurator</servlet-name>
  <servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
  <init-param>
    <param-name>propertyFile</param-name>
    <param-value>${dspace.dir}/config/dspace.cfg</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

<!-- Proxool Admin -->
<!-- If you want to check database connection detail, just remove comment marks. -->
<!--
<servlet>
  <servlet-name>proxool</servlet-name>
  <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>proxool</servlet-name>
  <url-pattern>/proxool</url-pattern>
</servlet-mapping>


<display-name>proxool</display-name>
<servlet>
<servlet-name>Admin</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Admin</servlet-name>
<url-pattern>/admin</url-pattern>
</servlet-mapping>
-->

 

注意到後面的註解標籤「<!—」跟「-->」,裡面的內容是Proxool的管理介面,可以看到你資料庫的連線狀態。稍後我會介紹怎麼開啟Proxool的管理介面,預設我們就把他關起來吧。

Step.5 修改dspace.cfg,增加Proxool.properties

請修改[dspace-source]/dspace/config/dspace.cfg,這個設定檔在安裝DSpace的時候一定會修改到,所以我不提供寫好的檔案,請依照以下步驟修改:

首先先找個地方插入設定,其實插入到哪裡都可以,但我想擺在一個跟資料庫靠近的地方還是比較好。請找到「##### Email settings #####」,通常會位於db.poolname的設定之後,原始的dspace.cfg那部份的程式碼如下:

# Specify a name for the connection pool (useful if you have multiple applications sharing Tomcat's dbcp)
# If not specified, defaults to 'dspacepool'
# db.poolname = dspacepool

##### Email settings ######

# SMTP mail server
mail.server=smtp.myu.edu

請先把db.poolname的註解拿掉,變成如下:(如果你有多個DSpace系統,那麼最好用不同的名稱)

db.poolname = dspacepool

請增加以下程式碼:

##### Proxool settings #####

# Use Proxool, you have to install Proxool's jar file (jarjar-0.6.jar) to JAVA_HOME/jre/lib/ext/
db.proxool = true

# Proxool Properties
jdbc-0.proxool.alias = ${db.poolname}
jdbc-0.proxool.driver-class = ${db.driver}
jdbc-0.proxool.driver-url = ${db.url}
jdbc-0.user = ${db.username}
jdbc-0.password = ${db.password}
jdbc-0.proxool.house-keeping-sleep-time = 3000
jdbc-0.proxool.simultaneous-build-throttle = 5
jdbc-0.proxool.prototype-count = 4
jdbc-0.proxool.maximun-connection-lifetime = 60000
jdbc-0.proxool.maximum-connection-count = 500
jdbc-0.proxool.minimum-connection-count = 3
jdbc-0.proxool.statistics = 1m,15m,1d
jdbc-0.proxool.overload-without-refusal-lifetime = 10000
jdbc-0.proxool.maximum-active-time = 60000
jdbc-0.proxool.statistics-log-level=ERROR

如果你想要使用DSpace預設的連線池,那麼可以把db.proxool設為false。

Proxool可以設定的參數還有很多,以上的設定是我們在測試的過程中決定的連線參數,這讓伺服器在短時間內容易到達連線上限,但又很快可以恢復。有興趣可以到Proxool的網站去查查看Properties的意思,或是參考proxool 连接池配置属性说明

稍後我會介紹之後調整參數的方法,預設值就設成這樣吧!

Step.6 DSpace編譯、配置

由於我們修改了dspace.cfg,所以我們必須使用ant的另一個參數來更新DSpace安裝檔。以下照著這個步驟確實地作吧:

移動到[dspace-source]/dspace

[dspace@dspace ~]# cd /opt/dspace-1.5.1-src-release/dspace

執行「mvn package」。

[dspace@dspace dspace]# mvn package

如果最後看到「[INFO] BUILD SUCCESSFUL」訊息,表示編譯成功。如果失敗了,那麼可能是DatabaseManager.java或是SQLQuery.java這兩個檔案出錯了,請檢查編碼或是錯字等問題,然後再來執行mvn package。

請移動到[dspace-source]/dspace/target/dspace-{verion}-build.dir/

[dspace@dspace dspace]# cd /opt/dspace-1.5.1-src-release/dspace/target/dspace-1.5.1-build.dir/

接下來要用ant配置。如果你是第一次安裝DSpace,那麼請執行以下指令:

[dspace@dspace dspace-1.5.1-build.dir]# ant fresh-install

如果你已經安裝了DSpace,那麼請執行以下指令。請務必注意到dspace.cfg必須要指定你的DSpace安裝位置(dspace.dir),我們通常會用[dspace]來表示!

[dspace@dspace dspace-1.5.1-build.dir]# ant -Dconfig=/dspace/config/dspace.cfg init_configs
[dspace@dspace dspace-1.5.1-build.dir]# ant -Dconfig=/dspace/config/dspace.cfg update_webapps

然後把[dspace]/webapps/jspui複製到你的Tomcat的webapps資料夾當中,請注意到要設置成你的Tomcat的安裝位置

[dspace@dspace ~]# 
\cp -rf /dspace/webapps/jspui /opt/apache-tomcat-6.0.13/webapps/

最後重新啟動Tomcat。

[dspace@dspace ~]# /opt/apache-tomcat-6.0.13/bin/shutdown.sh
[dspace@dspace ~]# /opt/apache-tomcat-6.0.13/bin/startup.sh

大功告成了!

接下來你可以打開你的DSpace,移動到display-item的頁面,然後用連點程式狂按「重新整理」或「F5鍵」,看看你的DSpace哪時候會掛點吧!

附帶一題,我是用連點程式每秒按2下「F5」來搞壞我的DSpace的,歡迎大家分享更有「創意」的搞壞方法。(誤)


進階調整

有些預設安裝沒有開啟的功能,或是之後要調整的參數設定,在這邊我一口氣介紹吧!由於DSpace在經過ant配置完之後,需要修改的位置都不大相同。你當然可以用上面的步驟整個慢慢地修改、mvn package、ant,但也可以用以下的偷吃步來修改!

快速修改Proxool參數

請直接修改[dspace]/config/dspace.cfg,修改完畢之後重新啟動Tomcat即可生效。

請注意!如果你的參數設置錯誤的話,Proxool會使用預設值來連線。預設最大連線數(maximum-connection-count)只有15,連線量一多很快就會當掉了。

你會發現[dspace]/config/dspace.cfg中Proxool有些參數跟上面不一樣,這是因為他經過ant配置,把一些變數替換掉的結果。那些都是資料庫連線的必要參數,請不要變更。

如果你發現更好的參數配置,請務必告訴我喔!

開啟Proxool Admin介面

請修改Tomcat中webapps/jspui/WEB-INF/web.xml (/opt/apache-tomcat-6.0.13/webapps/jspui/WEB-INF/web.xml),把Proxool Admin的註解拿掉。然後重新啟動Tomcat,就用網址http://你的主機:8080/jspui/proxool來開啟Proxool Admin。

image

Proxool Admin的畫面如上,當中可以看到Proxool的各個參數跟現在資料庫的連線狀態。如果你發現參數跟你設置的不一樣,例如最大連線數(maximum-connection-count)只有預設值的15,而不是我們設定的500,那麼就可能是你的Proxool設定檔有問題囉。

當不使用的時候,建議是把Proxool Admin介面關掉比較好喔。

使用SQLQuery

還記得我們剛剛新增了一個「SQLQuery.java」嗎?現在我就來介紹一下他要怎麼在DSpace裡面使用。

首先要先引用SQLQuery。

<%@ page import="org.dspace.storage.rdbms.SQLQuery" %>

然後你必需找到context物件。如果你的程式之中沒有預先宣告的話,那麼你可以用以下方法來建立一個context物件:

<%
Context context = new Context();
%>

然後建立一個SQLQuery物件:

<%
SQLQuery sq = new SQLQuery(context);
%>

接著你就可以使用query方法來取得ResultSet囉!

<%
ResultSet rs = sq.query("SELECT count(*) FROM item");
%>

至於ResultSet要怎麼用嘛……就請你參考PostgreSQL 文檔 發出查詢和處理結果囉。


後記

DSpace儘管擁有相當完整的系統架構,但是資料庫連線這個問題卻是困擾我們已久,連DSpace的說明文件都說叫我們手動去砍掉那些死掉的連線(文件裡面把這些連線稱為「殭屍(zombie)」)。

今天總算用Proxool來改進這個問題,Proxool可以動態地踢掉沒動作的連線,比起DSpace內建的連線池還來得聰明的多,真是讓人感動!

最後,請不要問我為什麼不寫論文,而一直在研究DSpace,我只能告訴你這是教育部全國通識計畫要用的系統而已……<-- Post Catalog -->

(more...)

Blogger最新文章與最新回應產生器(jQuery版)

布丁布丁吃布丁

Blogger最新文章與最新回應產生器(jQuery版)

  • 最新文章程式產生器
    Blogger網址http://.blogspot.com 必填!舊版的Blogger無效喔。
    顯示篇數要顯示最新文章數目
    標題長度限制如果是空白,表示不限制
    顯示方式%title%(標題)、%Y%(西元年份)、%M%(月份)、%D%(日期)、%authorname%(作者名稱),可視需要改變排列或是刪掉參數,或加入HTML語法
    標籤可限制只顯示特定標籤的最新文章,空白表示顯示所有標籤的最新文章。
    聯播程式碼: (程式碼擺設的位置)
  • 最新回應程式產生器
    Blogger網址http://.blogspot.com 必填!舊版的Blogger無效喔。
    顯示篇數要顯示最新回應數目
    留言長度限制如果是空白,表示不限制
    顯示方式%comment%(留言)、%Y%(西元年份)、%M%(月份)、%D%(日期)、%authorname%(作者名稱),可視需要改變排列或是刪掉參數,或加入HTML語法
    網站提供 (Feeds Type) 要搭配自己部落格的設定(位置圖),預設是Full(完整)。
    聯播程式碼: (程式碼擺設的位置)

這篇是改進以前我寫的「Blogger專用最新文章與最新回應產生器」,以物件的方式重寫了一遍,並且改進了留言時常因為HTML標籤而爆掉的錯誤。

這次程式碼很簡短,因為大部分的程式碼我都改用引用的方式,可以確保不會因為意外事故讓人裝不上去。此外這次的程式碼也很好懂,應該直接看就知道要做什麼了,如果使用者以後要修改的話就不用回來這邊重新產生,只要修改參數設定就好了。

原始的寫法是參考從堯@部落格來的,各別是Blogger聯播程式產生器(PartII)Blogger最新回應程式產生器(5/27更新),請也支持一下原作者吧。

  • 2011/4/1: 補充,您的Blogger讀取權限必須設定為「任何人」才能使用此功能。
  • 2012/12/21: 修正文章連結會抓到RSS網址的錯誤。因為程式檔案改位置了,所以請重新產生程式碼再安裝一次,這樣才會有效果喔。
(more...)

全文搜尋引擎Lucene簡介投影片

全文搜尋引擎Lucene簡介投影片

image

Lucene是一個全文搜尋引擎的套件,他可以為各種文件製作倒置索引檔(Inverted File),並透過簡單的API來檢索。DSpace的搜尋功能也是透過Lucene來實做,一時興起就去研究看看到底是怎麼回事了。

(Google Docs新開視窗SkyDrive投影片下載)

原本是抱著會對論文有幫助的心態去研究,不過實際上好像用不太到。我還是乖乖地來學習物件導向程式設計還比較實在就是。

參考資源

以下是一些可供參考的網站:

image實際上我是閱讀書本「征服Ajax+Lucene建構搜尋引擎」:

  • 征服Ajax+Lucene建構搜尋引擎(附光碟)
  • 作者:李剛、宋傳、邱哲
  • 出版社:松崗
  • 出版日期:2006年11月07日
  • 語言:繁體中文
  • ISBN:9861258566
  • 定價:490元

之前是在光華大享書局以特價書150元的價格買下來,好像覺得很值得。內文介紹其實不是說寫得很好,他也只是把中國大陸簡體字翻譯成繁體字之後出版而已,很多地方都是把他當作簡體字來看待比較好。

(more...)

Blogger側邊欄開關小工具

布丁布丁吃布丁

Blogger側邊欄開關小工具

image

看來的確有人注意到我的Blogger右上角有個「Sidebar」控制的功能,這可以控制右邊側邊欄的大小,搭配jQuery的動畫效果,呈現的效果其實還蠻有趣的。(只是在IE6中動畫效果並不明顯)

由於網友Gooda的詢問,我特別把這功能獨立出來並改寫成較容易操作的方式,分享給各位Blogger的玩家使用。

程式碼下載

下面的快速安裝當中是使用了我架在Google Page Creator的程式,如果你需要的話,歡迎大家自行下載、修改並使用。


安裝方法

Step.1 進入Blogger管理介面的「版面配置」,點選下方的「新增小工具」

image 

Step.2 新增「HTML/JavaScript」

image

按下右上角的「+」就可以進入編輯畫面。

Step.3 在內容新增程式碼

image

程式碼的內文如下:

<script src="http://puddingchen.35.googlepages.com/jquery.js" type="text/javascript"> </script>
<script type="text/javascript">
jQuery.getScript("http://puddingchen.35.googlepages.com/puliBloggerSidebarControl.js", function () {
	pBS = puliBloggerSidebar();
	pBS.styleController = "cursor:default;float:right;font-size: 10pt;font-weight:normal;margin-right:1em;margin-top:15px;";	//定義控制按鈕的格式
	pBS.styleA = "font-weight:blog;";	//定義左右按鈕的格式
	pBS.textLeft = " &lt; Side";	//定義左文字的內容
	pBS.textCenter = "";	//定義中間文字的內容
	pBS.textRight = "bar &gt; ";	//定義右文字的內容
	pBS.setup();
});
</script>

如果你之前已經引用了jQuery,那麼你可以省略掉第一行的「<script src="http://puddingchen.35.googlepages.com/jquery.js" type="text/javascript"> </script> 」部份。

注意到裡面有些屬性設定,包括CSS與內文的部份。如果你對於呈現出來的導覽列控制按鈕的樣式不太滿意,稍後你可以回來修改這邊屬性的內容。

標題留空無所謂,完成之後按下右下角的「儲存」。

Step.4 看看你的網誌,「< Sidebar >」應該已經出來囉!

image

點點看能不能順利運作吧!

(more...)