интерфейс Bash / Java / MySQL - PullRequest
       5

интерфейс Bash / Java / MySQL

2 голосов
/ 23 декабря 2011

Текущая настройка:

  1. Bash-скрипт запускает цикл for
  2. При каждом цикле выполнения выполняется сценарий Java с несколькими аргументами командной строки
  3. Java устанавливает соединение с MySQL
  4. Java отправляет операторы вставки в MySQL

Я обеспокоен тем, что это не очень эффективно. Каждый раз через скрипт bash Java запускается снова и повторно подключается к базе данных. Как это можно улучшить? Может быть, Java откроет сокет и примет входящие сообщения из bash-скрипта? IDK, как это сделать, или чтобы убедиться, что онл скрипт bash может общаться через этот сокет (а не какой-то вредоносный скрипт / пользователь).

Есть идеи? Мой код Java ниже.

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.logging.Level;
    import java.util.logging.Logger;

    public class Main {

        public static void main(String[] args) throws ClassNotFoundException {

            String arg1 = args[0];
            String arg2 = args[1];
            String arg3 = args[2];
            String arg4 = args[3];
            int arg5 = Integer.parseInt(args[4]);
            int arg6 = Integer.parseInt(args[5]);
            int arg7 = Integer.parseInt(args[6]);

            Connection con = null;
            Statement st = null;
            ResultSet rs = null;
            PreparedStatement preparedStatement;

            String url = "jdbc:mysql://sql.domain.com/table_name";
            String user = "root";
            String password = "password";

           /*
           * SOME LOGIC ...
           */

            try {
                Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection(url, user, password);

                // parameterized SQL statement
                preparedStatement = con.prepareStatement("insert into some_table values (default, ?, ?);");

                // Parameters start with 1 (bogus inserts, ignore these for purpose of question)
                preparedStatement.setString(1, "THE NAME");
                preparedStatement.setString(2, "A VALUE");
                preparedStatement.executeUpdate();

            } catch (SQLException ex) {
                Logger lgr = Logger.getLogger(Main.class.getName());
                lgr.log(Level.SEVERE, ex.getMessage(), ex);

            } finally {
                try {
                    if (rs != null) {
                        rs.close();
                    }
                    if (st != null) {
                        st.close();
                    }
                    if (con != null) {
                        con.close();
                    }

                } catch (SQLException ex) {
                    Logger lgr = Logger.getLogger(Main.class.getName());
                    lgr.log(Level.WARNING, ex.getMessage(), ex);
                }
            }
        }
    }

Ответы [ 2 ]

3 голосов
/ 23 декабря 2011

Как насчет того, если бы вы только что написали цикл в главном, который делает то, что делает цикл скрипта bash?Вы можете показать нам сценарий, но Java может делать все, что делает bash.

Обновление

Было бы действительно помочь, если бы вы показали нам bashскрипт.То, что вы описываете, звучит так, будто вы делаете

for i in a b c d e
do
   java -jar myprogram.jar $i
done

или следуете подобному шаблону.Почему бы не сделать цикл в Java для запуска Java-программы, выполняющей всю работу в Java?Все, что вам действительно нужно, это добавить

foreach (arg : argv){
    // call your original program
}

или что-то очень близкое к этому.

2 голосов
/ 24 декабря 2011

Один хороший вариант - переместить цикл в код Java, как предлагали другие.

Альтернативой, и я думаю, что что-то, что было бы традиционным подходом Unix, было бы изменить сценарий оболочкицикл для вывода этих аргументов в стандартный вывод и передачи этих выходных данных в ваш скрипт, который затем будет читать их из стандартного ввода.

Итак, если вы в настоящий момент делаете:

for i in a b c d e
do
    java -jar myprogram.jar foo.$i bar.$i baz.$i qux.$i 1 2 3
done

Выможет изменить его на:

for i in a b c d e
do
    echo foo.$i bar.$i baz.$i qux.$i 1 2 3
done | java -jar myprogram.jar

Если ваш java-код изменится на что-то вроде:

public static void main(String... args) {
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    String line;
    while ((line = in.readLine()) != null) {
        String[] words = line.split(" "); // this could be done more robustly

        String arg1 = words[0];
        String arg2 = words[1];
        String arg3 = words[2];
        String arg4 = words[3];
        int arg5 = Integer.parseInt(words[4]);
        int arg6 = Integer.parseInt(words[5]);
        int arg7 = Integer.parseInt(words[6]);

        // then carry on as before
    }
}

Это проще, чем использовать сокет.Это также более безопасно, потому что только ваш скрипт имеет доступ к стандартному вводу подпроцесса Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...