Remine的安裝
1.首先下載InstantRails并解壓,以下假設(shè)加壓到C:\
InstantRails是一個Rails應(yīng)用的集成包包括了Ruby運行時,Rails框架,PhpMyAdmin,Apache,MySql等,這樣就不需要分別下載需要的東西。其中Apache是用的1.3版本,主要用于運行phpMyAdmin(MySql的管理工具),Redmine本身內(nèi)置了一個Ruby寫的Http服務(wù)器:WEBrick 因此并不需要Apache。
2.下載Redmine并解壓縮,將解壓縮后的文件夾直接復(fù)制到InstantRails目錄的rails_apps目錄下
3.啟動InstantRails(在C:\InstantRails\下有個InstantRails.exe直接運行即可)會出現(xiàn)一個界面(見下圖)上面可以控制Apache和MySql的停止和啟動,請確保這兩個都啟動了。如果你的電腦上安裝了IIS,可能需要在httpd.conf中修改Apache的監(jiān)聽端口,默認(rèn)是80
4.使用phpMyAdmin在MySql中創(chuàng)建數(shù)據(jù)庫,腳本如下:create database redmine character set utf8;
5.將C:\InstantRails\rails_apps\redmine-0.8.0\config 目錄下的database.yml.example更名為database.yml
6.進入C:\InstantRails\rails_apps\redmine-0.8.0目錄,在其下執(zhí)行:rake db:migrat RAILS_ENV="production",用來創(chuàng)建數(shù)據(jù)庫,完成后應(yīng)該創(chuàng)建43個表
7.再執(zhí)行:rake redmine:load_default_data RAILS_ENV="production",指明當(dāng)前項目運行環(huán)境為production,中間會提示選擇語言,我們選擇zh。
8.最后在C:\InstantRails\rails_apps\redmine-0.8.0目錄下執(zhí)行ruby script/server -e production,啟動Redmine
9.通過瀏覽器訪問http://localHost:3000即可,缺省管理員用戶名是admin,密碼也是admin
配置Redmine為Windows服務(wù)
按照上面介紹的步驟就可以使用Redmine,但當(dāng)機器重啟后都需要手工啟動InstantRails和執(zhí)行第8步來啟動Redmine,比較麻煩,下面就介紹將Redmine安裝成Windows服務(wù),只要系統(tǒng)啟動無需登錄也跟著啟動。
在上述步驟中,MySql只是做為一個普通程序被InstantRails.exe啟動,而Redmine又依賴于MySql,因此需要將MySql安裝為Windows服務(wù),進入到C:\InstantRails\mysql\bin目錄下執(zhí)行:Mysqld -Install即可將MySql安裝為服務(wù),在服務(wù)管理器中將其設(shè)為自動啟動。
Ruby提供一個安裝Ruby程序為服務(wù)的包:mongrel_service。安裝其實很簡單,在C:\InstantRails\ruby\bin目錄下運行:gem install mongrel_service,此過程中會下載一些其他必須的包
然后使用mongrel_service將Redmine安裝為服務(wù):
mongrel_rails service::install -N RedMine -c C:\InstantRails\rails_apps\redmine-0.8.0 -p 3000 –e production
其中C:\InstantRails\rails_apps\redmine-0.8.0是Redmine所在目錄 3000是監(jiān)聽端口,然后修改啟動方式為自動即可。
如果想要移除Redmine服務(wù),可執(zhí)行如下命令:
mongrel_rails service::remove -N RedMine
配置郵件通知
Redmin可以為一些操作提供郵件通知如主題改變,新增問題等,這樣可以讓開發(fā)人員及時知道變化。在使用此功能前需要先配置郵件服務(wù)器,將C:\InstantRails\rails_apps\redmine-0.8.0\config目錄下的email.yml.example更名為email.yml,然后用文本編輯器打開此文件,將內(nèi)容改為如下:
# Outgoing email settings
production:
delivery_method: :smtp
smtp_settings:
address: "smtp.163.com"
port: 25
domain: "163.com"
authentication: :login
user_name: "PM@163.com"
password: "123456"
development:
delivery_method: :smtp
smtp_settings:
address: "smtp.163.com"
port: 25
domain: "163.com"
authentication: :login
user_name: "PM@163.com"
password: "123456"
這里我采用的是163的Smtp服務(wù)器來發(fā)送郵件,其中特別需要注意的是address,domain,user_name,password中的值都要加上雙引號,否則會報錯。
然后就可以在Redmine的界面中啟用郵件通知,設(shè)置一下發(fā)件人地址和簽名即可。
集成SubVersion
集成SubVersion就很簡單了,在版本庫頁面選擇Subersion,然后填寫SVN倉庫的url和登錄Subversion的用戶名,密碼即可通過Redmine查看svn倉庫中的文件并可比較差異。如下圖:
Redmine的WIKI
Redmine的Wiki功能比較簡單,使用wiki時一定要注意在標(biāo)記的前后都要留有空格,否則會無效如變粗字體:*Ning* 其中第一個 * 的前面要留有一個空格,而第二個*后面也要留有一個空格,其他標(biāo)記類似。
在Redmine中可以自定義工作流程,工作流程是指某一個角色針對某一類問題(如功能,缺陷和支持)的狀態(tài)遷移規(guī)則,此時該類問題就被跟蹤(此時該類問題也稱之為Tracker),狀態(tài)遷移規(guī)則決定了某類問題是否可以從一個狀態(tài)遷移到另外一個狀態(tài)
文章來自[SVN中文技術(shù)網(wǎng)]轉(zhuǎn)發(fā)請保留本站地址:http://www.svn8.com/svnjs/20090209/2337.html
修改E:\InstantRails-2.0-win\rails_apps\redmine-0.8.5\vendor\rails\railties\lib\commands\servers\webrick.rb文件
require 'webrick'
require 'optparse'
require 'commands/servers/base'
OPTIONS = {
:port => 3000,
:ip => "0.0.0.0",
:environment => (ENV['RAILS_ENV'] || "development").dup,
:server_root => File.expand_path(RAILS_ROOT + "/public/"),
:server_type => WEBrick::SimpleServer,
:charset => "UTF-8",
:mime_types => WEBrick::HTTPUtils::DefaultMimeTypes,
:debugger => false
}
重啟服務(wù)即可
要將 Windows XP 配置為能夠搜索所有文件(無論文件類型是什么),請獲取最新的 Windows XP Service Pack,然后打開“含有未知擴展名的索引文件類型”選項。
測試部分:『
如果您使用該方法,Windows XP 會在所有文件類型中搜索您指定的文本。這可能會影響搜索功能的性能。為此,請按照下列步驟操作: 1. 單擊“開始”,然后單擊“搜索”(或指向“搜索”,然后單擊“文件或文件夾”)。
2. 單擊“改變首選項”,然后單擊“使用制作索引服務(wù)(使本地搜索更快)”。
3. 單擊“改變制作索引服務(wù)設(shè)置(高級)”。請注意,您不必打開索引服務(wù)。
4. 在工具欄上,單擊“顯示/隱藏控制臺樹”。
5. 在左窗格中,右鍵單擊“本機索引服務(wù)”,然后單擊“屬性”。
6. 在“生成”選項卡上,單擊以選中“含有未知擴展名的索引文件”復(fù)選框,然后單擊“確定”。
7. 關(guān)閉索引服務(wù)控制臺。 』
警告:如果使用注冊表編輯器或其他方法錯誤地修改了注冊表,則可能導(dǎo)致嚴(yán)重問題。不提倡大家再網(wǎng)上搜到那些改變篩選等注冊項的方法
環(huán)境:
服務(wù)器操作系統(tǒng)是windows2003(32位), 硬件配置為2C(CPU)8G(Memory)PC服務(wù)器, 用做Oracle服務(wù)器.
oracle版本為10.1.0.2, $oracle_home為d:/oracle/product, sid為orcl.
方案1:
--------------------------------------------------------------------------
因為服務(wù)器是32位的操作系統(tǒng), 所以最大只能分2G內(nèi)存給Oracle使用, 規(guī)劃如下:
SGA:1.72G
PGA:250M
操作步驟
1. 創(chuàng)建pfile
SQL>create pfile from spfile
這樣就在d:/oracle/product/10.1.0/db_1/database目錄下面多1個文件INITorcl.ORA
或者copy d:/oracle/product/10.1.0/admin/orcl/pfile/init.ora.XXXXXXXX到上述目錄, 名字改成INITorcl.ORA
init.ora.XXXX也是個pfile文件, 不妨試著用這個文件啟動你的數(shù)據(jù)庫
SQL>startup pfile='d:/oracle/product/10.1.0/admin/orcl/pfile/init.ora.XXXXXXXX'
特別是你改動參數(shù)導(dǎo)致數(shù)據(jù)庫無法啟動的情況下, 用這個文件恢復(fù)你的spfile將非常有用
SQL>create spfile from pfile='d:/oracle/product/10.1.0/admin/orcl/pfile/init.ora.XXXXXXXX'
2.修改pfile的內(nèi)容
修改后主要內(nèi)容為
sga_target=1700000000(1.7G左右)
lock_sga=true
pre_aggregate_tagert=250000000(250M左右)
workarea_size_policy=auto
pre_page_sga=true
sga_max_size=1720000000(1.72G左右)
3.根據(jù)pfile啟動數(shù)據(jù)庫
SQL>startup pfile='d:/oracle/product/10.1.0/db_1/database/INITorcl.ORA'
如果不能啟動, 可能是某些參數(shù)的原因, 那么就修改INIToracl.ORA的配置文件, 直到能正常啟動為止.
4.創(chuàng)建spfile
SQL>create spfile from pfile
上訴命令將覆蓋d:/oracle/product/10.1.0/db_1/database/下的spfile文件"SPFILEORCL.ORA"
當(dāng)然你也可以顯式的指明pfile
SQL>create spfile from 'd:/oracle/product/10.1.0/db_1/database/INITorcl.ORA'
5.用spfile啟動數(shù)據(jù)庫并調(diào)整性能
SQL>startup
然后在oem中調(diào)整各種參數(shù),調(diào)整后的參數(shù)將寫在spfile中,但是不會寫在pfile中
總結(jié):這樣下來,感覺服務(wù)器的內(nèi)存并沒有被充分利用, 8G服務(wù)器只有2G給了Oracle使用, 并不是非常理想,但是我們最終還是采用了這種方案
這是因為:
1:我們試過另外一種方案后感覺速度不但沒有提升, 反而有下降, 可能是因為服務(wù)器調(diào)整的參數(shù)有些問題
2:但是我們不愿意冒著修改服務(wù)器參數(shù)的風(fēng)險, 尤其是1個在線系統(tǒng)
3:還有1個重要的原因就是客戶答應(yīng)我們很快用64位的windows 2003操作系統(tǒng)
方案2:
--------------------------------------------------------------------------------------------------
我們使用AWE的方法來使得Oracle能使用大于2G的內(nèi)存, 規(guī)劃如下:
DB_BUFFER_SIZE:3.2G
large_pool:150M
java_pool:150M
share_pool:800M
PGA:500M
操作步驟
1. 修改服務(wù)器啟動參數(shù)
修改c:/boot.ini文件, 在啟動的操作系統(tǒng)參數(shù)后加上/3GB /PAE, 如:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Enterprise" /noexecute=optout /fastdetect /3GB /PAE
2. 注冊表增加1個二進制鍵值
路徑為hkey_local_machine/software/oracle/key_Oradb10g_home1/, 鍵值為
AWE_WINDOW_MEMORY=20000000000
3. 創(chuàng)建pfile
SQL>create pfile from spfile
這樣就在d:/oracle/product/10.1.0/db_1/database目錄下面多1個文件INITorcl.ORA,
或者copy d:/oracle/product/10.1.0/admin/orcl/pfile/init.ora.XXXXXXXX到上述目錄, 名字改成INITorcl.ORA
init.ora.XXXX也是個pfile文件,不妨試著用這個文件啟動你的數(shù)據(jù)庫
SQL>startup pfile='d:/oracle/product/10.1.0/admin/orcl/pfile/init.ora.XXXXXXXX'
特別是你改動參數(shù)導(dǎo)致數(shù)據(jù)庫無法啟動的情況下, 用這個文件恢復(fù)你的spfile將會非常有用
SQL>create spfile from pfile='d:/oracle/product/10.1.0/admin/orcl/pfile/init.ora.XXXXXXXX'
2.修改pfile的內(nèi)容
修改后主要內(nèi)容為
db_block_buffers=400000
db_block_size=8192
java_pool_size=150000000(150M)
job_queue_processes=10
large_pool_size=150000000(150M)
shared_pool_size=800000000(800M)
lock_sga=true
pre_aggregate_tagert=500000000(250M左右)
workarea_size_policy=auto
pre_page_sga=true
use_indirect_data_buffers=true
注意1:db_buffer_size=db_block_buffers*db_block_size, db_block_size為數(shù)據(jù)庫默認(rèn)值, 不要修改,
比如你的db_block_size為4096話, 那么你的db_block_buffers應(yīng)該為80000, 使得它們的乘積為3.2G
注意2:pfile不要有SGA_TARGET這個參數(shù), 也不要有db_cache_size這個參數(shù), SGA_MAX_SIZE也不需要
3.根據(jù)pfile啟動數(shù)據(jù)庫
SQL>startup pfile='d:/oracle/product/10.1.0/db_1/database/INITorcl.ORA'
如果不能啟動, 可能是某些參數(shù)的原因, 那么就修改INIToracl.ORA的配置文件, 直到能正常啟動為止。
4.創(chuàng)建spfile
SQL>create spfile from pfile
上訴命令將覆蓋d:/oracle/product/10.1.0/db_1/database/下的spfile文件"SPFILEORCL.ORA"
當(dāng)然你也可以顯式的指明pfile
SQL>create spfile from 'd:/oracle/product/10.1.0/db_1/database/INITorcl.ORA'
5.用spfile啟動數(shù)據(jù)庫并調(diào)整性能
SQL>startup
然后在oem中調(diào)整各種參數(shù), 調(diào)整后的參數(shù)將寫在spfile中, 但是不會寫在pfile中
總結(jié):這樣以來, 大概有5G的內(nèi)存給服務(wù)器使用, 但是執(zhí)行同樣的SQL并沒有效率上的提高, 可能并發(fā)的時候效率有所提高, 所以這種方案最終放棄, 要想使用大內(nèi)存, 建議使用64位數(shù)的操作系統(tǒng)代替32位的操作系統(tǒng), 這樣使人更放心.
是不是很難準(zhǔn)確地分配不同的池所需的內(nèi)存數(shù)?自動共享內(nèi)存管理特性使得自動將內(nèi)存分配到最需要的地方去成為可能。
無論您是一個剛?cè)腴T的 DBA 還是一個經(jīng)驗豐富的 DBA,您肯定至少看到過一次類似以下的錯誤:
ORA-04031:unable to allocate 2216 bytes of shared memory ("shared pool"... ...
或者這種錯誤:
ORA-04031:unable to allocate XXXX bytes of shared memory
("large pool","unknown object","session heap","frame")
或者可能這種錯誤:
ORA-04031:unable to allocate bytes of shared memory ("shared pool",
"unknown object","joxlod:init h", "JOX:ioc_allocate_pal")
第一種錯誤的原因很明顯:分配給共享池的內(nèi)存不足以滿足用戶請求。(在某些情況下,原因可能不是池本身的大小,而是未使用綁定變量導(dǎo)致的過多分析造成的碎片,這是我很喜歡的一個主題;但目前讓我們把重點放在手頭的問題上。)其它的錯誤分別來自大型池和 Java 池的空間不足。
您需要解決這些錯誤情況,而不作任何與應(yīng)用程序相關(guān)的修改。那么有哪些方案可選呢?問題是如何在Oracle 例程所需的所有池之間劃分可用的內(nèi)存。
餡餅怎么分?
正如您所了解的,一個 Oracle 例程的系統(tǒng)全局區(qū)域 (SGA) 包含幾個內(nèi)存區(qū)域(包括緩沖高速緩存、共享池、Java 池、大型池和重做日志緩沖)。這些池在操作系統(tǒng)的內(nèi)存空間中占據(jù)了固定的內(nèi)存數(shù);它們的大小由 DBA 在初始化參數(shù)文件中指定。
這四個池(數(shù)據(jù)庫塊緩沖高速緩存、共享池、Java 池和大型池)幾乎占據(jù)了 SGA 中所有的空間。(與其它區(qū)域相比,重做日志緩沖沒有占據(jù)多少空間,對我們這里的討論無關(guān)緊要。)作為 DBA,您必須確保它們各自的內(nèi)存分配是充足的。
假定您決定了這些池的值分別是 2GB、1GB、1GB 和 1GB。您將設(shè)置以下初始化參數(shù)來為數(shù)據(jù)庫例程規(guī)定池的大小。
db_cache_size = 2g
shared_pool_size = 1g
large_pool_size = 1g
java_pool_size = 1g
現(xiàn)在,仔細看一下這些參數(shù)。坦白講,這些值是否準(zhǔn)確?
我相信您一定會有疑慮。在實際中,沒有人能夠為這些池指定確切的內(nèi)存數(shù) — 它們太依賴于數(shù)據(jù)庫內(nèi)部的處理,而處理的特性隨時在變化。
下面是一個示例場景。假定您有一個典型的、大部分屬于 OLTP 的數(shù)據(jù)庫,并且為緩沖高速緩存分配的專用內(nèi)存比為純 OLTP 數(shù)據(jù)庫(現(xiàn)在已經(jīng)很少見了)分配的要少。有一天,您的用戶放開了一些非常大的全表掃描,以創(chuàng)建當(dāng)天的結(jié)束報表。Oracle9i 數(shù)據(jù)庫為您提供了在線修改內(nèi)存分配的功能,但由于提供的總物理內(nèi)存有限,您決定從大型池和 Java 池中取出一些內(nèi)存:
alter system set db_cache_size = 3g scope=memory;
alter system set large_pool_size = 512m scope=memory;
alter system set java_pool_size = 512m scope=memory;
這個解決方案能夠很好地工作一段時間,但是接著夜間的 RMAN 作業(yè)(它們使用大型池)開始了,大型池將立即出現(xiàn)內(nèi)存不足。同樣,您從數(shù)據(jù)庫高速緩存中取出一些內(nèi)存來補充大型池,以挽救這種局面。
RMAN 作業(yè)完成,然后啟動一個廣泛使用 Java 的批處理程序,接著您開始看到與 Java 池相關(guān)的錯誤。因此,您(再次)重新分配池,以滿足 Java 池和數(shù)據(jù)庫高速緩存上的內(nèi)存需求:
alter system set db_cache_size = 2G scope=memory;
alter system set large_pool_size = 512M scope=memory;
alter system set java_pool_size = 1.5G scope=memory;
第二天早上,OLTP 作業(yè)恢復(fù)在線,這個循環(huán)又完全重復(fù)!
解決這種惡性循環(huán)的一種替代方法是永久設(shè)置每個池的最大需求。不過,這么做的話,您分配的總的 SGA 可能超出可用的內(nèi)存 — 從而在為每個池分配的內(nèi)存數(shù)不足時,將增加交換和分頁的風(fēng)險。人工重新分配的方法(雖然不實際)目前看起來很不錯。
另一種替代方法是將值設(shè)為可接受的最小值。不過,當(dāng)需求增長且內(nèi)存不能完全滿足時,性能將受到影響。
注意在所有這些示例中,分配給 SGA 的總內(nèi)存保持不變,而池之間的內(nèi)存分配根據(jù)即時的需求進行修改。如果 RDBMS 將自動探測來自用戶的需求并相應(yīng)地重新分布內(nèi)存分配,那不是很好嗎?
Oracle 數(shù)據(jù)庫 10g 中的自動共享內(nèi)存管理特性正好能夠?qū)崿F(xiàn)這一目的。您可以決定 SGA 的總大小,然后設(shè)置一個名稱為 SGA_TARGET 的參數(shù),這個參數(shù)決定 SGA 的總大小。SGA 內(nèi)部的各個池將根據(jù)工作負載動態(tài)地進行配置。實現(xiàn)自動內(nèi)存分配僅僅需要 SGA_TARGET 參數(shù)的一個非零值。
設(shè)置自動共享內(nèi)存管理
讓我們看看該特性是如何工作的。首先,確定 SGA 的總大小。您可以通過確定現(xiàn)在分配了多少內(nèi)存來估計這個值。
SQL> select sum(value)/1024/1024 from v$sga;
SUM(VALUE)/1024/1024
--------------------
500
此時 SGA 的當(dāng)前總大小近似為 500MB,并且這個值將變?yōu)?SGA_TARGET 的值。接下來,執(zhí)行語句:
alter system set sga_target = 500M scope=both;
這種方法不需要為各個池設(shè)置不同值;因而,您將需要在參數(shù)文件中使它們的值為零或全部刪除它們。
shared_pool_size = 0
large_pool_size = 0
java_pool_size = 0
db_cache_size = 0
再循環(huán)數(shù)據(jù)庫,使這些值生效。
這個人工過程還可以通過 Enterprise Manager 10g 實施。從數(shù)據(jù)庫主頁中,選擇 "Administration" 選項卡,然后選擇 "Memory Parameters"。對于人工配置的內(nèi)存參數(shù),將顯示標(biāo)記為 "Enable" 的按鈕,以及所有人工配置的池的值。單擊 "Enable" 按鈕,啟用自動共享內(nèi)存管理特性。企業(yè)管理器將完成剩下的工作。
在配置了自動內(nèi)存分配之后,您可以利用以下命令檢查它們的大小:
SQL> select current_size from v$buffer_pool;
CURRENT_SIZE
------------
340
SQL> select pool, sum(bytes)/1024/1024 Mbytes from v$sgastat group by pool;
POOL MBYTES
------------ ----------
java pool 4
large pool 4
shared pool 148
正如您所看到的,所有的池都從 500MB 的總目標(biāo)大小中自動進行分配。(參見圖 1。)緩沖高速緩存大小是 340MB,Java 池是 4MB,大型池是 4MB,共享池是 148MB。它們合起來總的大小為 (340+4+4+148=) 496MB,近似與 500MB 的目標(biāo) SGA 的大小相同。

