Tomcat6のcometを試す。

Tomcat6を使ってCometができるようなので試す。
http://www.oki.com/jp/oss/document/tomcat/tomcat60-docs-ja/aio.html

Cometの通信を扱うクラスは、org.apache.catalina.CometProcessorインタフェースをしたサーブレットとして用意する。

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.apache.catalina.CometEvent;
import org.apache.catalina.CometProcessor;

public class CometTestServlet extends HttpServlet
                         implements CometProcessor {

	public void event(CometEvent event) 
                 throws IOException, ServletException {

	}

}

まずは、CometEventの中を見たいので、eventメソッドの中に以下のコードを追加。

String eventStr = ToStringBuilder.reflectionToString(event,
			ToStringStyle.MULTI_LINE_STYLE);
System.out.println("Recieve CometEvent ----------------");
System.out.println(eventStr);

Tomcat6を再起動の前に、web.xmlにCometTestServletを登録。

    <servlet>
        <servlet-name>CometTest</servlet-name>
        <servlet-class>comettest.CometTestServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>CometTest</servlet-name>
        <url-pattern>/comet</url-pattern>
    </servlet-mapping>

さらに、server.xmlを以下のように変更。(ちなみに、server.xmlを変更せずにCometTestServletを呼び出すと、405 が返る。)

<!-- default    
    <Connector port="8080" 
               protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />
-->
    <Connector port="8080" 
               protocol="org.apache.coyote.http11.Http11NioProtocol" 
               connectionTimeout="20000" 
               redirectPort="8443" />

準備ができたので、Tomcatを再起動して http://localhost:8080/cometTest/comet にアクセスする。
と、ブラウザはレスポンス待ちの状態まま待機して、Tomcatには以下のようなログが出力される。

Recieve CometEvent ----------------
org.apache.catalina.connector.CometEventImpl@ecb281[
  request=org.apache.catalina.connector.Request@1315d34
  response=org.apache.catalina.connector.Response@1de256f
  eventType=BEGIN
  eventSubType=<null>
]

これで、ブラウザから、Tomcatに対して常駐接続が張られたらしい。

あぁ。
なんか眠くなってきた。

Oracleのスクロール可能カーソルの実装

S2Pagerを使っていたら大量な検索結果のあるSQLで、OutOfMemoryError。

原因を調べていたら、これ。

http://otndnld.oracle.co.jp/document/products/oracle10g/101/doc_v5/java.101/B13514-02.pdf
via http://otn.oracle.co.jp/forum/thread.jspa?messageID=11006931

P17-5
基礎となるサーバーがスクロール可能なカーソルをサポートしていないので、スクロール可
能性は別のレイヤーでOracle JDBC によって実装する必要があります。
この機能は、スクロール可能な結果セットの行をクライアント側のメモリー・キャッシュに
格納することにより、実現されていることに注意してください。

重要: スクロール可能な結果セットの行はすべて、クライアント側の
キャッシュに格納されます。そのため、結果セットに多くの行、多くの列
または非常に大きな列が含まれていると、クライアント側のJava Virtual
Machine に障害が発生する可能性があります。大きな結果セットにはスク
ロール可能性を指定しないでください。

とりあえず、PagerStatementFactory を使用せずに、BasicStatementFactory を使用するようにすることで対応。