为啥 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