<不管是企業(yè)級(jí)應(yīng)用還是小型網(wǎng)站,Oracle數(shù)據(jù)庫(kù)都是其中重要的一環(huán)。在運(yùn)行Oracle數(shù)據(jù)庫(kù)時(shí),啟動(dòng)bat文件是一個(gè)不可避免的過(guò)程,本文討論如何啟動(dòng)Oracle數(shù)據(jù)庫(kù)的bat文件以及可能遇到的一些問(wèn)題。>作為開(kāi)發(fā)人員,我們很清楚無(wú)法通過(guò)鼠標(biāo)點(diǎn)擊才能啟動(dòng)Oracle數(shù)據(jù)庫(kù),在Windows下需要打開(kāi)命令行窗口,進(jìn)入Oracle安裝目錄下的bin目錄,并輸入啟動(dòng)數(shù)據(jù)庫(kù)的命令。此命令通常如下所示:
sqlplus /nolog conn / as sysdba startup當(dāng)然這只是最基礎(chǔ)的啟動(dòng)Oracle數(shù)據(jù)庫(kù)的命令,實(shí)際情況更為復(fù)雜。 首先,Oracle數(shù)據(jù)庫(kù)啟動(dòng)需要許多環(huán)境變量的支持,在啟動(dòng)之前,需要將Oracle安裝目錄下的環(huán)境變量文件(如oraenv.bat)運(yùn)行一次,將所需的環(huán)境變量寫入到當(dāng)前終端的環(huán)境變量中。
@echo off echo. echo Set Oracle Environment for windows platform echo Version 11.2.0.1.0 - Production echo Copyright (c) 2001, 2009, Oracle. All rights reserved. echo. set ORACLE_SID=orcl set ORACLE_HOME=D:\oracle\product\11.2.0\dbhome_1 set PATH=%ORACLE_HOME%\bin;%PATH% echo ORACLE_SID=%ORACLE_SID% echo ORACLE_HOME=%ORACLE_HOME% echo PATH=%PATH% echo.這樣,我們就可以啟動(dòng)Oracle數(shù)據(jù)庫(kù),但是在實(shí)際的生產(chǎn)環(huán)境中,Oracle數(shù)據(jù)庫(kù)經(jīng)常還會(huì)被集成到其他應(yīng)用程序中。例如,我們?cè)谝粋€(gè)J2EE應(yīng)用程序中使用了JDBC連接Oracle,如何保證Oracle服務(wù)的正常工作呢? 此時(shí)我們可以通過(guò)Java ProcessBuilder來(lái)啟動(dòng)BAT腳本,在后臺(tái)啟動(dòng)Oracle數(shù)據(jù)庫(kù)。
public static void startOracleServer() throws IOException { String[] cmd = { "cmd", "/c", "start", "startOracle.bat" }; ProcessBuilder pb = new ProcessBuilder(cmd); pb.directory(new File("D:\\oracle\\product\\11.2.0\\dbhome_1\\bin")); Process p = pb.start(); } public static void stopOracleServer() throws IOException { String[] cmd = { "cmd", "/c", "start", "stopOracle.bat" }; ProcessBuilder pb = new ProcessBuilder(cmd); pb.directory(new File("D:\\oracle\\product\\11.2.0\\dbhome_1\\bin")); Process p = pb.start(); }需要注意的是,為了在后臺(tái)運(yùn)行Oracle,可以通過(guò)Windows的“start”命令來(lái)啟動(dòng)BAT文件(如上例中的“startOracle.bat”和“stopOracle.bat”)。同時(shí)在Java ProcessBuilder中要設(shè)置BAT文件所在的目錄,避免出現(xiàn)找不到文件的錯(cuò)誤。 在使用ProcessBuilder啟動(dòng)BAT文件后,由于Oracle需要時(shí)間來(lái)完成啟動(dòng)過(guò)程,我們不能在啟動(dòng)Oracle數(shù)據(jù)庫(kù)后立即嘗試JDBC連接。實(shí)際上,Oracle提供了一個(gè)狀態(tài)文件“ORACLE_HOME/startup.log”,記錄了Oracle服務(wù)啟動(dòng)進(jìn)度。只有當(dāng)該文件存在且最新的一行是“Database opened”時(shí),Oracle服務(wù)才是完全開(kāi)啟的。我們可以借助Java WatchService API定期檢查狀態(tài)文件,一旦“Database opened”出現(xiàn)在最新一行,則說(shuō)明Oracle數(shù)據(jù)庫(kù)已經(jīng)完全開(kāi)啟,程序可以正常使用JDBC來(lái)連接Oracle。
public static void monitorOracleServer() throws InterruptedException { try { Path path = Paths.get(ORACLE_HOME + "/startup.log"); WatchService watchService = FileSystems.getDefault().newWatchService(); path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY); while (true) { WatchKey key = watchService.take(); for (WatchEvent>event : key.pollEvents()) { if (event.context().toString().equals("startup.log")) { String lastLine = getLastLineOfFile(event.context().toString()); if (lastLine.contains("Database opened.")) { System.out.println("Oracle has started"); return; } } } boolean valid = key.reset(); if (!valid) { break; } } } catch (IOException e) { e.printStackTrace(); } }以上方法僅供參考,實(shí)際應(yīng)用中可能還需要一些調(diào)整或改進(jìn),例如兼容Oracle RAC環(huán)境。總之,啟動(dòng)Oracle數(shù)據(jù)庫(kù)BAT文件的過(guò)程并不困難,但需要開(kāi)發(fā)人員對(duì)Oracle數(shù)據(jù)庫(kù)的啟動(dòng)和運(yùn)作有一定的了解,以避免出現(xiàn)不必要的錯(cuò)誤。