моя 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());
}
EDIT: Здесь другой подход, но он дает мне эту ошибку. Я попробовал использовать настоящие команды mysql вместо использования hibernate, поскольку я изначально был, но все же безрезультатно. Ожидание там, чтобы дать восстановлению некоторое время, чтобы добраться до места, где он зависает из-за блокировок, а затем закрыть программу, чтобы блокировки и база данных были освобождены:
// 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'
Ваша оболочка понимает перенаправление ввода "<", но Java не запускает оболочку! Попробуй это:
String shellCommand[] =
{"/usr/bin/mysql", "-h", "127.0.0.1",
"-u", "myDBuser",
"--password=aMeHoElA",
"-e", "source /here/is/myscript.sql" };
executeCommand(shellCommand);
и изменить (команда теперь представляет собой строковый массив):
public static void executeCommand(String command[]) {
и не забудьте прочитать вывод ошибки, это помогло бы вам:
BufferedReader ereader =
new BufferedReader(new InputStreamReader(process.getErrorStream()));
String eline = "";
while ((eline = ereader.readLine())!= null) {
output.append("ERROR: " + eline + "\n");
MySQL должен "source myscript.txt" как один параметр. Когда вы помещаете его в строку с остальной частью команды, Java передает ее как два аргумента, которых невозможно избежать.