圖 1:池的初始分配
現(xiàn)在假定提供給 Oracle 的主機內(nèi)存從 500MB 減少為 300MB,這意味著我們必須減少總 SGA 的大小。我們可以通過減小目標(biāo) SGA 大小來反映這種變化。
alter system set sga_target = 300M scope=both;
現(xiàn)在查看各個池,我們可以看到:
SQL> select current_size from v$buffer_pool;
CURRENT_SIZE
------------
244
SQL> select pool, sum(bytes)/1024/1024 Mbytes from v$sgastat group by pool;
POOL MBYTES
------------ ----------
java pool 4
large pool 4
shared pool 44
占用的總大小是 240+4+4+44 = 296MB,接近于目標(biāo)的 300MB。注意如圖 2 所示,當(dāng) SGA_TARGET 改變時,如何自動重新分配池。

圖 2:在將 SGA 大小減少到 300MB 之后重新分配池
這些池的大小是動態(tài)的。池將根據(jù)工作負載擴展,以容納需求的增長,或縮小以容納另一個池的擴展。這種擴展或縮小自動發(fā)生,無需 DBA 的干預(yù),這與本文開頭的示例不同。讓我們暫時返回到那個場景,假定在初始分配后,RMAN 作業(yè)啟動,指示需要一個更大的大型池,大型池將從 4MB 擴展到 40MB,以容納需求。這個額外的 36MB 將從數(shù)據(jù)庫緩沖中劃出,數(shù)據(jù)庫塊緩沖將縮小,如圖 3 所示。

