http://blog.csdn.net/weikaifenglove/article/details/4059258 昨天在做測試的時候發現一個非常奇怪的問題:在程序的查詢模塊中做查詢的時候,開始速度很快,但是過了一段時間以后速度就變慢,最后干脆就報錯,不工作了。在排錯的過程中,發現Oracle臨時表空間暴漲,達到了幾十個GB,在Oracle中對Session進行跟蹤,發現磁盤空間還在不停的消耗,幾乎是每隔5s,臨時表空間就會增長500MB左右,最后報錯的原因應該是因為沒有磁盤空間可以分配造成的。這是一件十分恐怖的事情。
我們知道Oracle臨時表空間主要是用來做查詢和存放一些緩存的數據的,磁盤消耗的一個主要原因是需要對查詢的結果進行排序,如果沒有猜錯的話,在磁盤空間的(內存)的分配上,Oracle使用的是貪心算法,如果上次磁盤空間消耗達到1GB,那么臨時表空間就是1GB,如果還有增長,那么依此類推,臨時表空間始終保持在一個最大的上限。像上文提到的恐怖現象經過分析可能是以下幾個方面的原因造成的。
1. 沒有為臨時表空間設置上限,而是允許無限增長。但是如果設置了一個上限,最后可能還是會面臨因為空間不夠而出錯的問題,臨時表空間設置太小會影響性能,臨時表空間過大同樣會影響性能,至于需要設置為多大需要仔細的測試。
2.查詢的時候連表查詢中使用的表過多造成的。我們知道在連表查詢的時候,根據查詢的字段和表的個數會生成一個迪斯卡爾積,這個迪斯卡爾積的大小就是一次查詢需要的臨時空間的大小,如果查詢的字段過多和數據過大,那么就會消耗非常大的臨時表空間。
3.對查詢的某些字段沒有建立索引。Oracle中,如果表沒有索引,那么會將所有的數據都復制到臨時表空間,而如果有索引的話,一般只是將索引的數據復制到臨時表空間中。
針對以上的分析,對查詢的語句和索引進行了優化,情況得到緩解,但是需要進一步測試。
總結:
1.SQL語句是會影響到磁盤的消耗的,不當的語句會造成磁盤暴漲。
2.對查詢語句需要仔細的規劃,不要想當然的去定義一個查詢語句,特別是在可以提供用戶自定義查詢的軟件中。
3.仔細規劃表索引。
臨時表空間使用注意:
1.臨時表空間 是用于在進行排序操作(如大型查詢,創建索引和聯合查詢期間存儲臨時數據)
每個用戶都有一個臨時表空間
2.對于大型操作頻繁,(大型查詢,大型分類查詢,大型統計分析等),應指定單獨的臨時表空間,以方便管理
3.分配用戶單獨臨時表空間,一般是針對 大型產品數據庫,OLTP數據庫,數據庫倉庫
對于小型產品不需要單獨制定臨時表空間,使用默認臨時表空間
原文鏈接:http://blog.csdn.net/weikaifenglove/article/details/4059258
本文介紹的是C#編寫的winform程序脫離.net框架的方法。【也支持VB.NET和C++.NET】
原文地址:http://hi.baidu.com/44498/blog/item/dabd37166a11bd10962b437d.html
很多朋友會問,為何選擇C# ?其實原因很簡單,因為它具有其他任何語言都不具備的生產力。
軟件工程的發展,主要目的也就是提高生產力,這個核心不變,我們的學習方向也就不變。
本文代碼示例支持.NET FRAMEWORK 2.0 ,3.0 , 3.5 ,LINQ等先進的解決方案。
一看就懂,一學就會,一目了然。。。
以下所有例子,均經過測試,在2k,xp,2003,vista,2008,Win7下都是可以運行的。也包括X86和X64平臺。
聲明:本文講解的是解決方案,并不提供下載【主要是沒有穩定的網盤】,
---------------------------------------------------------
1, .Net Linker :中國移動的飛信就利用了它的核心。飛信是使用C#在.NET上開發的。貴,最便宜的版本要1000多美金。【傻瓜式操作,這里不做介紹】
2,用飛信的虛擬機來引導自己開發的.NET程序。
3,使用mono來達到脫離.NET框架的效果,可以跨平臺。【完美支持.net2.0,以及絕大多數.NET3.5,目前已經支持WPF系列新技術了】
///////////////////////實驗過程/////////////////////////
例子1:先說最簡單的,使用飛信虛擬機來試驗吧。
【不要引用VB編寫的控件或者是類庫,因為飛信的虛擬機功能很少】
先安裝"飛信2008 3.5版",然后打開安裝目錄,里面有個VMDotNet文件夾,里面就是.NET虛擬環境相關文件了,找到飛信安裝目錄下的"VMDotNet\v2.0.50727\FetionVM.exe"來啟動運行我們的.NET WinForm程序:
【可以使用命令行來傳值也可以用其他方式,都是一樣的】例如:
WinExec("FetionVM.exe 我的程序.exe", SW_SHOW); //C++ code
為了方便,我們可以編寫一個檢測.net框架版本的程序作為引導程序,如果已經安裝了.net框架就不用虛擬機,如果沒有安裝,調用虛擬器來啟動程序。【請不要使用C#或者其他托管類型的語言來編寫這個引導程序,否則失去了意義】。
很容易吧?但是有個弊端,你的.NET程序如果要操作類似于SQL SERVER2000,2005,2008 或者是MYSQL,Oracle,DB2等數據庫,用這個飛信自帶的虛擬機實現就比較麻煩,所以這個飛信的虛擬機只能做簡單的程序應用。還有一點大家要注意,使用飛信的虛擬機,涉及到的還有版權問題。測試一下,壓縮以后文件大概是6,7M左右,還行。
例子2:使用MONO來脫離框架并且跨平臺。注:測試結果顯示,使用MONO啟動.NET程序速度是最快的。
首先到MONO的官方網站下載源代碼或者最新版本,然后安裝,我用的是2.2版本【目前已經有2.4版本了,比較新,支持的更多】。
為了方便各位朋友試驗,我提供我本次試驗的MONO版本2.2 :
下載地址:
安裝完畢,打開目錄,找到兩個子目錄,名字分別是bin,lib ,然后復制到另外一個目錄里面去【因為安裝的時候默認安裝在C盤的】然后把你的.net開發的程序也復制到這個目錄里面去;假設這個目錄名字叫做VM,那么你的這個文件夾里應該有個最少三個文件,一個是bin文件夾,一個是lib文件夾,還有一個就是你寫的.net程序了。
然后可以用C++編寫一個引導程序用來調用你的.NET程序;貼個簡單的代碼吧:
int main()
{
WinExec("bin\\mono.exe 你的應用程序.exe",SW_SHOWNORMAL);
return 0;
}
當然,為了方便,你可以自己在邏輯里面判斷一下,機器里安裝的是.NET的哪個版本?如果版本低了,就調用MONO來執行,如果匹配,就不調用MONO了。
【這個例子只是支持簡單的WINFORM和數據庫訪問,WEBSERVICE的,在文章末尾】
如果按照我說的一路操作,肯定是可以運行的了,但是你會發現,現在你的.NET程序是一個綠色軟件,但是他所在的目錄下lib,或者是bin文件夾的大小是非常恐怖的。。。有300M以上的大小,這豈不是和我們的想法沖突了?當然不是;我們來精簡目錄吧:
在bin目錄下,保留以下文件,其他的刪除即可

