Как использовать JAVA для вызова веб-API, когда скорость ограничена, а затем вставить в SQL Server - PullRequest
0 голосов
/ 27 июня 2019

API, который я собираюсь вызвать, это: https://restapi.amap.com/v3/geocode/geo?{parameters} (https://lbs.amap.com/api/webservice/guide/api/georegeo). Скорость вызова ограничена поставщиком до 200 раз в минуту.

Что мне нужно, так эточитать строки из SQL Server и вызывать их API одним столбцом из строки, чтобы получить результаты, и вставлять результаты в другую таблицу в строке SQL Server строка за строкой.

Я знаю, как использовать JDBC, какчтобы получить значение, возвращаемое API, но я не знаю, как организовать их элегантно.

        DriverManager.registerDriver(new SQLServerDriver());
        try (
                SQLServerConnection conn = (SQLServerConnection) DriverManager.getConnection(dbURL, userName, userPwd);
                Statement stmt = conn.createStatement();
                ResultSet resultSet = stmt.executeQuery(
                        the sql to get rows);
                PreparedStatement pstmt = conn.prepareStatement(
                        "insert into TARGET_TABLE INFO values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
        ) {
            conn.setUseBulkCopyForBatchInsert(true);
            int i = 0;
            // put 10 rows together and then call the API
            StringJoiner addr = new StringJoiner("|");
            List<String> personInfoKeyList = new ArrayList<>();
            long start = System.currentTimeMillis();
            while (resultSet.next()) {
                i++;
                fullAddress; // this is the original column
                personInfoKeyList.add(fullAddress);
                addr.add(fullAddress); // put 10 rows together and send to API
                if (i % 10 == 0) {
                    String addresses = addr.toString();
                    Map<String, Object> map = callApi(addresses);
                    for (int j = 0; j < personInfoKeyList.size(); j++) {
                        // traverse the map the API returned to get value1, value2, value3, etc...
                        ...
                        // then prepare to insert to my table
                        pstmt.setString(1, value1);
                        pstmt.setString(2, value2);
                        pstmt.addBatch();
                        ....
                    }
                    pstmt.executeBatch();
                    personInfoKeyList.clear();
                    addr = new StringJoiner("|");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

Первая проблема - в этом коде слишком много стандартного кода. Как его улучшить?

Вторая проблема заключается в том, что скорость вставки не идеальна. Выполнение executeBatch () с 10 строками может быть не очень хорошей идеей.

Как улучшить код?

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