在這里工作也有半年了,有得有失. 近來(lái)心里十分的茅盾, 項(xiàng)目已經(jīng)黃色第5周了.我還是沒(méi)有去改變它. 我不知道是自己不行, 還是自己不想. 學(xué)了不多的自我激勵(lì)方法, 可是都不見(jiàn)效果. 也知道這個(gè)時(shí)候只有自己才能解救自己.
2.???? 如何建立一個(gè)透明的From
3.???? 如何設(shè)置窗體在屏幕中的位置
4.???? 如何使最小化和最大化按鈕不可用
5.???? 如何使一個(gè)窗體不見(jiàn)
6.???? 如何設(shè)置使窗體成為非矩形的.
7.???? 如何使一個(gè)窗體在屏幕的最頂端.
8.???? 如何顯示一個(gè)Model和非Model的窗體
9.???? 如何制作一個(gè)MDI的窗體
10.? 如何將你的窗體不顯示在任務(wù)條上.
11.? 如何制作一個(gè)帶啟動(dòng)屏幕的窗體.
12.? 如何使你的窗體TrayIcon.
13.? 如何修改控制窗體的尺寸和長(zhǎng)寬尺寸.
14.? 如何建立一個(gè)Windows Explorer風(fēng)格的窗體.
15.? 如何設(shè)置初始的啟動(dòng)窗體
16.? 如何建立一個(gè)有背景圖像的窗體
==========================================================================================
1.???? 如何設(shè)置一個(gè)From的邊界
form總共有七種不同的邊界風(fēng)格讓你設(shè)置,你可以在設(shè)計(jì)時(shí)刻也可以運(yùn)行時(shí)通過(guò)代碼動(dòng)態(tài)的來(lái)設(shè)置它.這七種邊界風(fēng)格分別是:
none (System.Windows.Forms.FormBorderStyle.None )
fixed 3D (System.Windows.Forms.FormBorderStyle.Fixed3D)
fixed Dialog (System.Windows.Forms.FormBorderStyle.FixedDialog)
fixed Single(System.Windows.Forms.FormBorderStyle.FixedSingle)
fixed Tool Window(System.Windows.Forms.FormBorderStyle.FixedToolWindow)
sizable(system.windows.forms.formborderstyle.sizable)
sizable? Tool Window
(system.windows.forms.formborderstyle.sizabletoolwindow)
在設(shè)計(jì)方式下在vs.net IDE的 Properties window中設(shè)置FormBorderStyle屬性就可以了.
在運(yùn)行方式下你可以用代碼來(lái)完成:
dlgbx1.formborderstyle = System.Windows.Forms.FormBorderStyle.FixedDialog
這七種邊界類(lèi)型VB6中就有,沒(méi)有什么大的變化,運(yùn)行方式下你需要對(duì)照不同的枚舉變量進(jìn)行設(shè)置.
?
2.???? 如何建立一個(gè)透明的From
你可以通過(guò)兩種方法在設(shè)計(jì)時(shí)刻和運(yùn)行時(shí)刻來(lái)做到這一點(diǎn).
設(shè)計(jì)時(shí)刻,你可以在vs.net IDE的 Properties window, 設(shè)置Opacity 屬性達(dá)到這個(gè)效果.這個(gè)值從0.0到1.0 . 0表示完全透明,1.0表示完全不透明.
運(yùn)行時(shí)刻你可以用下面的編碼設(shè)置窗體的opactiy屬性來(lái)做到.具體:
frmtransparentform.opacity = 0.76; ( C# )
看得出現(xiàn)在很簡(jiǎn)單了,你已經(jīng)不用再去了解什么alpha變量了.透明始終只是一種效果,不要濫用它.
?
3.???? 如何設(shè)置窗體在屏幕中的位置
你可以設(shè)置窗體的startposition屬性,vs.net一般給你一個(gè)保守的選項(xiàng)” WindowsDefaultLocation“ 這樣系統(tǒng)在Load窗體時(shí)將根據(jù)用戶當(dāng)前的計(jì)算機(jī)設(shè)置來(lái)確定一個(gè)值,你也可以在設(shè)計(jì)時(shí)將它改成另一個(gè)值”Center”.
如果你一定要在設(shè)計(jì)方式下確定窗體在屏幕出現(xiàn)的位置你可以先設(shè)置startposition為manual,然后設(shè)置location的x和y的值.
運(yùn)行時(shí)用代碼實(shí)現(xiàn)似乎更簡(jiǎn)潔一些:
? Form1.Location = new Point (100, 100) ( VB.NET )
當(dāng)然你也可以分別修改的Location的X和Y值,對(duì)應(yīng)的是窗體的Left和Top屬性,比如:
form1.left += 200 ( VB.NET )
form1.top -= 100 ( VB.NET )
另外一個(gè)屬性將也將影響窗體在屏幕的位置:desktoplocation 這個(gè)屬性主要是在你設(shè)置窗體的位置相對(duì)于任務(wù)欄時(shí)非常實(shí)用(當(dāng)你把任務(wù)條放在屏幕的頂或左邊時(shí),其實(shí)相應(yīng)改動(dòng)了desktop coordinates (0,0)),你可以這樣設(shè)置這個(gè)不出現(xiàn)在設(shè)計(jì)屬性窗口中的屬性,
form1.desktoplocation = new Point (100,100)
窗體在屏幕中的位置將主要取決于各自用戶具體的硬件和設(shè)置情況,所以保守的作法是用默認(rèn)的” WindowsDefaultLocation”或 ”Center”;專(zhuān)業(yè)的作法是自己先獲取系統(tǒng)的設(shè)置然后編碼動(dòng)態(tài)計(jì)算后進(jìn)行設(shè)置,不然很容易在屏幕上找不到你的窗體.
?
4.???? 如何使最小化和最大化按鈕不可用
在設(shè)置窗體的form.minimizebox和form.maximizebox 當(dāng)為T(mén)rue時(shí)表示顯示,False時(shí)表示不可.用編程方式見(jiàn)下:
frmmaxmin.minnimizebox = False ( VB.NET)
frmmaxmin.maxmnimizebox = True? ( VB.NET )
?
5.???? 如何使一個(gè)窗體不見(jiàn)
我想最直接的辦法是你調(diào)用 Hide()方法來(lái)做到這一點(diǎn).不過(guò)我想提供另一種方法,看了之后你會(huì)獲得一些其它的啟發(fā). ( VB.NET )
??? Private Const WS_EX_TOOLWINDOW As Int32 = &H80
??? Private Const WS_POPUP As Int32 = &H80000000
??? Private Const WS_VISIBLE As Int32 = &H10000000
??? Private Const WS_SYSMENU As Int32 = &H80000
??? Private Const WS_MAXIMIZEBOX As Int32 = &H10000
?
??? Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
??????? Get
??????????? Dim cp As System.Windows.Forms.CreateParams
??????????? cp = MyBase.CreateParams
??????????? cp.ExStyle = WS_EX_TOOLWINDOW
??????????? cp.Style = WS_POPUP Or WS_VISIBLE Or WS_SYSMENU Or WS_MAXIMIZEBOX
??????????? cp.Height = 0
??????????? cp.Width = 0
??????????? Return cp
??????? End Get
??? End Property
??? 原來(lái)是把Height 和Width都設(shè)置成0 ,我想這種方式和Hide()調(diào)用的底層可能是不同的。
?
6.???? 如何設(shè)置使窗體成為非矩形的.
這個(gè)問(wèn)題我想我提供的不是最專(zhuān)業(yè)的作法,至少它還不能達(dá)到我期望的那樣,也就是說(shuō)它在某些事件中它還會(huì)變回矩形.但至少我可以告訴你:如果試圖調(diào)用原來(lái)的win32’s API SetWindowRng是不行的,我曾如此的嘗試過(guò).現(xiàn)在你可能需要知道有關(guān)窗體的Region屬性
???? ' // ( VB.NET )?
??? Public Sub SetWindowRegion()
?
??????? Dim FormPath As System.Drawing.Drawing2D.GraphicsPath
??????? Dim Reg As Drawing.Region
??????? Dim lRet As Long
?
??????? FormPath = New Drawing2D.GraphicsPath()
??????? FormPath.AddEllipse(New Rectangle(0, 0, 250, 120))
?
??????? Me.Region = New Region(FormPath)
?
??? End Sub
?
??? Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
??????? Me.Region = Nothing
??????? SetWindowRegion()
??? End Sub
?
??? Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
????????? Me.Region = Nothing
????????? SetWindowRegion()
??? End Sub
?
7.???? 如何使一個(gè)窗體在屏幕的最頂端.
這是很實(shí)用的一個(gè)功能,現(xiàn)在你不用在調(diào)用其它api了,只用設(shè)置topmost 屬性為T(mén)rue就可以了.對(duì)于這個(gè)屬性在設(shè)計(jì)時(shí)刻和運(yùn)行時(shí)刻都是可以進(jìn)行修改的.代碼方式:
???????? myTopForm.TopMost = True ( VB.NET)
?
8.???? 如何顯示一個(gè)Model和非Model的窗體
model和modeless的窗體主要將取決于你的應(yīng)用,最多的是用在顯示對(duì)話框.當(dāng)你需要model的窗體時(shí)你調(diào)用myform. ShowDialog而非Model的調(diào)用MyForm.Show,對(duì)于ShowDialog有一個(gè)可選參數(shù)ower可以讓你為一個(gè)窗體建立父子關(guān)系.比如:
' Visual Basic
Private Sub mnuAbout_Click(…args…)
?? Dim f As New FormOption
?? f.ShowDialog Me
End Sub
有一點(diǎn)需要注意的是對(duì)于ShowDialog來(lái)說(shuō),當(dāng)執(zhí)行到這一句,窗體顯示,但這之后的代碼將不會(huì)執(zhí)行,只到窗口關(guān)閉之后才繼續(xù)執(zhí)行,而對(duì)于Show來(lái)說(shuō)是即時(shí)的,顯示窗體之后將立即執(zhí)行下面的代碼.
9.???? 如何制作一個(gè)MDI的窗體
1.???? 建立一個(gè)新的Windows Application項(xiàng)目
2.???? 分別加入兩個(gè)窗體Form1 、Form2
3.???? 設(shè)置Form1的IsMdiContainer屬性為T(mén)rue。使它成為MDI主窗體。
4.???? 在Form2中加入一個(gè)RichTextBox控件,并設(shè)置Dock為:Fill
5.???? 在Tools 窗體中拖一個(gè)MainMenu到窗體Form1,然后建立一個(gè)菜單File|Windows|Help三個(gè)菜單項(xiàng),F(xiàn)ile中包括New、Exit菜單項(xiàng);Windows中包括Cascade、Horizontal等。
6.???? 設(shè)置Windows菜單項(xiàng)的MdiList屬性=True, 這樣每一個(gè)MDI子窗口將自動(dòng)加在Windows菜單項(xiàng)下面。
7.???? 雙擊New菜單項(xiàng),然后加入以下代碼:
???? private void menuNew_Click(object sender, System.EventArgs e)
???? {
???????? Form2? NewMdiChild ;
???????? NewMdiChild = new Form2() ;
???????? NewMdiChild.MdiParent = this ;
???????? NewMdiChild.Show() ;
?
???? }
8.???? 在Windows的Cascade等菜單項(xiàng)中加入以下代碼:
???? private void menuWindowCasca_Click(object sender, System.EventArgs e)
???? {
???????? this.LayoutMdi( MdiLayout.Cascade) ;
????????
???? }
另外還有以下常用的:
this.layoutmdi(mdilayout.tilehorizontal);
this.layoutmdi(mdilayout.tilevertical);
9.???? F5運(yùn)行。
最終版的vs.net 不知是否會(huì)有一個(gè)通用的模板,不過(guò)用完全手工的方式產(chǎn)生一個(gè)MDI的窗口,顯得有些繁瑣,不如VS.NET的IDE方式下那么簡(jiǎn)潔。
?
10.???? 如何將你的窗體不顯示在任務(wù)條上.
當(dāng)窗體的邊界風(fēng)格是tools Window時(shí)它都不會(huì)出現(xiàn)在任務(wù)條上的.另外上面標(biāo)題5中介紹的方法不僅窗體看不見(jiàn),也不會(huì)出現(xiàn)在任務(wù)條上.
??? 如果你現(xiàn)在在Dotnet的世界,這件事也變的簡(jiǎn)單,任何的Winform窗體現(xiàn)在都有ShowInTaskbar屬性,所以你只要簡(jiǎn)單的設(shè)置這個(gè)屬性就可以了。同樣你可以選擇在屬性窗口中將ShowInTaskbar由True改為False。或是用代碼的方式:
??? MyTaskBarFrm.ShowInTaskbar = false ; ( C# )
?
11.???? 如何制作一個(gè)帶啟動(dòng)屏幕的窗體.
需要你準(zhǔn)備兩個(gè)winform的窗體,一個(gè)叫它:splashscreen,把它做成一個(gè)漂亮的窗體。然后你需要一個(gè)主窗體叫它:form1吧,然后在這個(gè)窗體加入下面的代碼。
???? // ( C# )
???? protected override void OnLoad ( System.EventArgs e )
???? {
???????? //make load take a long time
???????? Thread.Sleep(2000);
?
???????? base.OnLoad(e);
?
???? }
然后在main中加入這樣的代碼:
???? [STAThread]
???? static void Main()
???? {
???????? SplashScreen splashForm = new SplashScreen();
???????? splashForm.Show();
?
???????? Form1 mainForm = new Form1() ;
???????? mainForm.Load += new EventHandler(splashForm.MainScreen_Load);
???????? Application.Run(mainForm);
?
???? }
不要忘了加上對(duì)threading的引用: using System.Threading;
?
12.???? 如何使你的窗體TrayIcon.
實(shí)現(xiàn)這個(gè)功能你可以運(yùn)用notifyicon控件來(lái)達(dá)到,從tools Windows中將NotifyIcon拖到你的窗體上然后在下面的事件加入如下代碼,F(xiàn)5。
????
?? ' // VB.NET
??? Private mIconA As Icon = New Icon("Icon1.ico")
??? Private mIconB As Icon = New Icon("Icon2.ico")
??? Private mIconDisplayed As Boolean
???
??? Public Sub New()
??????? MyBase.New
?
??????? Form1 = Me
?
??????? 'This call is required by the Win Form Designer.
??????? InitializeComponent
?
??????? 'TODO: Add any initialization after the InitializeComponent() call
???????
??????? 'this form isn't used directly so hide it immediately
??????? Me.Hide()
???????
??????? 'setup the tray icon
??????? Initializenotifyicon()
??? End Sub
???
??? Private Sub Initializenotifyicon()
??????? 'setup the default icon
??????? notifyicon = New System.Windows.Forms.NotifyIcon()
??????? NotifyIcon.Icon = mIconA
??????? NotifyIcon.Text = "Right Click for the menu"
??????? NotifyIcon.Visible = True
??????? mIconDisplayed = True
?
??????? 'Insert all MenuItem objects into an array and add them to
??????? 'the context menu simultaneously
??????? Dim mnuItms(3) As MenuItem
??????? mnuItms(0) = New MenuItem("Show Form...", New EventHandler(AddressOf Me.ShowFormSelect))
??????? mnuItms(0).DefaultItem = True
??????? mnuItms(1) = New MenuItem("Toggle Image", New EventHandler(AddressOf Me.ToggleImageSelect))
??????? mnuItms(2) = New MenuItem("-")
??????? mnuItms(3) = New MenuItem("Exit", New EventHandler(AddressOf Me.ExitSelect))
??????? Dim notifyiconMnu As ContextMenu = New ContextMenu(mnuItms)
??????? notifyicon.ContextMenu = notifyiconMnu
??? End Sub
?
??? Public Sub ShowFormSelect(ByVal sender As Object, ByVal e As System.EventArgs)
??????? 'Display the settings dialog
??????? Dim SettingsForm As New SettingsForm()
??????? SettingsForm.ShowDialog()
?
??? End Sub
?
??? Public Sub ToggleImageSelect(ByVal sender As Object, ByVal e As System.EventArgs)
??????? 'called when the user selects the 'Toggle Image' context menu
?
??????? 'determine which icon is currently visible and switch it
??????? If mIconDisplayed Then
??????????? 'called when the user selects the 'Show Form' context menu
??????????? NotifyIcon.Icon = mIconB
??????????? NotifyIcon.Text = "Sad"
??????????? mIconDisplayed = False
??????? Else
??????????? NotifyIcon.Icon = mIconA
??????????? NotifyIcon.Text = "Happy"
??????????? mIconDisplayed = True
??????? End If
?
??? End Sub
?
??? Public Sub ExitSelect(ByVal sender As Object, ByVal e As System.EventArgs)
??????? 'called when the user selects the 'Exit' context menu
?
??????? 'hide the tray icon
??????? NotifyIcon.Visible = False
?
??????? 'close up
??????? Me.Close()
??? End Sub
?
??? 'Form overrides dispose to clean up the component list.
??? Public Overloads Overrides Sub Dispose()
??????? MyBase.Dispose()
??????? components.Dispose()
??? End Sub
??? 圖標(biāo)文件你自己準(zhǔn)備了,如果成功你可以看到有關(guān)NotifyIcond的各種功能了。
?
13.???? 如何修改控制窗體的尺寸和長(zhǎng)寬尺寸.
主要是修改winform的size, Width 和Height屬性。同樣它們都是可以在設(shè)計(jì)和運(yùn)行時(shí)刻進(jìn)行修改和設(shè)置。
form1.size = New System.Drawing.Size(100, 100) ( VB.NET )
form1.width += 100? (VB.NET )
form1.height -= 20? (VB.NET )
?
14.???? 如何建立一個(gè)Windows Explorer風(fēng)格的窗體.
1.建立一個(gè)新的windows Application
2.從toolbox窗口拖一個(gè)treeview控件、、一個(gè)splitterk控件、一個(gè)listview控件,分別在屬性窗口中設(shè)置treeview的dock屬性為::left;設(shè)置listview控件的dock屬性為:fill
3: F5 運(yùn)行
?
15.???? 如何設(shè)置初始的啟動(dòng)窗體
無(wú)論是c#還是visual Basic的Winform項(xiàng)目中你都可以在Solution Explorer窗口中右鍵你的Project,然后選擇屬性,從你Project的屬性頁(yè)中選擇你啟動(dòng)的窗體或是Main()方法。
有些不同的是在目前的vs.net Beta2中C#項(xiàng)目會(huì)自動(dòng)產(chǎn)生Main() 方法,Visual Basic.Net 的項(xiàng)目中你必須自己添加Main()代碼,C#中你可以將Form1改成任何你可以啟動(dòng)的窗體名:
???? // ( C# )
??????? static void Main()
??????? {
??????????? Application.Run(new Form1());
??????? }
?
16.???? 如何建立一個(gè)有背景圖像的窗體
現(xiàn)在的winform中所有的窗體都有一個(gè)backgroundimage屬性,只用對(duì)它賦值就可以了。普通窗體可以在運(yùn)行模式也可以在運(yùn)行模式完成這個(gè)設(shè)置。比如在initializecomponent()或窗體的構(gòu)造函數(shù)中加入這樣的代碼:
this.backgroundimage = new Bitmap("C:\\DotNetApp\\WinForm\\Tile.bmp" ) ;
??? 對(duì)于MDI的主窗體要麻煩一些,在VS.NET的IDE窗體中,當(dāng)你設(shè)置完IsMdiContainer屬性為T(mén)rue后,你需要查看一下InitializeComponent()中是否有這樣的代碼 ( C# ):
??????????? this.mdiClient1.Dock = System.Windows.Forms.DockStyle.Fill;
??????????? this.mdiClient1.Name = "mdiClient1";
或是在窗口的屬性窗口組合框中看到mdiclient1 System.Windows.Forms.mdiClient.這就是主MDI窗口,不過(guò)我沒(méi)有在dotnet的文檔中找到任何有關(guān)System.Windows.Forms.mdiClient的說(shuō)明。然后你可以在InitializeComponent()或窗體的構(gòu)造函數(shù)中加入這樣的代碼( C# ):
this.mdiclient1.backgroundimage? = new Bitmap("C:\\DotNetApp\\WinForm\\Tile.bmp" ) ;
??? 網(wǎng)上有一個(gè)ImageView的例子,里面演示了給MDI主窗體中背景上加入一行Logo文字的方法,這樣使你的MDI窗體看起來(lái)很商業(yè)化,具體的你可以這樣做:
1.?? 先在VS.NET 自動(dòng)產(chǎn)生代碼的InitializeComponent中看是否有這樣的語(yǔ)句( C# ):
this.controls.addrange(new System.Windows.Forms.Control[] {this.mdiClient1});
??? 又是這個(gè)mdiClient (haha)
2.?? 建立以下兩個(gè)函數(shù)用于顯示這個(gè)Logo字符:
// ( C# )
??????? protected? void Mdi_OnPaint (? Object s,? System.Windows.Forms.PaintEventArgs e )
??????? {
??????????? Control c = (Control)s;
???????????
?
??????????? Rectangle r1 = c.ClientRectangle;
??????????? r1.Width -= 4;
??????????? r1.Height -= 4;
?
??????????? Rectangle r2 = r1;
??????????? r2.Width -= 1;
??????????? r2.Height -= 1;
?
??????????? Font f = new Font("Tahoma", 8);
?
??????????? String str = "MyWinform.NET ?2001 MyWinform Application V1.0";
?
??????????? StringFormat sf = new StringFormat();
??????????? sf.Alignment = StringAlignment.Far;
??????????? sf.LineAlignment = StringAlignment.Far;
?
??????????? e.Graphics.DrawString(str, f, new SolidBrush(SystemColors.ControlDarkDark), r1, sf);
??????????? e.Graphics.DrawString(str, f, new SolidBrush(SystemColors.ControlLight), r2, sf);
?
??????? }
?
??????? protected? void Mdi_OnResize ( Object s ,? System.EventArgs e )
??????? {
???????????
??????????? Control c = (Control)s;
??????????? c.Invalidate();
??????? }
3.?? 在InitializeComponent()或窗體的構(gòu)造函數(shù)中加入這樣的代碼:
( C# )
??? this.Controls[0].Paint += new PaintEventHandler( Mdi_OnPaint ) ;
??? this.Controls[0].Resize += new EventHandler( Mdi_OnResize ) ;
??????? 注意將它加在InitializeComponent()后面或是在InitializeComponent函數(shù)中this.Controls.AddRange函數(shù)之后。
昨天下班是計(jì)算機(jī)已經(jīng)關(guān)機(jī)了。可今天早上一開(kāi)到啟動(dòng)Windows時(shí)系統(tǒng)一片藍(lán)屏。我用安全模式也進(jìn)入不了。后來(lái)把硬盤(pán)拆下來(lái),安裝到同事的機(jī)子上進(jìn)行硬盤(pán)檢查。如果分區(qū),壞道等。結(jié)果沒(méi)有什么問(wèn)題,但為了資料的安全,我把有用的資料都copy到他機(jī)子上。把硬盤(pán)重新安裝回我的機(jī)子上。結(jié)果怎么樣。。。
神了一點(diǎn)問(wèn)題也沒(méi)有。真是虛驚一場(chǎng)呀。
我用記事本打開(kāi)一個(gè)以前的分頁(yè)程序。把其中的一部份代碼copy到我的現(xiàn)在的程序中,可是編譯器提示illegal character \12288錯(cuò)誤。我按它提示的錯(cuò)誤找到發(fā)生錯(cuò)誤的行。我用別的變量名試了一下是可以的。難道是這個(gè)變量名輸入時(shí)用了中文的輸入法。我check一下,可是還是沒(méi)有解決。我又重新聲明了一個(gè)與這個(gè)變量名一樣的變量,把原來(lái)的注釋起來(lái)。后來(lái)發(fā)現(xiàn)可以了,我再把現(xiàn)在的注釋掉,用原來(lái)的變量,還是不行。我把它刪除掉重新寫(xiě)了一遍包括空格也刪除。OK,就可以了。我想可能還是有中文的輸入字符或是空格。
以面的問(wèn)題可真是不是問(wèn)題的問(wèn)題,如果遇到同樣的問(wèn)題的朋友看看是否也是犯了同樣的錯(cuò)。
最后發(fā)現(xiàn)是一個(gè)中文的空格,我在刪除該變量時(shí)發(fā)現(xiàn)有一個(gè)空格的距離較大。
因我的機(jī)子內(nèi)存才512M要運(yùn)行JBuilder2006,還要運(yùn)行oracle9i時(shí)速度很慢,所以我先把oracle的幾個(gè)服務(wù)關(guān)了。后來(lái)我要使用oracle是一直連接不上,提示“沒(méi)有TNS監(jiān)聽(tīng)”。我一查看服務(wù),果然那個(gè)oracleOraHome90TNSListener沒(méi)有啟動(dòng),我一接點(diǎn)擊啟動(dòng),可還是提示那句沒(méi)有TNS監(jiān)聽(tīng)。這是為什么呢?lt;br />第一種可能是否把計(jì)算機(jī)名改了。如果是就按下面的步驟做?lt;br />把安裝目錄下的listener.ora打開(kāi)察看。如:d:\oracle\ora90\network\admin\listener.ora.
打開(kāi)該配置文件后發(fā)現(xiàn)如下一段配置信息:
LISTENER?=
??(DESCRIPTION_LIST?=
????(DESCRIPTION?=
??????(ADDRESS_LIST?=
????????(ADDRESS?=?(PROTOCOL?=?IPC)(KEY?=?EXTPROC0))
??????)
??????(ADDRESS_LIST?=
????????(ADDRESS?=?(PROTOCOL?=?TCP)(HOST?=?local)(PORT?=?1521))
??????)
????)
??)
看到這一行HOST=local這個(gè)是計(jì)算機(jī)名字,這個(gè)名字要與現(xiàn)在的計(jì)算機(jī)名對(duì)應(yīng)。如果不知道自己的計(jì)算機(jī)名是什么可以到“我的電腦”的屬性中有一個(gè)“網(wǎng)絡(luò)標(biāo)識(shí)”的tab?你在完整的計(jì)算機(jī)名稱(chēng)后面看到的就是你的計(jì)算機(jī)名了?lt;br />以下內(nèi)容轉(zhuǎn)載http://www3.ccw.com.cn/club/essence/200202/8252.htm版權(quán)歸原作?
近來(lái),瀏覽BBS時(shí),常看到“急急急!如何啟動(dòng)OMS?”的字眼,就針對(duì)以上這類(lèi)問(wèn)題,我有些經(jīng)驗(yàn)想和大家共同分享?lt;br />能否正常啟動(dòng)OEM或OMS關(guān)鍵有以下兩點(diǎn):
????第一.Oracle的系統(tǒng)服務(wù)是否開(kāi)啟;
????第二.登錄時(shí)用的用戶名和口令是否正確?lt;br />
????那么先針對(duì)第一點(diǎn)談?wù)凮racle的系統(tǒng)服務(wù)。在完全安裝的情況下,Oracle的系統(tǒng)服務(wù)共?1項(xiàng):
????1.Oracle OLAP 9.0.1.0.1
????2.Oracle OLAP Agent
????3.OracleOraHome90Agent
????4.OracleOraHome90ClientCache
????5.OracleOraHome90HTTPServer
????6.OracleOraHome90ManagementServer(0.5M)
????7.OracleOraHome90PagingServer
????8.OracleOraHome90SNMPPeerEncapsulator
????9.OracleOraHome90SNMPPeerMasterAgent
????10.OracleOraHome90TNSListener(5.2M)
????11.OracleServiceORACLE(70M)
????????(注:OraHome90是可以在安裝時(shí)改變的Oracle的主目錄名稱(chēng),是安裝時(shí)的默認(rèn)?
????其中最重要的服務(wù)有3個(gè),分別是OracleOraHome90ManagementServer、OracleOraHome90TNSListener?lt;br />OracleServiceORACLE。下面就來(lái)看一下有哪些啟動(dòng)錯(cuò)誤與它們有關(guān)?lt;br />
????1.Oracle系統(tǒng)提示:Ora-12541:TNS:沒(méi)有監(jiān)聽(tīng)器;
????2.操作系統(tǒng)提示:在本地計(jì)算機(jī)無(wú)法啟動(dòng)OMS服務(wù)
?????????????????????錯(cuò)誤?053:服務(wù)并未及時(shí)響應(yīng)來(lái)控制請(qǐng)求附帶?lt;br />????以上兩種錯(cuò)誤提示大都是由OracleOraHome90TNSListener監(jiān)聽(tīng)服務(wù)引起的?lt;br />解決方法:控制面?>管理工具->服務(wù)->右鍵單擊“OracleOraHome90TNSListener”,再單擊“啟動(dòng)”?lt;br />
????3.Oracle系統(tǒng)提示:Ora-12500:TNS:監(jiān)聽(tīng)程序無(wú)法啟動(dòng)專(zhuān)用服務(wù)器進(jìn)程;
????該錯(cuò)誤是由OracleServiceORACLE專(zhuān)用服務(wù)器進(jìn)程引起的?lt;br />解決方法:控制面?>管理工具->服務(wù)->右鍵單擊“OracleServiceORACLE”,再單擊“啟動(dòng)”?lt;br />
????4.Oracle系統(tǒng)提示:VTK-1000:無(wú)法連接到Management Server?lt;br />???????????????????????請(qǐng)驗(yàn)證您已輸入Oracle Management Server的正確主機(jī)名和狀態(tài)?lt;br />????該錯(cuò)誤引起的原因有兩種,一是OracleOraHome90ManagementServer還沒(méi)啟動(dòng);二是沒(méi)有輸入主機(jī)名?lt;br />解決方法:控制面?>管理工具->服務(wù)->右鍵單擊“OracleOraHome90ManagementServer”,再單擊“啟動(dòng)?
或是輸入您這臺(tái)計(jì)算機(jī)的完整名稱(chēng)?lt;br />小結(jié):這三個(gè)服務(wù)的啟動(dòng)或關(guān)閉還有先后的順序。一般來(lái)講,啟動(dòng)時(shí)必須先啟動(dòng)OracleOraHome90TNSListener啟動(dòng)OracleOraHome90ManagementServer或OracleServiceORACLE,在啟動(dòng)OracleOraHome90ManagementServer時(shí),同時(shí)也啟動(dòng)了OracleServiceORACLE。而關(guān)閉時(shí)必須先關(guān)閉OracleOraHome90ManagementServer再關(guān)閉OracleOraHome90TNSListener或OracleServiceORACLE,關(guān)閉OracleOraHome90ManagementServer時(shí),若有提示輸入用戶名和口令,請(qǐng)輸入sysman的用戶名和口令,以確保成功的執(zhí)行。有些其他提示如:資源已被占用,I/O重復(fù),端口已被使用等等之類(lèi)的話,那最好與系統(tǒng)管理員聯(lián)系,再尋求解決辦法?lt;br />
?
type Status report
message /zz3in1/SrvTest
description
The requested resource (/zz3in1/SrvTest) is not available.
這是為什呢?
用過(guò)了../../SrvTest 這個(gè)是不行的。././SrvTest這樣可以。還有./SrvTest也可以。
以下信息是轉(zhuǎn)載http://www.aaunion.net/cn/blog/more.asp?name=magicmao&id=687
document
文擋對(duì)象 - JavaScript腳本語(yǔ)言描述
---------------------------------------------------------------------
注:頁(yè)面上元素name屬性和JavaScript引用的名稱(chēng)必須一致包括大小寫(xiě)
??
否則會(huì)提示你一個(gè)錯(cuò)誤信息 "引用的元素為空或者不是對(duì)象"
---------------------------------------------------------------------
對(duì)象屬性
document.title???????????? //
設(shè)置文檔標(biāo)題等價(jià)于HTML的<title>標(biāo)簽
document.bgColor?????????? //
設(shè)置頁(yè)面背景色
document.fgColor?????????? //
設(shè)置前景色(文本顏色)
document.linkColor???????? //
未點(diǎn)擊過(guò)的鏈接顏色
document.alinkColor?????? ?//
激活鏈接(焦點(diǎn)在此鏈接上)的顏色
document.vlinkColor??????? //
已點(diǎn)擊過(guò)的鏈接顏色
document.URL?????????????? //
設(shè)置URL屬性從而在同一窗口打開(kāi)另一網(wǎng)頁(yè)
document.fileCreatedDate?? //
文件建立日期,只讀屬性
document.fileModifiedDate? //
文件修改日期,只讀屬性
document.fileSize????????? //
文件大小,只讀屬性
document.cookie??????????? //
設(shè)置和讀出cookie
document.charset?????????? //
設(shè)置字符集 簡(jiǎn)體中文:gb2312
---------------------------------------------------------------------
對(duì)象方法
document.write()????????????????? //
動(dòng)態(tài)向頁(yè)面寫(xiě)入內(nèi)容
document.createElement(Tag)?????? //
創(chuàng)建一個(gè)html標(biāo)簽對(duì)象
document.getElementById(ID)?????? //
獲得指定ID值的對(duì)象
document.getElementsByName(Name)? //
獲得指定Name值的對(duì)象
---------------------------------------------------------------------
images
集合(頁(yè)面中的圖象)
a)
通過(guò)集合引用
document.images???????????? //
對(duì)應(yīng)頁(yè)面上的<img>標(biāo)簽
document.images.length????? //
對(duì)應(yīng)頁(yè)面上<img>標(biāo)簽的個(gè)數(shù)
document.images[0]???????? ?//
第1個(gè)<img>標(biāo)簽
document.images[i]???????? ?//
第i-1個(gè)<img>標(biāo)簽
b)
通過(guò)nane屬性直接引用
<img name="oImage">
document.images.oImage????? //document.images.name
屬性
c)
引用圖片的src屬性
document.images.oImage.src? //document.images.name
屬性.src
d)
創(chuàng)建一個(gè)圖象
var oImage
oImage = new Image()
document.images.oImage.src="/1.jpg"
//
同時(shí)在頁(yè)面上建立一個(gè)<img>標(biāo)簽與之對(duì)應(yīng)就可以顯示
<html>
<img name=oImage>
<script language="javascript">
?? var oImage
?? oImage = new Image()
?? document.images.oImage.src="/1.jpg"
</script>
</html>
----------------------------------------------------------------------
forms
集合(頁(yè)面中的表單)
a)
通過(guò)集合引用
document.forms???????????????? //
對(duì)應(yīng)頁(yè)面上的<form>標(biāo)簽
document.forms.length????????? //
對(duì)應(yīng)頁(yè)面上<form>標(biāo)簽的個(gè)數(shù)
document.forms[0]????????????? //
第1個(gè)<form>標(biāo)簽
document.forms[i]????????????? //
第i-1個(gè)<form>標(biāo)簽
document.forms[i].length????? ?//
第i-1個(gè)<form>中的控件數(shù)
document.forms[i].elements[j]? //
第i-1個(gè)<form>中第j-1個(gè)控件
b)
通過(guò)標(biāo)簽name屬性直接引用
<form name="Myform"><input name="myctrl"></form>
document.Myform.myctrl??????? ?//document.
表單名.控件名
-----------------------------------------------------------------------
<html>
<!--Text
控件相關(guān)Script-->
<form name="Myform">
<input type="text" name="oText">
<input type="password" name="oPswd">
<form>
<script language="javascript">
//
獲取文本密碼框的值
document.write(document.Myform.oText.value)
document.write(document.Myform.oPswd.value)
</script>
</html>
-----------------------------------------------------------------------
<html>
<!--Select
控件相關(guān)Script-->
<form name="Myform">
<select name="oSelect">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</form>
<script language="javascript">
?? //
遍歷select控件的option項(xiàng)
?? var length
?? length=document.Myform.oSelect.length
?? for(i=0;i<length;i++)
?? document.write(document.Myform.oSelect[i].value)
</script>
<script language="javascript">
?? //
遍歷option項(xiàng)并且判斷某個(gè)option是否被選中
?? for(i=0;i<document.Myform.oSelect.length;i++){
?? if(document.Myform.oSelect[i].selected!=true)
?
? document.write(document.Myform.oSelect[i].value)
?? else
?? document.write("<font color=red>"+document.Myform.oSelect[i].value+"</font>")??
?? }
</script>
<script language="javascript">
?? //
根據(jù)SelectedIndex打印出選中的option
?? //(0
到document.Myform.oSelect.length-1)
?? i=document.Myform.oSelect.selectedIndex
?? document.write(document.Myform.oSelect[i].value)
</script>
<script language="javascript">
?? //
動(dòng)態(tài)增加select控件的option項(xiàng)
?? var oOption = document.createElement("OPTION");
?? oOption.text="4";
?? oOption.value="4";
?? document.Myform.oSelect.add(oOption);
</script>
<html>
-----------------------------------------------------------------------
<Div id="oDiv">Text</Div>
document.all.oDiv????????????????????? ?//
引用圖層oDiv
document.all.oDiv.style????????????????
document.all.oDiv.style.display=""????? //
圖層設(shè)置為可視
document.all.oDiv.style.display="none"? //
圖層設(shè)置為隱藏
/*document.all
表示document中所有對(duì)象的集合
只有ie支持此屬性,因此也用來(lái)判斷瀏覽器的種類(lèi)*/
-----------------------------------------------------------------------
二、JDBC連接MySql方式
下面是使用JDBC連接MySql的一個(gè)小的教程
1、查找驅(qū)動(dòng)程序
MySQL目前提供的java驅(qū)動(dòng)程序?yàn)镃onnection/J,可以從MySQL官方網(wǎng)站下載,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驅(qū)動(dòng)程序?yàn)榧僯ava驅(qū)動(dòng)程序,不需做其他配置。
2、動(dòng)態(tài)指定classpath
如果需要執(zhí)行時(shí)動(dòng)態(tài)指定classpath,就在執(zhí)行時(shí)采用-cp方式。否則將上面的.jar文件加入到classpath環(huán)境變量中。
3、加載驅(qū)動(dòng)程序
try{ Class.forName(com.mysql.jdbc.Driver); System.out.println(Success loading Mysql Driver!); }catch(Exception e) { System.out.println(Error loading Mysql Driver!); e.printStackTrace(); }
4、設(shè)置連接的url
jdbc:mysql://localhost/databasename[?pa=va][&pa=va]
三、以下列出了在使用JDBC來(lái)連接Oracle數(shù)據(jù)庫(kù)時(shí)可以使用的一些技巧
1、在客戶端軟件開(kāi)發(fā)中使用Thin驅(qū)動(dòng)程序
在開(kāi)發(fā)Java軟件方面,Oracle的數(shù)據(jù)庫(kù)提供了四種類(lèi)型的驅(qū)動(dòng)程序,二種用于應(yīng)用軟件、applets、servlets等客戶端軟件,另外二種用于數(shù)據(jù)庫(kù)中的Java存儲(chǔ)過(guò)程等服務(wù)器端軟件。在客戶機(jī)端軟件的開(kāi)發(fā)中,我們可以選擇OCI驅(qū)動(dòng)程序或Thin驅(qū)動(dòng)程序。OCI驅(qū)動(dòng)程序利用Java本地化接口(JNI),通過(guò)Oracle客戶端軟件與數(shù)據(jù)庫(kù)進(jìn)行通訊。Thin驅(qū)動(dòng)程序是純Java驅(qū)動(dòng)程序,它直接與數(shù)據(jù)庫(kù)進(jìn)行通訊。為了獲得最高的性能,Oracle建議在客戶端軟件的開(kāi)發(fā)中使用OCI驅(qū)動(dòng)程序,這似乎是正確的。但我建議使用Thin驅(qū)動(dòng)程序,因?yàn)橥ㄟ^(guò)多次測(cè)試發(fā)現(xiàn),在通常情況下, Thin驅(qū)動(dòng)程序的性能都超過(guò)了OCI驅(qū)動(dòng)程序。
2、關(guān)閉自動(dòng)提交功能,提高系統(tǒng)性能
在第一次建立與數(shù)據(jù)庫(kù)的連接時(shí),在缺省情況下,連接是在自動(dòng)提交模式下的。為了獲得更好的性能,可以通過(guò)調(diào)用帶布爾值false參數(shù)的Connection類(lèi)的setAutoCommit()方法關(guān)閉自動(dòng)提交功能,如下所示:
conn.setAutoCommit(false);
值得注意的是,一旦關(guān)閉了自動(dòng)提交功能,我們就需要通過(guò)調(diào)用Connection類(lèi)的commit()和rollback()方法來(lái)人工的方式對(duì)事務(wù)進(jìn)行管理。
3、在動(dòng)態(tài)SQL或有時(shí)間限制的命令中使用Statement對(duì)象
在執(zhí)行SQL命令時(shí),我們有二種選擇:可以使用PreparedStatement對(duì)象,也可以使用Statement對(duì)象。無(wú)論多少次地使用同一個(gè) SQL命令,PreparedStatement都只對(duì)它解析和編譯一次。當(dāng)使用Statement對(duì)象時(shí),每次執(zhí)行一個(gè)SQL命令時(shí),都會(huì)對(duì)它進(jìn)行解析和編譯。這可能會(huì)使你認(rèn)為,使用PreparedStatement對(duì)象比使用Statement對(duì)象的速度更快。然而,我進(jìn)行的測(cè)試表明,在客戶端軟件中,情況并非如此。因此,在有時(shí)間限制的SQL操作中,除非成批地處理SQL命令,我們應(yīng)當(dāng)考慮使用Statement對(duì)象。
此外,使用Statement對(duì)象也使得編寫(xiě)動(dòng)態(tài)SQL命令更加簡(jiǎn)單,因?yàn)槲覀兛梢詫⒆址B接在一起,建立一個(gè)有效的SQL命令。因此,我認(rèn)為,Statement對(duì)象可以使動(dòng)態(tài)SQL命令的創(chuàng)建和執(zhí)行變得更加簡(jiǎn)單。
4、利用helper函數(shù)對(duì)動(dòng)態(tài)SQL命令進(jìn)行格式化
在創(chuàng)建使用Statement對(duì)象執(zhí)行的動(dòng)態(tài)SQL命令時(shí),我們需要處理一些格式化方面的問(wèn)題。例如,如果我們想創(chuàng)建一個(gè)將名字O'Reilly插入表中的SQL命令,則必須使用二個(gè)相連的“''”號(hào)替換O'Reilly中的“'”號(hào)。完成這些工作的最好的方法是創(chuàng)建一個(gè)完成替換操作的helper方法,然后在連接字符串心服用公式表達(dá)一個(gè)SQL命令時(shí),使用創(chuàng)建的helper方法。與此類(lèi)似的是,我們可以讓helper方法接受一個(gè)Date型的值,然后讓它輸出基于Oracle的to_date()函數(shù)的字符串表達(dá)式。
5、利用PreparedStatement對(duì)象提高數(shù)據(jù)庫(kù)的總體效率
在使用PreparedStatement對(duì)象執(zhí)行SQL命令時(shí),命令被數(shù)據(jù)庫(kù)進(jìn)行解析和編譯,然后被放到命令緩沖區(qū)。然后,每當(dāng)執(zhí)行同一個(gè) PreparedStatement對(duì)象時(shí),它就會(huì)被再解析一次,但不會(huì)被再次編譯。在緩沖區(qū)中可以發(fā)現(xiàn)預(yù)編譯的命令,并且可以重新使用。在有大量用戶的企業(yè)級(jí)應(yīng)用軟件中,經(jīng)常會(huì)重復(fù)執(zhí)行相同的SQL命令,使用PreparedStatement對(duì)象帶來(lái)的編譯次數(shù)的減少能夠提高數(shù)據(jù)庫(kù)的總體性能。如果不是在客戶端創(chuàng)建、預(yù)備、執(zhí)行PreparedStatement任務(wù)需要的時(shí)間長(zhǎng)于Statement任務(wù),我會(huì)建議在除動(dòng)態(tài)SQL命令之外的所有情況下使用PreparedStatement對(duì)象。
6、在成批處理重復(fù)的插入或更新操作中使用PreparedStatement對(duì)象
如果成批地處理插入和更新操作,就能夠顯著地減少它們所需要的時(shí)間。Oracle提供的Statement和 CallableStatement并不真正地支持批處理,只有PreparedStatement對(duì)象才真正地支持批處理。我們可以使用 addBatch()和executeBatch()方法選擇標(biāo)準(zhǔn)的JDBC批處理,或者通過(guò)利用PreparedStatement對(duì)象的 setExecuteBatch()方法和標(biāo)準(zhǔn)的executeUpdate()方法選擇速度更快的Oracle專(zhuān)有的方法。要使用Oracle專(zhuān)有的批處理機(jī)制,可以以如下所示的方式調(diào)用setExecuteBatch():
PreparedStatement pstmt3D null; try { ((OraclePreparedStatement)pstmt).setExecuteBatch(30); ... pstmt.executeUpdate(); }調(diào)用setExecuteBatch()時(shí)指定的值是一個(gè)上限,當(dāng)達(dá)到該值時(shí),就會(huì)自動(dòng)地引發(fā)SQL命令執(zhí)行,標(biāo)準(zhǔn)的executeUpdate()方法就會(huì)被作為批處理送到數(shù)據(jù)庫(kù)中。我們可以通過(guò)調(diào)用PreparedStatement類(lèi)的sendBatch()方法隨時(shí)傳輸批處理任務(wù)。
ORACLE 數(shù)據(jù)庫(kù)備份技術(shù)
ORACLE數(shù)據(jù)庫(kù)是一種大型關(guān)系型的數(shù)據(jù)庫(kù),可以存貯達(dá)到存貯TB的數(shù)據(jù),那么如何保證這些數(shù)據(jù)的安全尤其至關(guān)重要,我們從1991年開(kāi)始使用 ORACLE數(shù)據(jù)庫(kù),通過(guò)這些年的使用,我們制定了一整套的ORACLE數(shù)據(jù)庫(kù)的備份制度。現(xiàn)在把我們的備份制度介紹給大家,供大家參考。
1.根據(jù)實(shí)際需要決定數(shù)據(jù)庫(kù)的運(yùn)行方式
ORACLE數(shù)據(jù)庫(kù)有兩種運(yùn)行方式:一是歸檔方式(ARCHIVELOG),歸檔方式的目的是當(dāng)數(shù)據(jù)庫(kù)發(fā)生故障時(shí)最大限度恢復(fù)所有已提交的事物;二是不歸檔方式(NOARCHIVELOG),恢復(fù)數(shù)據(jù)庫(kù)到最近的回收點(diǎn)。我們根據(jù)數(shù)據(jù)庫(kù)的高可用性和用戶可承受丟失的工作量的多少,把我們正式運(yùn)行的數(shù)據(jù)庫(kù)采用為歸檔方式;那些正在開(kāi)發(fā)和調(diào)試的數(shù)據(jù)庫(kù)采用不歸檔方式。
2如何改變數(shù)據(jù)庫(kù)的運(yùn)行方式
2.1在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)設(shè)置數(shù)據(jù)庫(kù)的運(yùn)行的方式
在創(chuàng)建數(shù)據(jù)庫(kù)時(shí),作為創(chuàng)建數(shù)據(jù)庫(kù)的一部分,就決定了數(shù)據(jù)庫(kù)初始的存檔方式。一般情況下為NOARCHIVELOG方式。當(dāng)數(shù)據(jù)庫(kù)創(chuàng)建好以后,根據(jù)我們的需要把需要運(yùn)行在歸檔方式的數(shù)據(jù)庫(kù)改成ARCHIVELOG方式。
2.2改變不歸檔方式為為歸檔方式
關(guān)閉數(shù)據(jù)庫(kù),備份已有的數(shù)據(jù)
改變數(shù)據(jù)庫(kù)的運(yùn)行方式是對(duì)數(shù)據(jù)庫(kù)的重要改動(dòng),所以要對(duì)數(shù)據(jù)庫(kù)做備份,對(duì)可能出現(xiàn)的問(wèn)題作出保護(hù)。
啟動(dòng)Instance ,Mount數(shù)據(jù)庫(kù)但不打開(kāi)數(shù)據(jù)庫(kù),來(lái)改變歸檔方式
sqldba lmode=y(svrmgrl)
sqldba>connect internal
sqldba>startup mount
sqldba>alter database archivelog;
使能自動(dòng)存檔
在初始化文件init*.ora(一般放ORACLE根目錄的下層目錄dbs下)加參數(shù):
log_archive_start=true
指定存檔的重做登錄文件名和存放的位置
同樣是在初始化文件init*.ora中加入下面的參數(shù):
log_archive_format=%S.arc
log_archive_dest=/arch12/arch (arch12 是日志文件存放的目錄)
關(guān)閉數(shù)據(jù)庫(kù),重新啟動(dòng)數(shù)據(jù)庫(kù),歸檔方式轉(zhuǎn)換完成。
3回收制度
3.1根據(jù)數(shù)據(jù)庫(kù)的運(yùn)行方式和可承受丟失的工作量來(lái)決定數(shù)據(jù)庫(kù)的回收制度對(duì)于不歸檔方式,我們用的是ORACLE數(shù)據(jù)庫(kù)的邏輯備份Export ,回收的制度是:一個(gè)月作一次全備份(x01.dmp),一周作一次累積備份(c*.dmp),一天一次增量備份(I*.dmp),具體的是星期一到星期五作增量備份,星期六做累積備份或全備份,每次做完備份后自動(dòng)傳到其它的機(jī)器上存儲(chǔ)。這些備份都是自動(dòng)執(zhí)行的,后面給出程序文本。
對(duì)于歸檔方式,我們用的是ORCALE的物理備份:當(dāng)數(shù)據(jù)庫(kù)創(chuàng)建好以后,做一次物理上的全備份,平時(shí)在不關(guān)閉數(shù)據(jù)庫(kù)的前提下,一個(gè)星期對(duì)經(jīng)常改變的數(shù)據(jù)文件做聯(lián)機(jī)的數(shù)據(jù)庫(kù)數(shù)據(jù)文件的物理備份;當(dāng)數(shù)據(jù)庫(kù)的結(jié)構(gòu)發(fā)生改變,如:增加表空間,加數(shù)據(jù)文件等,如允許關(guān)機(jī),正常關(guān)閉數(shù)據(jù)庫(kù),重新做數(shù)據(jù)庫(kù)全備份,否則,備份控制文件,備份數(shù)據(jù)文件照常。聯(lián)機(jī)的日志文件我們是寫(xiě)在陣列上的,不用鏡象和備份。
3.2回收的方法
3.2.1不歸檔方式
我們拿曙光AIX操作系統(tǒng)為例,來(lái)講解以下如何做自動(dòng)備份:
---- a.首先建UNIX用戶 demo/demo
---- b.拷貝oracle用戶下的 .profile 到 demo 用戶下,以保證 demo 用戶可以用 Export命令
---- c.用root用戶登錄,編輯 /var/adm/cron/cron.allow 加入用戶名demo,這樣demo用戶就有權(quán)自動(dòng)執(zhí)行數(shù)據(jù)庫(kù)備份的shell程序;
---- d.創(chuàng)建數(shù)據(jù)庫(kù)備份程序,放到本用戶的下層目錄bin下,并且這些文件要有可執(zhí)行權(quán)文件zlbf1:(增量備份1,星期一執(zhí)行的程序)
. /u11/demo/.profile exp system/manager inctype=INCREMENTAL file=i01.dmp ftp -n< < ! open 10.10.10.40 user demo demo binary prompt cd backup40 put i01.dmp close bye ! 文件zlbf2:(增量備份2, 星期二執(zhí)行的程序) . /u11/demo/.profile exp system/manager inctype=INCREMENTAL file=i02.dmp ftp -n< < ! open 10.10.10.40 user demo demo binary prompt cd backup40 put i02.dmp close bye ! 文件zlbf3:(增量備份3, 星期三執(zhí)行的程序) . /u11/demo/.profile exp system/manager inctype=INCREMENTAL file=i03.dmp ftp -n< < ! open 10.10.10.40 user demo demo binary prompt cd backup40 put i03.dmp close bye ! 文件zlbf4:(增量備份4, 星期四執(zhí)行的程序) . /u11/demo/.profile exp system/manager inctype=INCREMENTAL file=i04.dmp ftp -n< < ! open 10.10.10.40 user demo demo binary prompt cd backup40 put i04.dmp close bye ! 文件zlbf5:(增量備份5, 星期五執(zhí)行的程序) . /u11/demo/.profile exp system/manager inctype=INCREMENTAL file=i05.dmp ftp -n< < ! open 10.10.10.40 user demo demo binary prompt cd backup40 put i05.dmp close bye ! 文件zlbf6:(增量備份6, 星期六執(zhí)行的程序) . /u11/demo/.profile js=`ls c*.dmp|wc -l` if test = 0 then exp system/manager inctype=CUMULATIVE file=c01.dmp ftp -n< < ! open 10.10.10.40 user demo demo binary prompt cd backup40 put c01.dmp close bye ! fi if test = 1 then exp system/manger inctype=CUMULATIVE file=c02.dmp ftp -n< < ! open 10.10.10.40 user demo demo binary prompt cd backup40 put c02.dmp close bye ! fi if test = 2 then exp system/maneger inctype=CUMULATIVE file=c03.dmp ftp -n< < ! open 10.10.10.40 user demo demo binary prompt cd backup40 put c03.dmp close bye ! fi if test = 3 then exp system/manager inctype=COMPLETE file=x01.dmp ftp -n< < ! open 10.10.10.40 user demo demo binary prompt cd backup40 put x01.dmp close bye ! rm c*.dmp fi ---- e.在demo 用戶下建一個(gè)文件,假如叫:cron.demo,文件內(nèi)容如下 59 22 * * 1 bin/zlbf1 59 22 * * 2 bin/zlbf2 59 22 * * 3 bin/zlbf3 59 22 * * 4 bin/zlbf4 59 22 * * 5 bin/zlbf5 59 22 * * 6 bin/zlbf6
---- f.在demo用戶下執(zhí)行下面的命令:
crontab cron.demo 執(zhí)行的結(jié)果放到
/var/spool/cron/crontabs/demo文件里
---- g.重新啟動(dòng)cron 進(jìn)程,命令:kill -1 進(jìn)程號(hào)
---- h.執(zhí)行結(jié)果放在本用戶的郵件里
---- i.查看結(jié)果是否執(zhí)行,請(qǐng)看:/var/adm/cron/log文件
3.2.2歸檔方式
---- a. 找到要回收的數(shù)據(jù)文件、聯(lián)機(jī)重做登錄文件、控制文件和參數(shù)文件
---- b. 正常關(guān)閉數(shù)據(jù)庫(kù),作一次全回收(用操作系統(tǒng)的TAR命令,可以寫(xiě)成shell程序),然后打開(kāi)數(shù)據(jù)庫(kù)供正常使用,shell程序如下:
tar cvf /dev/rmt/ctape2 /u1/oracle/dbs/ctrl1ora7.ctl
/u1/oracle/dbs/ctrl2ora7.ctl
/u1/oracle/dbs/ctrl3ora7.ctl
/u1/oracle/dbs/systora7.dbf
/u1/oracle/dbs/rbsora7.dbf
/u1/oracle/dbs/tempora7.dbf
/u1/oracle/dbs/toolora7.dbf
/u1/oracle/dbs/usrora7.dbf
/ls1/ls1.dbf
/u1/oracle/dbs/log1ora7.dbf
/u1/oracle/dbs/log2ora7.dbf
/u1/oracle/dbs/log3ora7.dbf
---- c. 經(jīng)常作聯(lián)機(jī)的表空間和數(shù)據(jù)文件的部分回收
首先標(biāo)記聯(lián)機(jī)表空間回收的開(kāi)始
alter tablespace 表空間名 begin backup;
用操作系統(tǒng)命令備份數(shù)據(jù)文件
最后標(biāo)記聯(lián)機(jī)的表空間回收結(jié)束
alter tablespace 表空間名 end backup
---- 多個(gè)表空間可以一起做標(biāo)記,備份做標(biāo)記的所有數(shù)據(jù)文件后,一起標(biāo)記結(jié)束。
---- d. 當(dāng)數(shù)據(jù)庫(kù)結(jié)構(gòu)發(fā)生改變后,要對(duì)它的控制文件做回收
sqldba >alter database backup
controlfile to ’文件名’ reuse; ?
數(shù)據(jù)庫(kù)設(shè)計(jì)中的14個(gè)技巧
1. 原始單據(jù)與實(shí)體之間的關(guān)系
可以是一對(duì)一、一對(duì)多、多對(duì)多的關(guān)系。在一般情況下,它們是一對(duì)一的關(guān)系:即一張?jiān)紗螕?jù)對(duì)應(yīng)且只對(duì)應(yīng)一個(gè)實(shí)體。在特殊情況下,它們可能是一對(duì)多或多對(duì)一的關(guān)系,即一張?jiān)紗巫C對(duì)應(yīng)多個(gè)實(shí)體,或多張?jiān)紗巫C對(duì)應(yīng)一個(gè)實(shí)體。這里的實(shí)體可以理解為基本表。明確這種對(duì)應(yīng)關(guān)系后,對(duì)我們?cè)O(shè)計(jì)錄入界面大有好處。
〖例1〗:一份員工履歷資料,在人力資源信息系統(tǒng)中,就對(duì)應(yīng)三個(gè)基本表:?jiǎn)T工基本情況表、社會(huì)關(guān)系表、工作簡(jiǎn)歷表。這就是“一張?jiān)紗巫C對(duì)應(yīng)多個(gè)實(shí)體”的典型例子。
2. 主鍵與外鍵
一般而言,一個(gè)實(shí)體不能既無(wú)主鍵又無(wú)外鍵。在E—R 圖中, 處于葉子部位的實(shí)體, 可以定義主鍵,也可以不定義主鍵(因?yàn)樗鼰o(wú)子孫), 但必須要有外鍵(因?yàn)樗懈赣H)。
主鍵與外鍵的設(shè)計(jì),在全局?jǐn)?shù)據(jù)庫(kù)的設(shè)計(jì)中,占有重要地位。當(dāng)全局?jǐn)?shù)據(jù)庫(kù)的設(shè)計(jì)完成以后,有個(gè)美國(guó)數(shù)據(jù)庫(kù)設(shè)計(jì)專(zhuān)家說(shuō):“鍵,到處都是鍵,除了鍵之外,什么也沒(méi)有”,這就是他的數(shù)據(jù)庫(kù)設(shè)計(jì)經(jīng)驗(yàn)之談,也反映了他對(duì)信息系統(tǒng)核心(數(shù)據(jù)模型)的高度抽象思想。因?yàn)椋褐麈I是實(shí)體的高度抽象,主鍵與外鍵的配對(duì),表示實(shí)體之間的連接。
3. 基本表的性質(zhì)
基本表與中間表、臨時(shí)表不同,因?yàn)樗哂腥缦滤膫€(gè)特性:
(1) 原子性。基本表中的字段是不可再分解的。
(2) 原始性。基本表中的記錄是原始數(shù)據(jù)(基礎(chǔ)數(shù)據(jù))的記錄。
(3) 演繹性。由基本表與代碼表中的數(shù)據(jù),可以派生出所有的輸出數(shù)據(jù)。
(4) 穩(wěn)定性。基本表的結(jié)構(gòu)是相對(duì)穩(wěn)定的,表中的記錄是要長(zhǎng)期保存的。
理解基本表的性質(zhì)后,在設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),就能將基本表與中間表、臨時(shí)表區(qū)分開(kāi)來(lái)。
4. 范式標(biāo)準(zhǔn)
基本表及其字段之間的關(guān)系, 應(yīng)盡量滿足第三范式。但是,滿足第三范式的數(shù)據(jù)庫(kù)設(shè)計(jì),往往不是最好的設(shè)計(jì)。為了提高數(shù)據(jù)庫(kù)的運(yùn)行效率,常常需要降低范式標(biāo)準(zhǔn):適當(dāng)增加冗余,達(dá)到以空間換時(shí)間的目的。
〖例2〗:有一張存放商品的基本表,如表1所示。“金額”這個(gè)字段的存在,表明該表的設(shè)計(jì)不滿足第三范式,因?yàn)椤敖痤~”可以由“單價(jià)”乘以“數(shù)量”得到,說(shuō)明“金額”是冗余字段。但是,增加“金額”這個(gè)冗余字段,可以提高查詢統(tǒng)計(jì)的速度,這就是以空間換時(shí)間的作法。
在Rose 2002中,規(guī)定列有兩種類(lèi)型:數(shù)據(jù)列和計(jì)算列。“金額”這樣的列被稱(chēng)為“計(jì)算列”,而“單價(jià)”和“數(shù)量”這樣的列被稱(chēng)為“數(shù)據(jù)列”。
表1 商品表的表結(jié)構(gòu)
商品名稱(chēng)商品型號(hào)單價(jià)數(shù)量金額
電視機(jī) 29吋 2,500 40 100,000
5. 通俗地理解三個(gè)范式
通俗地理解三個(gè)范式,對(duì)于數(shù)據(jù)庫(kù)設(shè)計(jì)大有好處。在數(shù)據(jù)庫(kù)設(shè)計(jì)中,為了更好地應(yīng)用三個(gè)范式,就必須通俗地理解三個(gè)范式(通俗地理解是夠用的理解,并不是最科學(xué)最準(zhǔn)確的理解):
第一范式:1NF是對(duì)屬性的原子性約束,要求屬性具有原子性,不可再分解;
第二范式:2NF是對(duì)記錄的惟一性約束,要求記錄有惟一標(biāo)識(shí),即實(shí)體的惟一性;
第三范式:3NF是對(duì)字段冗余性的約束,即任何字段不能由其他字段派生出來(lái),它要求字段沒(méi)有冗余。
沒(méi)有冗余的數(shù)據(jù)庫(kù)設(shè)計(jì)可以做到。但是,沒(méi)有冗余的數(shù)據(jù)庫(kù)未必是最好的數(shù)據(jù)庫(kù),有時(shí)為了提高運(yùn)行效率,就必須降低范式標(biāo)準(zhǔn),適當(dāng)保留冗余數(shù)據(jù)。具體做法是:在概念數(shù)據(jù)模型設(shè)計(jì)時(shí)遵守第三范式,降低范式標(biāo)準(zhǔn)的工作放到物理數(shù)據(jù)模型設(shè)計(jì)時(shí)考慮。降低范式就是增加字段,允許冗余。
6. 要善于識(shí)別與正確處理多對(duì)多的關(guān)系
若兩個(gè)實(shí)體之間存在多對(duì)多的關(guān)系,則應(yīng)消除這種關(guān)系。消除的辦法是,在兩者之間增加第三個(gè)實(shí)體。這樣,原來(lái)一個(gè)多對(duì)多的關(guān)系,現(xiàn)在變?yōu)閮蓚€(gè)一對(duì)多的關(guān)系。要將原來(lái)兩個(gè)實(shí)體的屬性合理地分配到三個(gè)實(shí)體中去。這里的第三個(gè)實(shí)體,實(shí)質(zhì)上是一個(gè)較復(fù)雜的關(guān)系,它對(duì)應(yīng)一張基本表。一般來(lái)講,數(shù)據(jù)庫(kù)設(shè)計(jì)工具不能識(shí)別多對(duì)多的關(guān)系,但能處理多對(duì)多的關(guān)系。
〖例3〗:在“圖書(shū)館信息系統(tǒng)”中,“圖書(shū)”是一個(gè)實(shí)體,“讀者”也是一個(gè)實(shí)體。這兩個(gè)實(shí)體之間的關(guān)系,是一個(gè)典型的多對(duì)多關(guān)系:一本圖書(shū)在不同時(shí)間可以被多個(gè)讀者借閱,一個(gè)讀者又可以借多本圖書(shū)。為此,要在二者之間增加第三個(gè)實(shí)體,該實(shí)體取名為“借還書(shū)”,它的屬性為:借還時(shí)間、借還標(biāo)志(0表示借書(shū),1表示還書(shū)),另外,它還應(yīng)該有兩個(gè)外鍵(“圖書(shū)”的主鍵,“讀者”的主鍵),使它能與“圖書(shū)”和 “讀者”連接。
7. 主鍵PK的取值方法
PK是供程序員使用的表間連接工具,可以是一無(wú)物理意義的數(shù)字串, 由程序自動(dòng)加1來(lái)實(shí)現(xiàn)。也可以是有物理意義的字段名或字段名的組合。不過(guò)前者比后者好。當(dāng)PK是字段名的組合時(shí),建議字段的個(gè)數(shù)不要太多,多了不但索引占用空間大,而且速度也慢。
8. 正確認(rèn)識(shí)數(shù)據(jù)冗余
主鍵與外鍵在多表中的重復(fù)出現(xiàn), 不屬于數(shù)據(jù)冗余,這個(gè)概念必須清楚,事實(shí)上有許多人還不清楚。非鍵字段的重復(fù)出現(xiàn), 才是數(shù)據(jù)冗余!而且是一種低級(jí)冗余,即重復(fù)性的冗余。高級(jí)冗余不是字段的重復(fù)出現(xiàn),而是字段的派生出現(xiàn)。
〖例4〗:商品中的“單價(jià)、數(shù)量、金額”三個(gè)字段,“金額”就是由“單價(jià)”乘以“數(shù)量”派生出來(lái)的,它就是冗余,而且是一種高級(jí)冗余。冗余的目的是為了提高處理速度。只有低級(jí)冗余才會(huì)增加數(shù)據(jù)的不一致性,因?yàn)橥粩?shù)據(jù),可能從不同時(shí)間、地點(diǎn)、角色上多次錄入。因此,我們提倡高級(jí)冗余(派生性冗余),反對(duì)低級(jí)冗余(重復(fù)性冗余)。
9. E--R圖沒(méi)有標(biāo)準(zhǔn)答案
信息系統(tǒng)的E--R圖沒(méi)有標(biāo)準(zhǔn)答案,因?yàn)樗脑O(shè)計(jì)與畫(huà)法不是惟一的,只要它覆蓋了系統(tǒng)需求的業(yè)務(wù)范圍和功能內(nèi)容,就是可行的。反之要修改E--R圖。盡管它沒(méi)有惟一的標(biāo)準(zhǔn)答案,并不意味著可以隨意設(shè)計(jì)。好的E—R圖的標(biāo)準(zhǔn)是:結(jié)構(gòu)清晰、關(guān)聯(lián)簡(jiǎn)潔、實(shí)體個(gè)數(shù)適中、屬性分配合理、沒(méi)有低級(jí)冗余。
10. 視圖技術(shù)在數(shù)據(jù)庫(kù)設(shè)計(jì)中很有用
與基本表、代碼表、中間表不同,視圖是一種虛表,它依賴(lài)數(shù)據(jù)源的實(shí)表而存在。視圖是供程序員使用數(shù)據(jù)庫(kù)的一個(gè)窗口,是基表數(shù)據(jù)綜合的一種形式, 是數(shù)據(jù)處理的一種方法,是用戶數(shù)據(jù)保密的一種手段。為了進(jìn)行復(fù)雜處理、提高運(yùn)算速度和節(jié)省存儲(chǔ)空間, 視圖的定義深度一般不得超過(guò)三層。若三層視圖仍不夠用, 則應(yīng)在視圖上定義臨時(shí)表, 在臨時(shí)表上再定義視圖。這樣反復(fù)交迭定義, 視圖的深度就不受限制了。
對(duì)于某些與國(guó)家政治、經(jīng)濟(jì)、技術(shù)、軍事和安全利益有關(guān)的信息系統(tǒng),視圖的作用更加重要。這些系統(tǒng)的基本表完成物理設(shè)計(jì)之后,立即在基本表上建立第一層視圖,這層視圖的個(gè)數(shù)和結(jié)構(gòu),與基本表的個(gè)數(shù)和結(jié)構(gòu)是完全相同。并且規(guī)定,所有的程序員,一律只準(zhǔn)在視圖上操作。只有數(shù)據(jù)庫(kù)管理員,帶著多個(gè)人員共同掌握的“安全鑰匙”,才能直接在基本表上操作。請(qǐng)讀者想想:這是為什么?
11. 中間表、報(bào)表和臨時(shí)表
中間表是存放統(tǒng)計(jì)數(shù)據(jù)的表,它是為數(shù)據(jù)倉(cāng)庫(kù)、輸出報(bào)表或查詢結(jié)果而設(shè)計(jì)的,有時(shí)它沒(méi)有主鍵與外鍵(數(shù)據(jù)倉(cāng)庫(kù)除外)。臨時(shí)表是程序員個(gè)人設(shè)計(jì)的,存放臨時(shí)記錄,為個(gè)人所用。基表和中間表由DBA維護(hù),臨時(shí)表由程序員自己用程序自動(dòng)維護(hù)。
12. 完整性約束表現(xiàn)在三個(gè)方面
域的完整性:用Check來(lái)實(shí)現(xiàn)約束,在數(shù)據(jù)庫(kù)設(shè)計(jì)工具中,對(duì)字段的取值范圍進(jìn)行定義時(shí),有一個(gè)Check按鈕,通過(guò)它定義字段的值城。
參照完整性:用PK、FK、表級(jí)觸發(fā)器來(lái)實(shí)現(xiàn)。
用戶定義完整性:它是一些業(yè)務(wù)規(guī)則,用存儲(chǔ)過(guò)程和觸發(fā)器來(lái)實(shí)現(xiàn)。
13. 防止數(shù)據(jù)庫(kù)設(shè)計(jì)打補(bǔ)丁的方法是“三少原則”
(1) 一個(gè)數(shù)據(jù)庫(kù)中表的個(gè)數(shù)越少越好。只有表的個(gè)數(shù)少了,才能說(shuō)明系統(tǒng)的E--R圖少而精,去掉了重復(fù)的多余的實(shí)體,形成了對(duì)客觀世界的高度抽象,進(jìn)行了系統(tǒng)的數(shù)據(jù)集成,防止了打補(bǔ)丁式的設(shè)計(jì);
(2) 一個(gè)表中組合主鍵的字段個(gè)數(shù)越少越好。因?yàn)橹麈I的作用,一是建主鍵索引,二是做為子表的外鍵,所以組合主鍵的字段個(gè)數(shù)少了,不僅節(jié)省了運(yùn)行時(shí)間,而且節(jié)省了索引存儲(chǔ)空間;
(3) 一個(gè)表中的字段個(gè)數(shù)越少越好。只有字段的個(gè)數(shù)少了,才能說(shuō)明在系統(tǒng)中不存在數(shù)據(jù)重復(fù),且很少有數(shù)據(jù)冗余,更重要的是督促讀者學(xué)會(huì)“列變行”,這樣就防止了將子表中的字段拉入到主表中去,在主表中留下許多空余的字段。所謂“列變行”,就是將主表中的一部分內(nèi)容拉出去,另外單獨(dú)建一個(gè)子表。這個(gè)方法很簡(jiǎn)單,有的人就是不習(xí)慣、不采納、不執(zhí)行。
數(shù)據(jù)庫(kù)設(shè)計(jì)的實(shí)用原則是:在數(shù)據(jù)冗余和處理速度之間找到合適的平衡點(diǎn)。“三少”是一個(gè)整體概念,綜合觀點(diǎn),不能孤立某一個(gè)原則。該原則是相對(duì)的,不是絕對(duì)的。“三多”原則肯定是錯(cuò)誤的。試想:若覆蓋系統(tǒng)同樣的功能,一百個(gè)實(shí)體(共一千個(gè)屬性) 的E--R圖,肯定比二百個(gè)實(shí)體(共二千個(gè)屬性) 的E--R圖,要好得多。
提倡“三少”原則,是叫讀者學(xué)會(huì)利用數(shù)據(jù)庫(kù)設(shè)計(jì)技術(shù)進(jìn)行系統(tǒng)的數(shù)據(jù)集成。數(shù)據(jù)集成的步驟是將文件系統(tǒng)集成為應(yīng)用數(shù)據(jù)庫(kù),將應(yīng)用數(shù)據(jù)庫(kù)集成為主題數(shù)據(jù)庫(kù),將主題數(shù)據(jù)庫(kù)集成為全局綜合數(shù)據(jù)庫(kù)。集成的程度越高,數(shù)據(jù)共享性就越強(qiáng),信息孤島現(xiàn)象就越少,整個(gè)企業(yè)信息系統(tǒng)的全局E—R圖中實(shí)體的個(gè)數(shù)、主鍵的個(gè)數(shù)、屬性的個(gè)數(shù)就會(huì)越少。
提倡“三少”原則的目的,是防止讀者利用打補(bǔ)丁技術(shù),不斷地對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改,使企業(yè)數(shù)據(jù)庫(kù)變成了隨意設(shè)計(jì)數(shù)據(jù)庫(kù)表的“垃圾堆”,或數(shù)據(jù)庫(kù)表的“大雜院”,最后造成數(shù)據(jù)庫(kù)中的基本表、代碼表、中間表、臨時(shí)表雜亂無(wú)章,不計(jì)其數(shù),導(dǎo)致企事業(yè)單位的信息系統(tǒng)無(wú)法維護(hù)而癱瘓。
“三多”原則任何人都可以做到,該原則是“打補(bǔ)丁方法”設(shè)計(jì)數(shù)據(jù)庫(kù)的歪理學(xué)說(shuō)。“三少”原則是少而精的原則,它要求有較高的數(shù)據(jù)庫(kù)設(shè)計(jì)技巧與藝術(shù),不是任何人都能做到的,因?yàn)樵撛瓌t是杜絕用“打補(bǔ)丁方法”設(shè)計(jì)數(shù)據(jù)庫(kù)的理論依據(jù)。
14. 提高數(shù)據(jù)庫(kù)運(yùn)行效率的辦法
在給定的系統(tǒng)硬件和系統(tǒng)軟件條件下,提高數(shù)據(jù)庫(kù)系統(tǒng)的運(yùn)行效率的辦法是:
(1) 在數(shù)據(jù)庫(kù)物理設(shè)計(jì)時(shí),降低范式,增加冗余, 少用觸發(fā)器, 多用存儲(chǔ)過(guò)程。
(2) 當(dāng)計(jì)算非常復(fù)雜、而且記錄條數(shù)非常巨大時(shí)(例如一千萬(wàn)條),復(fù)雜計(jì)算要先在數(shù)據(jù)庫(kù)外面,以文件系統(tǒng)方式用C++語(yǔ)言計(jì)算處理完成之后,最后才入庫(kù)追加到表中去。這是電信計(jì)費(fèi)系統(tǒng)設(shè)計(jì)的經(jīng)驗(yàn)。
(3) 發(fā)現(xiàn)某個(gè)表的記錄太多,例如超過(guò)一千萬(wàn)條,則要對(duì)該表進(jìn)行水平分割。水平分割的做法是,以該表主鍵PK的某個(gè)值為界線,將該表的記錄水平分割為兩個(gè)表。若發(fā)現(xiàn)某個(gè)表的字段太多,例如超過(guò)八十個(gè),則垂直分割該表,將原來(lái)的一個(gè)表分解為兩個(gè)表。
(4) 對(duì)數(shù)據(jù)庫(kù)管理系統(tǒng)DBMS進(jìn)行系統(tǒng)優(yōu)化,即優(yōu)化各種系統(tǒng)參數(shù),如緩沖區(qū)個(gè)數(shù)。
(5) 在使用面向數(shù)據(jù)的SQL語(yǔ)言進(jìn)行程序設(shè)計(jì)時(shí),盡量采取優(yōu)化算法。
總之,要提高數(shù)據(jù)庫(kù)的運(yùn)行效率,必須從數(shù)據(jù)庫(kù)系統(tǒng)級(jí)優(yōu)化、數(shù)據(jù)庫(kù)設(shè)計(jì)級(jí)優(yōu)化、程序?qū)崿F(xiàn)級(jí)優(yōu)化,這三個(gè)層次上同時(shí)下功夫。
上述十四個(gè)技巧,是許多人在大量的數(shù)據(jù)庫(kù)分析與設(shè)計(jì)實(shí)踐中,逐步總結(jié)出來(lái)的。對(duì)于這些經(jīng)驗(yàn)的運(yùn)用,讀者不能生幫硬套,死記硬背,而要消化理解,實(shí)事求是,靈活掌握。并逐步做到:在應(yīng)用中發(fā)展,在發(fā)展中應(yīng)用。
特別聲明以上內(nèi)容是轉(zhuǎn)至http://dev2dev.bea.com.cn/bbsdoc/20060112181.html,如果您認(rèn)為該文檔的內(nèi)容侵犯了您的權(quán)益,請(qǐng)與整理者(excelarthur.com.cn)聯(lián)系,與Dev2Dev網(wǎng)站無(wú)關(guān)。
這個(gè)異常是在測(cè)試EJB的時(shí)候,程序執(zhí)行到ctx.lookup("testEJB")時(shí)拋出的。由NamingException捕捉到。打印出棧軌跡是 <ejb-jar> <weblogic-ejb-jar>
javax.naming.NameNotFoundException: Unable to resolve 'TestEJB'. Resolved ''; remaining name 'TestEJB'
at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1123)
at weblogic.jndi.internal.BasicNamingNode.lookupHere(BasicNamingNode.java:250)
at weblogic.jndi.internal.ServerNamingNode.lookupHere(ServerNamingNode.java:171)
at weblogic.jndi.internal.BasicNamingNode.lookup(BasicNamingNode.java:204)
at weblogic.jndi.internal.WLEventContextImpl.lookup(WLEventContextImpl.java:267)
at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:362)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at testejb.servlet.SrvEJB.init(SrvEJB.java:26)
at javax.servlet.GenericServlet.init(GenericServlet.java:256)
at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:265)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.StubSecurityHelper.createServlet(StubSecurityHelper.java:61)
at weblogic.servlet.internal.StubLifecycleHelper.createOneInstance(StubLifecycleHelper.java:58)
at weblogic.servlet.internal.StubLifecycleHelper.<init>(StubLifecycleHelper.java:48)
at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:502)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:224)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:165)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3022)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:1925)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:1848)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1288)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:207)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:179)
我的ejb-jar.xml文件描述如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "
<display-name>EJB</display-name>
<enterprise-beans>
<session>
<ejb-name>TestEJB</ejb-name>
<home>testejb.ejb.TestEJBHome</home>
<remote>testejb.ejb.TestEJBRemote</remote>
<ejb-class>testejb.ejb.TestEJBBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>TestEJB</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
weblogic-ejb-jar.xml文件描述如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-ejb-jar PUBLIC "-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN" "
<weblogic-enterprise-bean>
<ejb-name>TestEJB</ejb-name>
<jndi-name>TestEJB</jndi-name>
</weblogic-enterprise-bean>
</weblogic-ejb-jar>
這些配置我都寫(xiě)了為什么還有名字沒(méi)有找到的異常呢?
請(qǐng)大家?guī)兔纯础Vx謝! QQ:86322591。MSN:rodney_luo@163.com
OS: Windows Server 2000 SP4
開(kāi)發(fā)工具:JBuilder 2006。
WEB服務(wù)器:Weblogic9.0
數(shù)據(jù)庫(kù):DB2 V7.2
使用Type2的JDBC連接方式。因?yàn)镈B2 V7.2只支持Type2與Type3的連接。
我新建了一個(gè)TestDB類(lèi),在這個(gè)類(lèi)中我可以連接到DB2中,并且取出數(shù)據(jù)。可是我把這個(gè)連接的方法寫(xiě)到Servlet中就不能連接到該數(shù)據(jù)庫(kù)中了。拋出ClassNotFoundException的異常。 請(qǐng)大家?guī)兔矗以谙到y(tǒng)環(huán)境有設(shè)置Classpath的DB2驅(qū)動(dòng)程序包。并在WEB-INF\lib目錄下也有這個(gè)驅(qū)程驅(qū)動(dòng)程序包。它就是在Sevelt中要拋出ClassNotFoundException的異常。。。。。
QQ:86322591
MSN: rodney_luo@163.com
Email: rodney_luo@163.com
謝謝大家。