圖 3:在對大型池的需求增長之后經(jīng)過重新分配的池
池的大小變化基于系統(tǒng)上的工作負載,因此不需要為最壞的情況調(diào)整池的大小 — 它們將根據(jù)需求的增長自動調(diào)整。此外,SGA 的總大小始終在由 SGA_TARGET 指定的最大值之內(nèi),因此不存在使內(nèi)存需求的增長比例失調(diào)(這將導(dǎo)致分頁和交換)的風(fēng)險。您可以動態(tài)地將 SGA_TARGET 增加至絕對最大值,這個絕對最大值是通過調(diào)整參數(shù) SGA_MAX_SIZE 指定的。
哪些池不受影響?
SGA 中的一些池不受動態(tài)大小調(diào)整的影響,但是必須顯式指定這些池。其中值得注意的是非標(biāo)準(zhǔn)塊大小的緩沖池,以及 KEEP 池或 RECYCLE 池的非默認(rèn)塊大小。如果您的數(shù)據(jù)庫有一個塊大小為 8K,而您想要配置 2K、4K、16K 和 32K 塊大小的池,那么您必須手動設(shè)置它們。它們的大小將保持不變;它們將不會根據(jù)負載縮小或擴展。當(dāng)使用多種大小的緩沖池、KEEP 池和 RECYCLE 池時,您應(yīng)當(dāng)考慮這個因素。此外,日志緩沖不受內(nèi)存調(diào)整的影響 — 不管工作負載如何,
有些參數(shù)不能動態(tài)修改,需要使用ALTER SYSTEM SET parameter = value SCOPE = SPFILE,然后重新啟動數(shù)據(jù)庫才能生效。
而ALTER SYSTEM SET parameter = value 使用的默認(rèn)SCOPE = BOTH,包括同時修改spfile 和當(dāng)前的設(shè)置。
摘要:通過探討和研究Oracle服務(wù)器和Client/Server的特點和原理,闡述了提高、調(diào)整Oracle應(yīng)用系統(tǒng)性能的一些原則和方法。
關(guān)鍵詞:Oracle;客戶/服務(wù)器;系統(tǒng)全程區(qū);網(wǎng)絡(luò)I/O;回滾段。
Oracle 數(shù)據(jù)庫廣泛應(yīng)用在社會的各個領(lǐng)域,特別是在Client/Server模式的應(yīng)用,但是應(yīng)用開發(fā)者往往碰到整個系統(tǒng)的性能隨著數(shù)據(jù)量的增大顯著下降的問題,為了解決這個問題,從以下幾個方面:數(shù)據(jù)庫服務(wù)器、網(wǎng)絡(luò)I/O、應(yīng)用程序等對整個系統(tǒng)加以調(diào)整,充分發(fā)揮Oracle的效能,提高整個系統(tǒng)的性能。
1 調(diào)整數(shù)據(jù)庫服務(wù)器的性能
Oracle數(shù)據(jù)庫服務(wù)器是整個系統(tǒng)的核心,它的性能高低直接影響整個系統(tǒng)的性能,為了調(diào)整Oracle數(shù)據(jù)庫服務(wù)器的性能,主要從以下幾個方面考慮:
1.1 調(diào)整操作系統(tǒng)以適合Oracle數(shù)據(jù)庫服務(wù)器運行
Oracle數(shù)據(jù)庫服務(wù)器很大程度上依賴于運行服務(wù)器的操作系統(tǒng),如果操作系統(tǒng)不能提供最好性能,那么無論如何調(diào)整,Oracle數(shù)據(jù)庫服務(wù)器也無法發(fā)揮其應(yīng)有的性能。
1.1.1 為Oracle數(shù)據(jù)庫服務(wù)器規(guī)劃系統(tǒng)資源
據(jù)已有計算機可用資源, 規(guī)劃分配給Oracle服務(wù)器資源原則是:盡可能使Oracle服務(wù)器使用資源最大化,特別在Client/Server中盡量讓服務(wù)器上所有資源都來運行Oracle服務(wù)。
1.1.2 調(diào)整計算機系統(tǒng)中的內(nèi)存配置
多數(shù)操作系統(tǒng)都用虛存來模擬計算機上更大的內(nèi)存,它實際上是硬盤上的一定的磁盤空間。當(dāng)實際的內(nèi)存空間不能滿足應(yīng)用軟件的要求時,操作系統(tǒng)就將用這部分的磁盤空間對內(nèi)存中的信息進行頁面替換,這將引起大量的磁盤I/O操作,使整個服務(wù)器的性能下降。為了避免過多地使用虛存,應(yīng)加大計算機的內(nèi)存。
1.1.3 為Oracle數(shù)據(jù)庫服務(wù)器設(shè)置操作系統(tǒng)進程優(yōu)先級
不要在操作系統(tǒng)中調(diào)整Oracle進程的優(yōu)先級,因為在Oracle數(shù)據(jù)庫系統(tǒng)中,所有的后臺和前臺數(shù)據(jù)庫服務(wù)器進程執(zhí)行的是同等重要的工作,需要同等的優(yōu)先級。所以在安裝時,讓所有的數(shù)據(jù)庫服務(wù)器進程都使用缺省的優(yōu)先級運行。
1.2 調(diào)整內(nèi)存分配
Oracle數(shù)據(jù)庫服務(wù)器保留3個基本的內(nèi)存高速緩存,分別對應(yīng)3種不同類型的數(shù)據(jù):庫高速緩存,字典高速緩存和緩沖區(qū)高速緩存。庫高速緩存和字典高速緩存一起構(gòu)成共享池,共享池再加上緩沖區(qū)高速緩存便構(gòu)成了系統(tǒng)全程區(qū)(SGA)。SGA是對數(shù)據(jù)庫數(shù)據(jù)進行快速訪問的一個系統(tǒng)全程區(qū),若SGA本身需要頻繁地進行釋放、分配,則不能達到快速訪問數(shù)據(jù)的目的,因此應(yīng)把SGA放在主存中,不要放在虛擬內(nèi)存中。內(nèi)存的調(diào)整主要是指調(diào)整組成SGA的內(nèi)存結(jié)構(gòu)的大小來提高系統(tǒng)性能,由于Oracle數(shù)據(jù)庫服務(wù)器的內(nèi)存結(jié)構(gòu)需求與應(yīng)用密切相關(guān),所以內(nèi)存結(jié)構(gòu)的調(diào)整應(yīng)在磁盤I/O調(diào)整之前進行。
1.2.1 庫緩沖區(qū)的調(diào)整
庫緩沖區(qū)中包含私用和共享SQL和PL/SQL區(qū),通過比較庫緩沖區(qū)的命中率決定它的大小。要調(diào)整庫緩沖區(qū),必須首先了解該庫緩沖區(qū)的活動情況,庫緩沖區(qū)的活動統(tǒng)計信息保留在動態(tài)性能表v$librarycache數(shù)據(jù)字典中,可通過查詢該表來了解其活動情況,以決定如何調(diào)整。
Select sum(pins),sum(reloads) from v$librarycache;
|
Pins列給出SQL語句,PL/SQL塊及被訪問對象定義的總次數(shù);Reloads列給出SQL 和PL/SQL塊的隱式分析或?qū)ο蠖x重裝載時在庫程序緩沖區(qū)中發(fā)生的錯誤。如果sum(pins)/sum(reloads) ≈0,則庫緩沖區(qū)的命中率合適;若sum(pins)/sum(reloads)>1, 則需調(diào)整初始化參數(shù) shared_pool_size來重新調(diào)整分配給共享池的內(nèi)存量。
1.2.2 數(shù)據(jù)字典緩沖區(qū)的調(diào)整
數(shù)據(jù)字典緩沖區(qū)包含了有關(guān)數(shù)據(jù)庫的結(jié)構(gòu)、用戶、實體信息。數(shù)據(jù)字典的命中率,對系統(tǒng)性能影響極大。數(shù)據(jù)字典緩沖區(qū)的使用情況記錄在動態(tài)性能表v$librarycache中,可通過查詢該表來了解其活動情況,以決定如何調(diào)整。
Select sum(gets),sum(getmisses) from v$rowcache;
|
Gets列是對相應(yīng)項請求次數(shù)的統(tǒng)計;Getmisses 列是引起緩沖區(qū)出錯的數(shù)據(jù)的請求次數(shù)。對于頻繁訪問的數(shù)據(jù)字典緩沖區(qū),sum(getmisses)/sum(gets)<10%~15%。若大于此百分?jǐn)?shù),則應(yīng)考慮增加數(shù)據(jù)字典緩沖區(qū)的容量,即需調(diào)整初始化參數(shù)shared_pool_size來重新調(diào)整分配給共享池的內(nèi)存量。
1.2.3 緩沖區(qū)高速緩存的調(diào)整
用戶進程所存取的所有數(shù)據(jù)都是經(jīng)過緩沖區(qū)高速緩存來存取,所以該部分的命中率,對性能至關(guān)重要。緩沖區(qū)高速緩存的使用情況記錄在動態(tài)性能表v$sysstat中,可通過查詢該表來了解其活動情況,以決定如何調(diào)整。
Select name,value from v$sysstat where name in
('dbblock gets','consistent gets','physical reads');
|
dbblock gets和consistent gets的值是請求數(shù)據(jù)緩沖區(qū)中讀的總次數(shù)。physical reads的值是請求數(shù)據(jù)時引起從盤中讀文件的次數(shù)。從緩沖區(qū)高速緩存中讀的可能性的高低稱為緩沖區(qū)的命中率,計算公式:
Hit Ratio=1-(physical reds/(dbblock gets+consistent gets))
如果Hit Ratio<60%~70%,則應(yīng)增大db_block_buffers的參數(shù)值。db_block_buffers可以調(diào)整分配給緩沖區(qū)高速緩存的內(nèi)存量,即db_block_buffers可設(shè)置分配緩沖區(qū)高速緩存的數(shù)據(jù)塊的個數(shù)。緩沖區(qū)高速緩存的總字節(jié)數(shù)=db_block_buffers的值*db_block_size的值。db_block_size 的值表示數(shù)據(jù)塊大小的字節(jié)數(shù),可查詢 v$parameter 表:
select name,value from v$parameter where name='db_block_size';
|
在修改了上述數(shù)據(jù)庫的初始化參數(shù)以后,必須先關(guān)閉數(shù)據(jù)庫,在重新啟動數(shù)據(jù)庫后才能使新的設(shè)置起作用。
1.3 調(diào)整磁盤 I/O
磁盤的I/O速度對整個系統(tǒng)性能有重要影響。解決好磁盤I/O問題,可顯著提高性能。影響磁盤I/O的性能的主要原因有磁盤競爭、I/O次數(shù)過多和數(shù)據(jù)塊空間的分配管理。
為Oracle數(shù)據(jù)庫服務(wù)器創(chuàng)建新文件時,不論是表空間所用的數(shù)據(jù)文件還是數(shù)據(jù)事務(wù)登錄所用的日志文件,都應(yīng)仔細考慮數(shù)據(jù)庫服務(wù)器上的可用磁盤資源。如果服務(wù)器上有多個磁盤,則可將文件分散存儲到各個可用磁盤上,減少對數(shù)據(jù)庫的數(shù)據(jù)文件及事務(wù)日志文件的競爭,從而有效地改善服務(wù)器的性能。對于不同的應(yīng)用系統(tǒng)都有各自的數(shù)據(jù)集,應(yīng)當(dāng)創(chuàng)見不同的表空間分別存儲各自應(yīng)用系統(tǒng)的數(shù)據(jù),并且盡可能的把表空間對應(yīng)的數(shù)據(jù)文件存放在不同的磁盤上,這種從物理上把每個應(yīng)用系統(tǒng)的表空間分散存放的方法,可以排除兩個應(yīng)用系統(tǒng)競爭磁盤的可能性。數(shù)據(jù)文件、事務(wù)日志文件分別存放在不同的磁盤上,這樣事務(wù)處理執(zhí)行的磁盤訪問不妨礙對相應(yīng)的事物日志登記的磁盤訪問。如果有多個磁盤可用,將兩個事物日志成員放在不同的磁盤驅(qū)動器上,就可以消除日志文件可能產(chǎn)生的磁盤競爭。應(yīng)把一個應(yīng)用的表數(shù)據(jù)和索引數(shù)據(jù)分散存放不同表空間上,并且盡量把不同類型的表空間存放在不同磁盤上,這樣就消除了表數(shù)據(jù)和索引數(shù)據(jù)的磁盤競爭。
1.4 調(diào)整數(shù)據(jù)庫服務(wù)器的回滾段
回滾段是一個存儲區(qū)域,數(shù)據(jù)庫使用該存儲區(qū)域存放曾經(jīng)由一個事務(wù)更新或刪除的行的原始數(shù)據(jù)值。如果用戶要回滾一個事務(wù)所做的改變,那么數(shù)據(jù)庫就從回滾段中讀回改變前的數(shù)據(jù)并使該事務(wù)影響的行改變?yōu)樗鼈兊脑瓲顟B(tài)。回滾段控制著數(shù)據(jù)庫處理事務(wù)的能力,因而在數(shù)據(jù)庫成功中起著關(guān)鍵性的作用,不管數(shù)據(jù)庫的其它部分設(shè)計得多好,如果它設(shè)計得不合理,將會嚴(yán)重影響系統(tǒng)的性能。建立和調(diào)整回滾段的原則如下。
1.4.1 分離回滾段
分離回滾段是指單獨為回滾段創(chuàng)建一個以上的表空間,使回滾段與數(shù)據(jù)字典、用戶數(shù)據(jù)、索引等分離開來。由于回滾段的寫入與數(shù)據(jù)和索引的寫入是并行進行的,因此將它分離出來可以減少I/O爭用。如果回滾段與數(shù)據(jù)不分離,倘若要某個表空間脫機或撤消,那么在該表空間中的各個回滾段沒有全部脫機之前,不能將這個表空間脫機或撤消。而一旦該表空間不可用,則該表空間中的所有回滾段也不能使用,這將浪費所有分配的磁盤空間。所以,獨立回滾段可使數(shù)據(jù)庫管理變得容易。回滾段的經(jīng)常性收縮,使得表空間的自由塊更容易形成碎片。分離回滾段可以減少數(shù)據(jù)庫表空間的碎片產(chǎn)生。
1.4.2 創(chuàng)建不同大小的回滾段群
對于一些聯(lián)機事物處理,他們一般是頻繁地對少量數(shù)據(jù)進行修改,創(chuàng)建許多小的回滾段對之有利。每一個事物的入口項只能限于一個回滾段,回滾段應(yīng)該充分大以容納一個完整的事物處理,因此對一些較大型事物,需要較大型的回滾段。極個別脫機處理事物會產(chǎn)生大量的回滾信息,這時需要一個特大號的回滾段來處理。根據(jù)這些理論,在Oracle數(shù)據(jù)庫服務(wù)器中針對上述3種事物處理創(chuàng)建三組:小事物組、較大事物組、特大事物組等大小不同的回滾段群,并且將之分散到3個不同的表空間上,群內(nèi)大小相同,應(yīng)能滿足該組事物處理的最大要求。
1.4.3 創(chuàng)建數(shù)量適當(dāng)?shù)幕貪L段
一般回滾段數(shù)量與并發(fā)事物個數(shù)有關(guān),以下給出由于并發(fā)事物個數(shù)而應(yīng)建立回滾段的參考數(shù):
并發(fā)事物(n) 回滾段數(shù)
n<16 4
16 ≤ n<32 8
n≥ 32 n/4
|
2 調(diào)整 Client/Server 模式下的網(wǎng)絡(luò) I/O
Client/Server環(huán)境中的應(yīng)用處理是分布在客戶應(yīng)用程序和數(shù)據(jù)庫服務(wù)程序之間的。在 Client/Server環(huán)境中Client與Server之間的網(wǎng)絡(luò)I/O是整個系統(tǒng)性能提高的瓶頸,一個客戶應(yīng)用程序引起的網(wǎng)絡(luò)I/O越少,應(yīng)用及整個系統(tǒng)的性能越好。減少網(wǎng)絡(luò)I/O的最重要的一條原則:將應(yīng)用邏輯集中在數(shù)據(jù)庫服務(wù)器中。
2.1 使用Oracle數(shù)據(jù)庫的完整約束性
當(dāng)為應(yīng)用建表時,應(yīng)當(dāng)為一些有特殊要求的數(shù)據(jù)加上適當(dāng)?shù)耐暾约s束,這樣就能實現(xiàn)由數(shù)據(jù)庫本身而不是應(yīng)用程序來約束數(shù)據(jù)符合一定的條件。數(shù)據(jù)庫服務(wù)器端的完整約束的執(zhí)行操作是在比SQL語句級別更低的系統(tǒng)機制上優(yōu)化,它與客戶端無關(guān),只在服務(wù)器中運行,不需在Client 端和Server端之間傳遞SQL語句,有效地減輕網(wǎng)絡(luò)I/O負擔(dān)。
2.2 使用數(shù)據(jù)庫觸發(fā)器
完整約束性只能實現(xiàn)一些較簡單的數(shù)據(jù)約束條件,對一些較復(fù)雜的事物處理規(guī)則就無能為力,這時最好不要在應(yīng)用程序中實施復(fù)雜的程序控制,而是應(yīng)當(dāng)采用數(shù)據(jù)庫觸發(fā)器來實施復(fù)雜的事物規(guī)則。數(shù)據(jù)庫觸發(fā)器能實現(xiàn)由數(shù)據(jù)庫本身,而不是應(yīng)用程序,來約束數(shù)據(jù)符合復(fù)雜的事物處理規(guī)則,并且容易創(chuàng)建,便于管理,避免大量的網(wǎng)絡(luò)I/O。
例如:將當(dāng)前表A中成為歷史的記錄從A表中轉(zhuǎn)儲到歷史表B中,表示為Lsbs。
在應(yīng)用程序中實現(xiàn): 用數(shù)據(jù)庫觸發(fā)器實現(xiàn):
Beign Create trigger delete1
Update A set lsbs='T'; After update of lsbs on A
Insert into B For each row
Select * from A where lsbs='T'; Insert into B
Delete A where lsbs='T'; select * from A where :new.lsbs='T';
End; Delete A where :new.lsbs='T';
End delete1;
|
在應(yīng)用程序中實現(xiàn)時,所有的SQL命令請求傳送的數(shù)據(jù)都要通過網(wǎng)絡(luò)在Client端和Server端進行交換,而不像數(shù)據(jù)庫觸發(fā)器一樣,SQL本身在Server端,不需要通過網(wǎng)絡(luò)傳輸數(shù)據(jù)。當(dāng)進行操作的數(shù)據(jù)量相當(dāng)大時,并且多個用戶同時操作時,通過在應(yīng)用程序中實現(xiàn)復(fù)雜的控制,必將增大網(wǎng)絡(luò)I/O的負荷,使整個系統(tǒng)的性能降低,而用數(shù)據(jù)庫觸發(fā)器能完全避免這種情況發(fā)生。
2.3 使用存儲過程、存儲函數(shù)和包
Oracle的存儲過程和存儲函數(shù)是命名的能完成一定功能并且存儲在Server端的PL/SQL的集合。包是一種把有關(guān)的過程和函數(shù)組織封裝成一個數(shù)據(jù)庫程序單元的方法。它們相對于應(yīng)用程序的過程、函數(shù)而言,把SQL命令存儲在Server端。使用存儲過程和存儲函數(shù),應(yīng)用程序不必再包含多個網(wǎng)絡(luò)操作的SQL語句去執(zhí)行數(shù)據(jù)庫服務(wù)器操作,而是簡單調(diào)用存儲過程和存儲函數(shù),在網(wǎng)絡(luò)上傳輸?shù)闹皇钦{(diào)用過程的名字和輸出結(jié)果,這樣就可減少大量的網(wǎng)絡(luò)I/O。
例如:基表A、B的定義:name char(20);detail char(10);A表100萬記錄,應(yīng)用程序?qū)幕鞟中檢索detail列符合給出條件的記錄,并將之插入基表B。
Declare
Cursor cursor1 is select*from A;poin cursor1%type;
con1 number(2);res1 char(4)='abcd';
Begin Insert into B values(poin.name,poin.detail);end if;
For poin in cursor1 loop End loop;End loop;
For con1 in 1..7 loop Commit;
If substr(poin.detail ,con1,4)=res1 then End;
|
如果在Developer/2000 From中按鈕觸發(fā)器直接用PL/SQL實現(xiàn)和把它改寫為一個Oracle存儲過程,然后在From中調(diào)用此過程實現(xiàn)比較,后者性能顯著提高。
在考慮使用上述3種方法時:首先考慮使用完整約束性。對于數(shù)據(jù)庫觸發(fā)器和存儲過程,如果需要所有訪問數(shù)據(jù)庫的程序自動實施一定規(guī)則或檢查,那么使用數(shù)據(jù)庫觸發(fā)器;如果只需對少數(shù)的程序?qū)嵤┮欢ǖ囊?guī)則或檢查,則可創(chuàng)建一個過程,讓有關(guān)程序調(diào)用這個過程。
3 應(yīng)用程序的調(diào)整
3.1 SQL語句的優(yōu)化
SQL語句的執(zhí)行速度,可以受很多因素的影響而變化。但主要的影響因素是:驅(qū)動表、執(zhí)行操作的先后順序和索引的運用。可以由很多不同的方法間接地改變這些因素,以達到最優(yōu)的執(zhí)行速度。這里主要探討當(dāng)對多個表進行連接查詢時應(yīng)遵循的優(yōu)化原則:
(1) 用于連接的子句的列應(yīng)被索引、在Where子句中應(yīng)盡量利用索引,而不是避開索引。
(2) 連接操作應(yīng)從返回較少行上驅(qū)動。
(3) 如果所連接的表A和B,A表長度遠遠大于B表,建議從較大的A表上驅(qū)動。
(4) 如果Where子句中含有選擇性條件,Where No=20,將最具有選擇性部分放在表達式最后。
(5) 如果只有一個表有索引,另一表無索引,無索引的表通常作為驅(qū)動表。如A表的No列以被索引,而B表的No 列沒被索引,則應(yīng)當(dāng)B表作為驅(qū)動表,A表作為被驅(qū)動表。
(6) 若用于連接的列和Where子句中其他選擇條件列均有索引,則按各個索引對查詢的有效性和選擇性分別定出級別,結(jié)合表中具體數(shù)據(jù)構(gòu)成情況,從中選出優(yōu)化路徑,一般需要考慮:子句中哪些列可以使用索引、哪些索引具有唯一性及被查詢表行數(shù)目等。
3.2 建立和使用視圖、索引
利用視圖可以將基表中的列或行進行裁減、隱藏一部分?jǐn)?shù)據(jù),并且能夠?qū)⑸婕暗蕉鄠€表的復(fù)雜查詢以視圖的方式給出,使應(yīng)用程序開發(fā)簡潔快速。利用索引可以提高查詢性能,減少磁盤 I/O,優(yōu)化對數(shù)據(jù)表的查詢,加速SQL語句的執(zhí)行。但任何時候建立索引都能提高性能,何時建立索引應(yīng)當(dāng)遵循以下原則:該表常用來在索引列上查詢,該表不常更新、插入、刪除等操作,查詢出來的結(jié)果記錄數(shù)應(yīng)控制在原表的2%~4%。
3.3 使用 Oracle 的數(shù)組接口
當(dāng)一個客戶應(yīng)用程序插入一行或用一個查詢來向服務(wù)器請求某行時,不是發(fā)送具有單個行的網(wǎng)絡(luò)包,而是采用數(shù)組處理,即把要插入的多個行或檢索出的多個行緩沖在數(shù)組中,然后通過很少的幾個包就可在網(wǎng)上傳送這些數(shù)組。例如,一個給定的Select語句返回2000行數(shù)據(jù),每行平均大小為40個字節(jié),數(shù)據(jù)包的大小為4kB,而數(shù)組大小參數(shù)(arraysize)設(shè)置為20 ,則需從服務(wù)器發(fā)送100個數(shù)據(jù)包到客戶機。如果簡單地把(arraysize)設(shè)置為2000,那么同樣的操作只需要傳送 20個數(shù)據(jù)包。這樣就減少了網(wǎng)絡(luò)的傳輸量,提高了所有應(yīng)用的性能。
4 總結(jié)
我們在開發(fā)應(yīng)用程序時,遵循上述的方法和原則,對系統(tǒng)進行調(diào)整,收到了令人滿意的效果。但是應(yīng)當(dāng)指出,由于客戶機、網(wǎng)絡(luò)、服務(wù)器這3個相互依存的組成部分都必須調(diào)整和同步才能產(chǎn)生最佳的性能,因此還應(yīng)根據(jù)系統(tǒng)的具體情況,具體分析和調(diào)整。
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (32-bit)
http://download.oracle.com/otn/nt/oracle10g/10201/10201_database_win32.zip
http://download.oracle.com/otn/nt/oracle10g/10201/10201_client_win32.zip
http://download.oracle.com/otn/nt/oracle10g/10201/10201_clusterware_win32.zip
http://download.oracle.com/otn/nt/oracle10g/10201/10201_gateways_win32.zip
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (x64)
http://download.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_database.zip
http://download.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_client.zip
http://download.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_clusterware.zip
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Linux x86
http://download.oracle.com/otn/linux/oracle10g/10201/10201_database_linux32.zip
http://download.oracle.com/otn/linux/oracle10g/10201/10201_client_linux32.zip
http://download.oracle.com/otn/linux/oracle10g/10201/10201_gateways_linux32.zip
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Linux x86-64
http://download.oracle.com/otn/linux/oracle10g/10201/10201_database_linux_x86_64.cpio.gz
http://download.oracle.com/otn/linux/oracle10g/10201/10201_client_linux_x86_64.cpio.gz
http://download.oracle.com/otn/linux/oracle10g/10201/10201_clusterware_linux_x86_64.cpio.gz
http://download.oracle.com/otn/linux/oracle10g/10201/10201_gateways_linux_x86_64.cpio.gz
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for AIX5L
http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_database.cpio.gz
http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_client.cpio.gz
http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_cluster.cpio.gz
http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_gateways.cpio.gz
Oracle Database 10g Release 2 (10.2.0.2) Enterprise/Standard Edition for Solaris Operating System (x86)
http://download.oracle.com/otn/solaris/oracle10g/10202/10202_database_solx86.zip
http://download.oracle.com/otn/solaris/oracle10g/10202/10202_client_solx86.zip
http://download.oracle.com/otn/solaris/oracle10g/10202/10202_clusterware_solx86.zip
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Solaris Operating System (x86-64)
http://download.oracle.com/otn/solaris/oracle10g/10201/x8664/10201_database_solx86_64.zip
http://download.oracle.com/otn/solaris/oracle10g/10201/x8664/10201_client_solx86_64.zip
http://download.oracle.com/otn/solaris/oracle10g/10201/x8664/10201_clusterware_solx86_64.zip
---------------------------------------------------------------------------------------------------------
更多oracle10g數(shù)據(jù)庫相關(guān)下載請參考下面的官方下載網(wǎng)址:http://www.oracle.com/technology/global/cn/software/products/database/index.html
ORACLE10gR2下載_oracle10G官方下載_Oracle10G Release2(10.2.0.1.0)下載_Oracle10g下載_oracle下載(Authour: 王大帥 Email: dashuaiwang@126.com 個人空間:http://wds.3u.cn)
ORACLE10G 補丁_ORACLE10g PATCH下載地址:
oracle 10.2.0.2 patch:
ftp://updates.oracle.com/4547817/p4547817_10202_AIX64-5L.zip
ftp://updates.oracle.com/4547817/p4547817_10202_HP64.zip
ftp://updates.oracle.com/4547817/p4547817_10202_HPUX-IA64.zip
ftp://updates.oracle.com/4547817/p4547817_10202_LINUX.zip
ftp://updates.oracle.com/4547817/p4547817_10202_Linux-IA64.zip
ftp://updates.oracle.com/4547817/p4547817_10202_Linux-x86-64.zip
ftp://updates.oracle.com/4547817/p4547817_10202_MVS.zip
ftp://updates.oracle.com/4547817/p4547817_10202_SOLARIS.zip
ftp://updates.oracle.com/4547817/p4547817_10202_SOLARIS64.zip
ftp://updates.oracle.com/4547817/p4547817_10202_WINNT.zip
ftp://updates.oracle.com/4547817/p4547817_10202_WINNT64.zip
oracle 10.2.0.3 patch:
ftp://updates.oracle.com/5337014/p5337014_10203_WINNT.zip
ftp://updates.oracle.com/5337014/p5337014_10203_WINNT64.zip
ftp://updates.oracle.com/5337014/p5337014_10203_AIX5L.zip
ftp://updates.oracle.com/5337014/p5337014_10203_WINNT.zip
ftp://updates.oracle.com/5337014/p5337014_10203_WINNT.zip
ftp://updates.oracle.com/5337014/p5337014_10203_WINNT.zip
oracle 10.2.0.4 patch:
ftp://updates.oracle.com/6810189/p6810189_10204_AIX5L.zip
ftp://updates.oracle.com/6810189/p6810189_10204_LINUX.zip
ftp://updates.oracle.com/6810189/p6810189_10204_Linux-x86-64.zip
ftp://updates.oracle.com/6810189/p6810189_10204_Linux-x86.zip
ftp://updates.oracle.com/6810189/p6810189_10204_Win32.zip
ftp://updates.oracle.com/6810189/p6810189_10204_Win64.zip
Oracle9i
Oracle9i Database Release 2 Enterprise/Standard/Personal Edition for Windows NT/2000/XP
http://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk1.zip
http://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk2.zip
http://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk3.zip
Oracle9i Database Release 2 Enterprise/Standard/Personal/Client Edition for Windows XP 2003/Windows Server 2003 (64-bit)
http://download.oracle.com/otn/nt/oracle9i/9202/92021Win64_Disk1.zip
http://download.oracle.com/otn/nt/oracle9i/9202/92021Win64_Disk2.zip
Oracle9i Database Release 2 Enterprise/Standard Edition for Intel Linux
http://download.oracle.com/otn/linux/oracle9i/9204/ship_9204_linux_disk1.cpio.gz
http://download.oracle.com/otn/linux/oracle9i/9204/ship_9204_linux_disk2.cpio.gz
http://download.oracle.com/otn/linux/oracle9i/9204/ship_9204_linux_disk3.cpio.gz
Oracle9i Database Release 2 (9.2.0.4) Enterprise/Standard Edition for Linux x86-64
http://download.oracle.com/otn/linux/oracle9i/9204/amd64_db_9204_Disk1.cpio.gz
http://download.oracle.com/otn/linux/oracle9i/9204/amd64_db_9204_Disk2.cpio.gz
http://download.oracle.com/otn/linux/oracle9i/9204/amd64_db_9204_Disk3.cpio.gz
Oracle9i Database Release 2 Enterprise/Standard Edition for AIX - Based 4.3.3 Systems (64-bit)
http://download.oracle.com/otn/aix/oracle9i/9201/server_9201_AIX64_Disk1.cpio.gz
http://download.oracle.com/otn/aix/oracle9i/9201/server_9201_AIX64_Disk2.cpio.gz
http://download.oracle.com/otn/aix/oracle9i/9201/server_9201_AIX64_Disk3.cpio.gz
http://download.oracle.com/otn/aix/oracle9i/9201/server_9201_AIX64_Disk4.cpio.gz
Oracle9i Database Release 2 Enterprise/Standard Edition for AIX- Based 5L Systems
http://download.oracle.com/otn/aix/oracle9i/9201/A99331-01.zip
http://download.oracle.com/otn/aix/oracle9i/9201/A99331-02.zip
http://download.oracle.com/otn/aix/oracle9i/9201/A99331-03.zip
http://download.oracle.com/otn/aix/oracle9i/9201/A99331-04.zip
Oracle9i Database Release 2 Enterprise/Standard Edition for Sun SPARC Solaris (32-bit)
http://download.oracle.com/otn/solaris/oracle9i/9201/92010Sol_Disk1.cpio.gz
http://download.oracle.com/otn/solaris/oracle9i/9201/92010Sol_Disk2.cpio.gz
http://download.oracle.com/otn/solaris/oracle9i/9201/92010Sol_Disk3.cpio.gz
Oracle9i Database Release 2 Enterprise/Standard Edition for Sun SPARC Solaris (64-bit)
http://download.oracle.com/otn/solaris/oracle9i64/9201/solaris64_9.2.0.1.0.Disk1.cpio.gz
http://download.oracle.com/otn/solaris/oracle9i64/9201/solaris64_9.2.0.1.0.Disk2.cpio.gz
http://download.oracle.com/otn/solaris/oracle9i64/9201/solaris64_9.2.0.1.0.Disk3.cpio.gz
http://MSTRWebURL?server={&SERVERNAME}&project={&PR OJECT}&evt
48001&ViewMode=2&documentID=[ProvideDocID]&originMe ssageID={&DOCUMENTMESSAGEID}&elementsPromptAnswers ={&[ProvideAttributeName]@GUID};{&[ProvideAttribut e Name]@ElementID}
mstrWeb?server={&SERVERNAME}&project={&PROJECT}&port=0&evt=4001&src=mstrWeb.4001&reportID={&[固定資本形成總額各年情況分析]:GUID}&originMessageID={&DOCUMENTMESSAGEID}&reportViewMode=2
package com.dbs.vote.common.test.excel;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import jxl.Cell;
import jxl.CellType;
import jxl.Sheet;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.VerticalAlignment;
import jxl.write.Formula;
import jxl.write.Label;
import jxl.write.NumberFormat;
import jxl.write.WritableCellFeatures;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
public class JExcelUtils {
/**
* 生成Excel文件
* @param path 文件路徑
* @param sheetName 工作表名稱
* @param dataTitles 數(shù)據(jù)標(biāo)題
*/
public void createExcelFile(String path,String sheetName,String[] dataTitles){
WritableWorkbook workbook;
try{
OutputStream os=new FileOutputStream(path);
workbook=Workbook.createWorkbook(os);
WritableSheet sheet = workbook.createSheet(sheetName, 0); //添加第一個工作表
initialSheetSetting(sheet);
Label label;
for (int i=0; i<dataTitles.length; i++){
//Label(列號,行號,內(nèi)容,風(fēng)格)
label = new Label(i, 0, dataTitles[i],getTitleCellFormat());
sheet.addCell(label);
}
//插入一行
insertRowData(sheet,1,new String[]{"200201001","張三","100","60","100","260"},getDataCellFormat(CellType.STRING_FORMULA));
//一個一個插入行
label = new Label(0, 2,"200201002",getDataCellFormat(CellType.STRING_FORMULA));
sheet.addCell(label);
label = new Label(1, 2,"李四",getDataCellFormat(CellType.STRING_FORMULA));
sheet.addCell(label);
insertOneCellData(sheet,2,2,70.5,getDataCellFormat(CellType.NUMBER));
insertOneCellData(sheet,3,2,90.523,getDataCellFormat(CellType.NUMBER));
insertOneCellData(sheet,4,2,60.5,getDataCellFormat(CellType.NUMBER));
insertFormula(sheet,5,2,"C3+D3+E3",getDataCellFormat(CellType.NUMBER_FORMULA));
//插入日期
mergeCellsAndInsertData(sheet, 0, 3, 5, 3, new Date(), getDataCellFormat(CellType.DATE));
workbook.write();
workbook.close();
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 初始化表格屬性
* @param sheet
*/
public void initialSheetSetting(WritableSheet sheet){
try{
//sheet.getSettings().setProtected(true); //設(shè)置xls的保護,單元格為只讀的
sheet.getSettings().setDefaultColumnWidth(10); //設(shè)置列的默認(rèn)寬度
//sheet.setRowView(2,false);//行高自動擴展
//setRowView(int row, int height);--行高
//setColumnView(int col,int width); --列寬
sheet.setColumnView(0,20);//設(shè)置第一列寬度
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 插入公式
* @param sheet
* @param col
* @param row
* @param formula
* @param format
*/
public void insertFormula(WritableSheet sheet,Integer col,Integer row,String formula,WritableCellFormat format){
try{
Formula f = new Formula(col, row, formula, format);
sheet.addCell(f);
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 插入一行數(shù)據(jù)
* @param sheet 工作表
* @param row 行號
* @param content 內(nèi)容
* @param format 風(fēng)格
*/
public void insertRowData(WritableSheet sheet,Integer row,String[] dataArr,WritableCellFormat format){
try{
Label label;
for(int i=0;i<dataArr.length;i++){
label = new Label(i,row,dataArr[i],format);
sheet.addCell(label);
}
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 插入單元格數(shù)據(jù)
* @param sheet
* @param col
* @param row
* @param data
*/
public void insertOneCellData(WritableSheet sheet,Integer col,Integer row,Object data,WritableCellFormat format){
try{
if(data instanceof Double){
jxl.write.Number labelNF = new jxl.write.Number(col,row,(Double)data,format);
sheet.addCell(labelNF);
}else if(data instanceof Boolean){
jxl.write.Boolean labelB = new jxl.write.Boolean(col,row,(Boolean)data,format);
sheet.addCell(labelB);
}else if(data instanceof Date){
jxl.write.DateTime labelDT = new jxl.write.DateTime(col,row,(Date)data,format);
sheet.addCell(labelDT);
setCellComments(labelDT, "這是個創(chuàng)建表的日期說明!");
}else{
Label label = new Label(col,row,data.toString(),format);
sheet.addCell(label);
}
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 合并單元格,并插入數(shù)據(jù)
* @param sheet
* @param col_start
* @param row_start
* @param col_end
* @param row_end
* @param data
* @param format
*/
public void mergeCellsAndInsertData(WritableSheet sheet,Integer col_start,Integer row_start,Integer col_end,Integer row_end,Object data, WritableCellFormat format){
try{
sheet.mergeCells(col_start,row_start,col_end,row_end);//左上角到右下角
insertOneCellData(sheet, col_start, row_start, data, format);
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 給單元格加注釋
* @param label
* @param comments
*/
public void setCellComments(Object label,String comments){
WritableCellFeatures cellFeatures = new WritableCellFeatures();
cellFeatures.setComment(comments);
if(label instanceof jxl.write.Number){
jxl.write.Number num = (jxl.write.Number)label;
num.setCellFeatures(cellFeatures);
}else if(label instanceof jxl.write.Boolean){
jxl.write.Boolean bool = (jxl.write.Boolean)label;
bool.setCellFeatures(cellFeatures);
}else if(label instanceof jxl.write.DateTime){
jxl.write.DateTime dt = (jxl.write.DateTime)label;
dt.setCellFeatures(cellFeatures);
}else{
Label _label = (Label)label;
_label.setCellFeatures(cellFeatures);
}
}
/**
* 讀取excel
* @param inputFile
* @param inputFileSheetIndex
* @throws Exception
*/
public ArrayList<String> readDataFromExcel(File inputFile, int inputFileSheetIndex){
ArrayList<String> list = new ArrayList<String>();
Workbook book = null;
Cell cell = null;
WorkbookSettings setting = new WorkbookSettings();
java.util.Locale locale = new java.util.Locale("zh","CN");
setting.setLocale(locale);
setting.setEncoding("ISO-8859-1");
try{
book = Workbook.getWorkbook(inputFile, setting);
}catch(Exception e){
e.printStackTrace();
}
Sheet sheet = book.getSheet(inputFileSheetIndex);
for (int rowIndex = 0; rowIndex < sheet.getRows(); rowIndex++) {//行
for (int colIndex = 0; colIndex < sheet.getColumns(); colIndex++) {//列
cell = sheet.getCell(colIndex, rowIndex);
//System.out.println(cell.getContents());
list.add(cell.getContents());
}
}
book.close();
return list;
}
/**
* 得到數(shù)據(jù)表頭格式
* @return
*/
public WritableCellFormat getTitleCellFormat(){
WritableCellFormat wcf = null;
try {
//字體樣式
WritableFont wf = new WritableFont(WritableFont.TIMES,12, WritableFont.NO_BOLD,false);//最后一個為是否italic
wf.setColour(Colour.RED);
wcf = new WritableCellFormat(wf);
//對齊方式
wcf.setAlignment(Alignment.CENTRE);
wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
//邊框
wcf.setBorder(Border.ALL,BorderLineStyle.THIN);
//背景色
wcf.setBackground(Colour.GREY_25_PERCENT);
} catch (WriteException e) {
e.printStackTrace();
}
return wcf;
}
/**
* 得到數(shù)據(jù)格式
* @return
*/
public WritableCellFormat getDataCellFormat(CellType type){
WritableCellFormat wcf = null;
try {
//字體樣式
if(type == CellType.NUMBER || type == CellType.NUMBER_FORMULA){//數(shù)字
NumberFormat nf = new NumberFormat("#.00");
wcf = new WritableCellFormat(nf);
}else if(type == CellType.DATE || type == CellType.DATE_FORMULA){//日期
jxl.write.DateFormat df = new jxl.write.DateFormat("yyyy-MM-dd hh:mm:ss");
wcf = new jxl.write.WritableCellFormat(df);
}else{
WritableFont wf = new WritableFont(WritableFont.TIMES,10, WritableFont.NO_BOLD,false);//最后一個為是否italic
wcf = new WritableCellFormat(wf);
}
//對齊方式
wcf.setAlignment(Alignment.CENTRE);
wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
//邊框
wcf.setBorder(Border.LEFT,BorderLineStyle.THIN);
wcf.setBorder(Border.BOTTOM,BorderLineStyle.THIN);
wcf.setBorder(Border.RIGHT,BorderLineStyle.THIN);
//背景色
wcf.setBackground(Colour.WHITE);
wcf.setWrap(true);//自動換行
} catch (WriteException e) {
e.printStackTrace();
}
return wcf;
}
/**
* 打開文件看看
* @param exePath
* @param filePath
*/
public void openExcel(String exePath,String filePath){
Runtime r=Runtime.getRuntime();
String cmd[]={exePath,filePath};
try{
r.exec(cmd);
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
String[] titles = {"學(xué)號","姓名","語文","數(shù)學(xué)","英語","總分"};
JExcelUtils jxl = new JExcelUtils();
String filePath = "E:/test.xls";
jxl.createExcelFile(filePath,"成績單",titles);
jxl.readDataFromExcel(new File(filePath),0);
jxl.openExcel("C:/Program Files/Microsoft Office/OFFICE11/EXCEL.EXE",filePath);
}
}