淘先锋技术网

首页 1 2 3 4 5 6 7
作为开发人员,我们很清楚无法通过鼠标点击才能启动Oracle数据库,在Windows下需要打开命令行窗口,进入Oracle安装目录下的bin目录,并输入启动数据库的命令。此命令通常如下所示:
sqlplus /nolog
conn / as sysdba
startup
当然这只是最基础的启动Oracle数据库的命令,实际情况更为复杂。 首先,Oracle数据库启动需要许多环境变量的支持,在启动之前,需要将Oracle安装目录下的环境变量文件(如oraenv.bat)运行一次,将所需的环境变量写入到当前终端的环境变量中。
@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.
这样,我们就可以启动Oracle数据库,但是在实际的生产环境中,Oracle数据库经常还会被集成到其他应用程序中。例如,我们在一个J2EE应用程序中使用了JDBC连接Oracle,如何保证Oracle服务的正常工作呢? 此时我们可以通过Java ProcessBuilder来启动BAT脚本,在后台启动Oracle数据库。
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();
}
需要注意的是,为了在后台运行Oracle,可以通过Windows的“start”命令来启动BAT文件(如上例中的“startOracle.bat”和“stopOracle.bat”)。同时在Java ProcessBuilder中要设置BAT文件所在的目录,避免出现找不到文件的错误。 在使用ProcessBuilder启动BAT文件后,由于Oracle需要时间来完成启动过程,我们不能在启动Oracle数据库后立即尝试JDBC连接。实际上,Oracle提供了一个状态文件“ORACLE_HOME/startup.log”,记录了Oracle服务启动进度。只有当该文件存在且最新的一行是“Database opened”时,Oracle服务才是完全开启的。我们可以借助Java WatchService API定期检查状态文件,一旦“Database opened”出现在最新一行,则说明Oracle数据库已经完全开启,程序可以正常使用JDBC来连接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();
}
}
以上方法仅供参考,实际应用中可能还需要一些调整或改进,例如兼容Oracle RAC环境。总之,启动Oracle数据库BAT文件的过程并不困难,但需要开发人员对Oracle数据库的启动和运作有一定的了解,以避免出现不必要的错误。