アーカイブ「2015年11月」

昨日書いた記事を検証してみた。

 

以下3つの例を検証。

 

1.単純ケース

@WebServlet(name = "test01", urlPatterns = {"/test01"})
public class Test01 extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String name = req.getParameter("name");

    try (PrintWriter writer = resp.getWriter();) {
      resp.setStatus(200);
      resp.setContentType("text/plain");
      writer.write("name is " + name);
      writer.flush();
      writer.close();
    }
  }
}

 

2.絶対ダメなケース

@WebServlet(name = "test02", urlPatterns = {"/test02"})
public class Test02 extends HttpServlet {

  private String name;

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    name = req.getParameter("name");

    try (PrintWriter writer = resp.getWriter();) {
      resp.setStatus(200);
      resp.setContentType("text/plain");
      writer.write("name is " + name);
      writer.flush();
      writer.close();
    }
  }
}

 

3.今回検証したかったケース

@WebServlet(name = "test03", urlPatterns = {"/test03"})
public class Test03 extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    new MyClass(req, resp).execute();
  }

  class MyClass {

    private HttpServletRequest req;
    private HttpServletResponse resp;
    private String name;

    public MyClass(HttpServletRequest req, HttpServletResponse resp) {
      this.req = req;
      this.resp = resp;

      name = req.getParameter("name");
    }

    public void execute() throws IOException {
      try (PrintWriter writer = resp.getWriter();) {
        resp.setStatus(200);
        resp.setContentType("text/plain");
        writer.write("name is " + name);
        writer.flush();
        writer.close();
      }
    }
  }
}

 

結論としては、3は大丈夫であった。

jmeterで同時接続100を10回やって、一度も不整合は起きず。

 

投稿日時:2015年11月27日 14:52   カテゴリー:java   [コメントがあればどうぞ]

servletはエントリーポイントのインスタンスは1つしか作成しない。

そして、それが複数スレッドで共有される。

そのため、インスタンスフィールドはスレッドセーフにならない。

 

・スレッドセーフではない例

public class TestServlet extends HttpServlet {
  private String name;

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    name = req.getParameter("name");

    PrintWriter writer = res.getWriter();
    writer.print(name);
  }
}

 

で、ここからがわからんところなのだが、

ローカル変数はスレッドセーフになるのだから、

doGetの処理の中で、以下のようなことをしたら、問題ないのか?

public class TestServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    new MyClass(req, res).execute();
  }
}

public class MyClass {
  private HttpServletRequest req;
  private HttpServletResponse res;

  public MyClass(HttpServletRequest req, HttpServletResponse res) {
    this.req = req;
    this.res = res;
  }

  public void execute() {
    String name = req.getParameter("name");

    PrintWriter writer = res.getWriter();
    writer.print(name);
  } 
} 

 

もし、上記でスレッドセーフになるっていうなら、

それでよくね?って思っちゃう。

 

それとも、MyClassのインスタンスフィールドは実はスレッドセーフではないのか?

 

メモリ使用量としては、生成するインスタンス分大きいのはわかるが、

もし上記で解決するなら、煩わしいスレッド問題とはオサラバできると思うのだが、

問題あるのだろうか?

 

servletはフレームワークの世界だから、厳密にわかる人は少ないのだろうけど、

ここは教えて欲しい。。。

 

・・・後日

上の例は大丈夫だった。

新しく記事を書きました。

投稿日時:2015年11月26日 19:58   カテゴリー:java   [コメントがあればどうぞ]

RDBで大量のselectをしたら、

DBサーバの負荷は重いのだろうか?

例えば、1億レコードが入っているテーブルに対して、

select * from [table]

したら、DBサーバの負荷は重いのだろうか?

 

個人的に思うところとして、

サーバ側は、クライアント側に一定のバッファで

結果を返すことにのみ注力しているのであれば、

少々ネットワークは忙しくなるかもしれないが、

サーバのシステム負荷(CPU使用率、メモリ使用率)は低いんじゃないか?

って考えてます。

 

誰か教えて欲しいわ。。

ソースコード見るしかないかね。。

 

この仮定が成立するとすれば、

インデックスがない環境で複雑なクエリーを発行するより、

一気に大量レコードを引いて、

アプリケーションプログラムで分散並列で処理しちゃえば、いいんじゃないの?って思う。

Hadoopは詳しくないけど、似たようなものなのかな?

ちょっと勉強してみようかな。。

 

投稿日時:2015年11月26日 13:07   カテゴリー:rdb   [コメントがあればどうぞ]

AWSのRDSにmariadbが追加されましたね。

 

xtradbのサポートはあるようだけど、

mariadbのクラスター関連のエンジンはサポートしていない感じがする。

 

AWSの場合、Auroraがあるから、mariadb流行らないかも。。

 

クラスター関連をサポートしてくれないかな。。

 

投稿日時:2015年11月17日 13:19   カテゴリー:aws, mariadb   [コメントがあればどうぞ]

windows10にvirtualbox5を入れて、

ゲストOSをローカルネットワーク内に参加させる方法が、

windows8とvirtualbox4のときと異なったので、

メモしておく。

 

以前は、wifiとホストオンリーアダプタでブリッジを作っていたが、

今回はブリッジのみでいけるが、Oracleのドライバーが必要らしい。

 

(前提)

  • ホストOSのアドレスは192.168.1.10
  • ゲストOSのアドレスは192.168.1.15
  • 他ホストのアドレスを192.168.1.11

とする。

 

手順1. Oracleのドライバーを入れる

ホストオンリーアダプタのプロパティから、以下の画面を開き、

「VirtualBox NDIS6〜」なるものをインストールする。

vbox5_01

 

立ち上がった画面で、「サービス」を選択して追加する。

vbox5_02

 

「「VirtualBox NDIS6〜」なるものを選択して「OK」を押す。

vbox5_03

 

これで、ok。

 

手順2. ゲストOSのネットワークにブリッジアダプターを選択する

ゲストOSの設定で、ブリッジアダプターを選択する。

vbox5_04

 

手順3. ゲストOSのネットワークを固定IPに設定する

今回は192.168.1.15とする。

 

これで、ゲスト側のネットワークを起動すれば、

192.168.1.11のような同一ネットワーク内の他ホストから接続可能となる。

もちろん、firewall等もあるから、そこは適宜設定。

 

以上

 

投稿日時:2015年11月06日 13:49   カテゴリー:virtualbox, windows   [コメントがあればどうぞ]