1
1

More than 3 years have passed since last update.

AWSとオンプレのタイムラグ

Last updated at Posted at 2019-10-06

検証環境
Red Hat Enterprise Linux release 8.1 (Ootpa)
Tomcat-9.0.30
PostgreSQL 10.7
Aurora PostgreSQL 10.6

下記プログラムの実行結果。10回実行の平均値。オーバーヘッド検証のためレコード件数は数件。
Linux内ローカル:541マイクロ秒
マシン内ローカル(vmホストのWindowsとvmゲストのLinux):988マイクロ秒
自宅マシン(横浜)、AWS東京リージョン(Aurora PostgreSQL)のリモート:7304マイクロ秒

Oracleの場合はJDBCドライバのfetchサイズが小さい(デフォルト10)ので要チューニング。
アプリケーションのレスポンス要件に応じて大きくしたほうがよいです。
とある環境ではオンプレとAWSで38ms(pingのレスポンス時間)だったのでプロトコルオーバーヘッドが相応に大きいケースも考慮にいれるべき。

package test;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.annotation.Resource;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

/**
 * Servlet implementation class TestServlet
 */
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Resource(name = "jdbc/postgres")
    private DataSource ds;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public TestServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        Connection con = null;
        long start = 0;
        long end = 0;       

        try {
            con = ds.getConnection();
            //start = System.currentTimeMillis();
            start = System.nanoTime();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("select id from test2");
            int recordCount = 0;
            while (rs.next()) {
                out.println(rs.getInt("id"));
                recordCount++;
            }
            out.println("<br>");
            out.print("recordCount:");
            out.println(recordCount);
            out.println("<br>");
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                con.close();
                end = System.nanoTime();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        out.print("time:");
        out.print((end - start)/1000);
        out.println(" micro sec");
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

Eclipseに内包させたTomcatから直接実機確認するための追加メモ
WebContent/META-INFの下にcontext.xmlを配置する。

<Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <Manager className="org.apache.catalina.session.PersistentManager"
        maxIdleBackup="1"
        minIdleSwap="0"
        maxIdleSwap="0"
        processExpiresFrequency="1"
        saveOnRestart='true'
        >
        <Store className="org.apache.catalina.session.JDBCStore"
                connectionURL="jdbc:postgresql://localhost:5432/tomcat?user=postgres&amp;password=postgres"
                driverName="org.postgresql.Driver"
                sessionAppCol="app_name"
                sessionDataCol="session_data"
                sessionIdCol="session_id"
                sessionLastAccessedCol="last_access"
                sessionMaxInactiveCol="max_inactive"
                sessionTable="tomcat_sessions"
                sessionValidCol="valid_session"
                />
    </Manager>

    <Resource name="jdbc/postgres" auth="Container"
          type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
          url="jdbc:postgresql://192.168.80.131:5432/test"
          username="postgres" password="postgres" maxTotal="20" maxIdle="10" maxWaitMillis="-1"/>
</Context>

Auroraの時は下記のエンドポイント(動作検証後、削除済み)
url="jdbc:postgresql://database-1-instance-1.cofxoo0c8wlr.ap-northeast-1.rds.amazonaws.com:5432/postgres"

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1