为啥 Runtime.getRuntime().exec(startupOracle);没有完全执行命令

Posted

技术标签:

【中文标题】为啥 Runtime.getRuntime().exec(startupOracle);没有完全执行命令【英文标题】:why Runtime.getRuntime().exec(startupOracle); does not fully execute command为什么 Runtime.getRuntime().exec(startupOracle);没有完全执行命令 【发布时间】:2020-02-16 07:46:09 【问题描述】:

我是 java 初学者,在尝试使用 java 代码启动 oracle 时遇到一些问题。我已经阅读了几个关于这个主题的主题,但没有一个对我有用。这是我的代码:

try 
            Class.forName("oracle.jdbc.driver.OracleDriver");
            String host = "jdbc:oracle:thin:@localhost:1521:orcl";
            String uName = "username";
            String uPass = "password";

            con = DriverManager.getConnection(host, uName, uPass); 

    catch (Exception err)

        
        if (con == null)
       String[] startupOracle = new String[]"cmd ", " /c start cmd /K " + "\"" + " chcp 1251 "
         + " &C:\\app\\Raph\\product\\12.1.0\\dbhome_1\\bin\\sqlplus.exe " + "username/password" 
            + "&startup" ;

       Process pr = Runtime.getRuntime().exec(startupOracle); 
        

我有两个问题:

    Runtime.getRuntime().exec(startupOracle); 一直执行到我登录并在我登录后立即停止执行,从而使第 15 行(“&startup”)未执行。

    我无法使用 "CONNECT / AS SYSDBA" 作为我的用户名连接到 oracle。我想这是由于用户名中的空格和"/" 字符,因为当我使用“系统”作为我的用户名时,我得到了连接。我不知道如何解决以前用户名中空格和"/"的问题。

【问题讨论】:

【参考方案1】:

exec(String[] cmdarray) 的 Javadoc 说:

参数:cmdarray - 包含要调用的命令及其参数的数组。

它的“参数”(复数),表示如果要执行命令foo.exe bar abc,则需要传递 "foo.exe", "bar", "abc" ,而不是 "foo.exe", "bar abc"

对于您的代码,这意味着:

String[] startupOracle = new String[] 
        "cmd",
        "/c",
        "start",
        "cmd",
        "/K",
        "\"chcp 1251" +
          " & " +
          "C:\\app\\Raph\\product\\12.1.0\\dbhome_1\\bin\\sqlplus.exe username/password &startup\""
;

或者类似的东西,虽然我认为你对& 的有些问题。

【讨论】:

谢谢安德烈亚斯,我后来发现了这个问题。我的代码没有问题,我必须将启动命令添加到 glogin.sql 文件中,这解决了我的问题。

以上是关于为啥 Runtime.getRuntime().exec(startupOracle);没有完全执行命令的主要内容,如果未能解决你的问题,请参考以下文章

runtime.getruntime.exec 无法识别可执行文件

为啥 -Xmx 和 Runtime.maxMemory 不一致

Runtime.getRuntime().addShutdownHook()

Android Runtime.getRuntime().exec

在循环中运行“Runtime.getRuntime()。exec()”

如何与 Runtime.getRuntime().exec(command) 程序进行交互?