然后打開lib文件夾,在2.0文件夾下保留Accessibility.dll,mscorlib.dll,mscorlib.dll.mdb,然后在GAC文件夾里面保留以下文件夾【下圖中的類庫全部保留,最好不要刪除】:
這樣,整個目錄就精簡的差不多了,當然,你可以根據自己的需要定制需要的各種類庫。然后打包即可,以我本人機器為例,壓縮后的文件是9.8M,比.NET 2.0的框架小了很多,但是比飛信的那個虛擬機還是大了一些;換個角度來看,用mono不涉及版權問題,也可以調用各種數據庫,我本機測試操作的是SQL SERVER 2005數據庫,一切正常。讓你的.NET程序也跨平臺吧!只有MONO能做到這一點。
本文原創,抄襲的別太過分哦,最起碼也專業點,別圖片都不貼就發布,
耽誤別人學習,那才是最大的犯罪。。。
例子3:使用.Net Linker 的一個老版本來測試的
通過命令行來提取.net環境的一些類庫文件,然后模擬,不知道飛信用的是哪個版本,反正我這個老版本是不太好用,要手動精簡目錄的。
但是唯一的好處就是兼容性比較好,而且不限制數據庫的使用。這個也涉及到版權問題,就不啰嗦了。
精簡后的文件大小是8.66M,一般的應用都可以滿足了,呵呵。
好了,時間不早了,睡覺了。歡迎大家留言,提出各種不同的見解。
更新:2009年3月30日
抽空拿到了.Net Linker 的破解版,用了一下還是不錯的,穩定性很好,兼容多種數據庫。美中不足的是有了MONO的比較,用.net linker虛擬機以后,程序啟動的時候速度稍微慢了一點,和飛信的啟動速度一樣。。。不過這也沒辦法,忍了。
更新:2009年4月14日 支持web service
今天看到一個朋友咨詢MONO平臺上調用webservice的問題;事實上,MONO是完全支持web service的 ;我這里也做個示例吧。
新建一個項目,winform的,版本是.net2.0;然后添加一個引用,引用我們準備好的web服務。
引用的url:http://www.ayandy.com/, 這個web服務的功能是天氣預報那種的,包括國內外400多個主要城市。【如果圖片不清晰,可以保存到本地然后查看。】

