作为开发人员,我们很清楚无法通过鼠标点击才能启动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数据库的启动和运作有一定的了解,以避免出现不必要的错误。