【发布时间】:2018-03-07 20:57:42
【问题描述】:
我的 mysql 命令正在从 java 程序内部运行并打印出帮助菜单,但是当我在终端中运行完全相同的命令时,它工作正常。不太清楚为什么。
String shellCommand = "mysql -u root < " + destinationDirectory+"/"+ filename;
executeCommand(shellCommand);
执行命令方法如下:
public static void executeCommand(String command) {
StringBuffer output = new StringBuffer();
Process process;
try {
process = Runtime.getRuntime().exec(command);
JOptionPane.showMessageDialog(null, "COMMAND: "+ command);
process.waitFor();
BufferedReader reader =
new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = "";
while ((line = reader.readLine())!= null) {
output.append(line + "\n");
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.toString());
e.printStackTrace();
}
System.out.println(output.toString());
}
编辑: 这是另一种方法,但它给了我这个错误我尝试运行实际的 mysql 命令而不是像原来那样使用休眠但仍然无济于事。等待是为了给恢复一些时间来到达由于锁而挂起的位置,然后关闭程序以便释放锁和数据库:
// JDBC driver name and database URL
final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
final String DB_URL = "jdbc:mysql://" + HOST + "/" + DATABASE;
Connection conn = null;
final Statement stmt;
try{
//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
//STEP 3: Open a connection
System.out.println("Connecting to a selected database...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
System.out.println("Connected database successfully...");
//STEP 4: Execute a query
stmt = conn.createStatement();
Services.endServices();
Thread progress = new Thread() {
@Override
public void run() {
try {
String sql = "source /mount/mf/outbox/b3sql.sql";
stmt.executeUpdate(sql);
System.out.println("Database loaded successfully...");
}catch(SQLException se){
//Handle errors for JDBC
se.printStackTrace();
}
}
};
progress.start();
TimeUnit.SECONDS.sleep(15);
System.exit(0);
}catch(SQLException se){
//Handle errors for JDBC
se.printStackTrace();
}catch(Exception e){
//Handle errors for Class.forName
e.printStackTrace();
}finally{
//finally block used to close resources
try{
conn.close();
}catch(SQLException se){
}// do nothing
try{
if(conn!=null)
conn.close();
}catch(SQLException se){
se.printStackTrace();
}//end finally try
}//end try
-
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'source /mount/mf/outbox/b3sql.sql'
【问题讨论】:
-
这种方式只能执行SQL命令,不能执行mysql命令。看看 b3sql.sql,里面的命令。
-
那么我应该从我的 .sql 文件中读取每一行 SQL 命令并将其作为语句执行吗?或者有没有更好的方法在程序运行时从代码内部启动恢复数据库,然后让它继续执行?
-
你可以试试,但我不知道b3sql.sql里面有什么命令。如果您在我的回答中按照我的说明进行操作,您的 java 程序将执行 mysql 并获取 b3sql.sql。如果这是您的数据库的一次性恢复,为什么不从命令行运行它?
-
我不认为它是一次恢复,因为它永远不会再次完成,它是我的程序的一项功能,能够恢复/加载任何旧的 sql 文件,而程序启动然后重新启动程序
-
当您尝试我的回答时,您只是说“它无法恢复”。如果您添加了错误处理,您应该已经看到脚本的标准输出或标准错误。请举一个这样的脚本的例子。