2

Javaプログラムでクエリを実行し、結果をジャージーベースの安らかなWebサービスに送信するJavaスケジュールタスクがあります。これは 1 つのケースの一部のケースでは正しく機能しているように見えますが、機能せず、最終的にはJava.lang.OutOfMemoryError: Java heap space

次のプログラムでは、データはチャンクでストリーミングされますが、クエリ データの 1 つは複数回フラッシュされません。このため、すべてのチャンクがメモリに蓄積され、メモリ不足の例外が発生します。

Java - OutputStream を HTTP ファイルとしてアップロードする HttpURLConnection のタイムアウトに関する質問、Java EE アプリケーションで大きなレコードを処理する方法については既に説明しました。

それらの多くは HTTPClient の使用を提案していますが、可能であれば使用を避けたいと考えています。

 for (int i = 0; i < arr.length(); i++) {
            try {
                JSONObject obj = arr.getJSONObject(i);
                StringBuffer query = new StringBuffer((String) obj.get("query")); // Getting one query from list of queries
                int size =500;
                int count = 0;
                URL url = new URL("http://urltomyserver.com");
                java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
                System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
                httpcon = (HttpURLConnection) url.openConnection();
                httpcon.setChunkedStreamingMode(1024 * 1024);
                httpcon.setAllowUserInteraction(false);
                httpcon.setDoOutput(true);
                httpcon.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
                httpcon.setRequestMethod("POST");
                OutputStream rawOutStream = httpcon.getOutputStream();
                BufferedWriter w = new BufferedWriter(new OutputStreamWriter(rawOutStream));
                do {
                    Query q = new Query(query + " limit " + count + ", " + size);
                    count += size;
                    Map[] results = q.runQuery();
                    JSONArray resultArr = new JSONArray(results);
                    w.write(resultArr.toString(1));
                    w.flush();
                } while (results != null && results.length > 0);
                InputStream inputStream = httpcon.getInputStream();
                w.close();
            } catch (Exception ex) {
                EcwLog.AppendExceptionToLog(ex);
            }
        }

サーバー側受信関数の定義は以下の通り

public String saveResultsMP(@QueryParam("apuId") final String apuId, @QueryParam("tableName") String tableName, @QueryParam("queryId") String query_id, InputStream uploadedInputStream) {
4

0 に答える 0