然后,引用好了,就調用吧~ 我這里例子顯示的是北京當天的天氣。
然后運行程序:

我的機器上有.net 3.5,當然沒問題,但是我們要是在其他機器上呢?
切換到虛擬機里,虛擬機是xp sp2,沒有安裝.NET任何版本的框架;
把程序復制到mono的目錄中,運行之。。。

可以看到,沒有任何問題。。。這里用的MONO版本是2.2,支持的很好。
大家可以看到,整個winform程序的按鈕,字體樣式都做了改變,
因為MONO是在LINUX上的解決方案,沒有使用微軟默認的字體和樣式。
本文偶爾更新,更新時間不確定。感謝大家的關注。。。
有問題可以留言。。。下一篇日志《使用托管C++【c++.net】脫離.NET框架實戰》
2009.04.23 更新:
關于有些朋友提出,MONO到底支持多少種數據庫的問題,其實MONO支持的數據庫絕對比我們想象的多,幾乎是很多我們都沒有用過的。。。好了,我給個清單,讓大家心里有數。最近上網少,資料也沒怎么查,就先拿個05年的文章參考一下吧。
Mono Supported Database Access- -
Mono has many ADO.NET Data Providers to get you connected.
Providers for Open Source databases:
PostgreSQL: Npgsql is fully managed provider for PostgreSQL and is actively maintained
SQL Lite: actively maintained. Requires sqlite library.
Firebird Interbase: fully managed provider for Firebird and is actively maintained.
MySQL: use the MySQL Connector/Net from MySQL AB which is fully managed and actively maintained by MySQL AB, but it is not included with Mono. There is the ByteFX.Data.MySqlClient provider which is not actively maintained, but it is included with Mono.
Providers for commercial databases:
IBM DB2 Universal Database Requires DB2 client software
ODBC requires ODBC software which is available for Unix and Windows
Oracle requires client software including Oracle Call Interface
OLE DB Requires libgda (http://www.gnome-db.org/) System.Data.OleDb is not actively maintained plus it only works on Linux with GNOME 2.x
Microsoft SQL Server fully managed provider which is actively maintained for Microsoft SQL Server 7.0/2000/2005 databases
Sybase fully managed provider for Sybase 12.x databases and is actively maintained
Older Microsoft SQL Server and Sybase databases Not actively maintained.
Alternative to ADO.NET is GdaSharp (Gnome Data Access)
Gnome Data Access (http://www.gnome-db.org/) GdaSharp is C# bindings to GDA (GNOME Data Access) and is included with GtkSharp (http://www.mono-project.com/GtkSharp), but it requires libgda be installed. Works only on Linux with GNOME 2.x installed.
External Projects that have created ADO.NET Providers that work on Mono:
MySQL Connector/Net from MySQL AB (http://dev.mysql.com/downloads/connector/net/) is the .NET and Mono data provider for MySQL
ByteFX.Data.MySqlClient (http://sourceforge.net/projects/mysqlnet/) is a MySQL Managed data provider. ByteFX.Data is no longer actively developed, but it is included with Mono. Please use the MySQL Connector/Net provider from MySQL AB instead.
NPgsql (http://gborg.postgresql.org/project/npgsql/projdisplay.php) is a fully managed provider for PostgreSQL and is included with Mono.
Firebird (http://sourceforge.net/projects/firebird/) fully managed provider for Firebird databases and is included with Mono.
Advanced Data Provider (http://advanced-ado.sourceforge.net/) ADP, is a transparent factory for ADO.NET which loads providers dynamically.
Other Projects
DB40 (http://www.mono-project.com/DB4O) Open source object database for C#
2009.05.27 更新
要注意的是,在X86下編譯的程序,如果選擇ANYCPU,那么提取后的程序可以在X64下運行。
但是,如果是編譯的時候選擇X64,那就無法通過LINKER提取。