Команда mysql выводит справочное меню при запуске из Java-программы

0

моя 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'
  • 0
    При таком подходе вы можете выполнять только команды SQL, но не команды mysql. Посмотрите на b3sql.sql, там есть команды.
  • 0
    Так должен ли я просто прочитать каждую строку команды SQL из моего файла .sql и выполнить ее как инструкцию? или есть лучший способ инициировать восстановление базы данных изнутри кода во время работы программы и после этого продолжить выполнение?
Показать ещё 3 комментария
Теги:

1 ответ

0

Ваша оболочка понимает перенаправление ввода "<", но 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 передает ее как два аргумента, которых невозможно избежать.

  • 0
    так что теперь он больше не распечатывает меню, но также не заменяет текущую базу данных, как положено.
  • 0
    Это должно сделать это?
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню