sqlite + java + connection pool + glassfish

Glassfishの設定
http://sourceforge.net/p/sqlite-connpool/wiki/How%20To%20Setup%20a%20SQLite%20Connection%20Pool%20on%20Glassfish/


Java source code
http://sourceforge.net/p/sqlite-connpool/home/Home/



おまけ 設定
java - Set SQLite connection properties in c3p0 connection pool - Stack Overflow

  • -
  • -

2015-07-14

Class.forName("org.sqlite.JDBC");でエラーがでるようであれば、sqlite-jdbc-3.7.2.jarを適切な場所に配置してglassfishを再起動したら直るもよう。置く場所はdomain/domain1/libだったと思う。

JAX-RS Viewable | jspで変数が展開されずにハマった

問題

${it}

これがjspでそのまま

${it}

と表示されてしまう。

解決方法

<%@ page isELIgnored="false" %>

java - JSP: EL expression is not evaluated - Stack Overflow

これでもいける

<%=pageContext.findAttribute("it")%>

なぜハマってしまったのか
原因がJAX-RSかViewable近辺にあると思いこんでいた。。
あと、jspのこの変数の方式が、「EL」という名前だと知っていれば多少まともな検索結果がヒットしていたのかもしれない。

Route53の設定を変えるとしばらくホスト名が解決できなくなる

しかしながら、他のネットワークからならアクセスできた。
あと、15分くらい待ったらすべてのネットワークの端末からアクセスできるようになった。

かなり不確かな情報だけど、プロバイダーがそういう情報をキャッシュとしてもっていてそのキャッシュが更新されるまでは古い情報のままだから、みたいな情報をどこかで読んだ気がする。
だから見れなかったのだと思う


Route53の
>TTL (Seconds):
には60secを指定しても、実際に見れるのは結構時間がかかった。


ネットワーク周りの知識皆無なので設定が間違っているのかなんなのかわからず途方に暮れて放置した結果、うまくいった。

Elastic Beanstalk + logback

beanstalkでtomcatデプロイ。で、ログを出したいだけなのに 何かといろいろ調べなければならなかった。


pom.xmlに依存を加える
<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.5</version>
		</dependency>
	    <dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-jdk14</artifactId>
			<version>1.7.5</version>
		</dependency>
	    <dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>1.7.5</version>
		</dependency>
	    <dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>log4j-over-slf4j</artifactId>
			<version>1.7.5</version>
		</dependency>
		<dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>0.9.15</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>0.9.15</version>
        </dependency>

このままだと、何かが重複している警告がでるが、今はとりあえず無視

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/gen/workspace2/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/jrs/WEB-INF/lib/logback-classic-0.9.15.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/gen/workspace2/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/jrs/WEB-INF/lib/slf4j-jdk14-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.selector.DefaultContextSelector]
SLF4J: The requested version 1.5.6 by your slf4j binding is not compatible with [1.6, 1.7]
SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details.

src/main/resources以下にlogback.xmlというファイル名で設定ファイルを作る
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration>

<configuration>
 
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
    </layout>
  </appender>
  
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>aaa.log</file>
    <Encoding>UTF-8</Encoding>
    <layout class="ch.qos.logback.classic.PatternLayout">
      <param name="Pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n" />
    </layout>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <FileNamePattern>aaa.log.%d{yyyy-MM-dd}.gz</FileNamePattern>
      <MaxHistory>30</MaxHistory>
    </rollingPolicy>
  </appender>
  
  <logger name="jp">
    <level value="DEBUG" />
    <appender-ref ref="FILE" />
  </logger>
   
  <root level="debug">
    <appender-ref ref="FILE" />
  </root>
</configuration>
logをtail

デプロイされたec2インスタンスsshでログインして、ログを見ることができる

tail -f /usr/share/tomcat7/aaa.log

beanstalkのWEB管理画面のログにはどうやって出すんだろう。。

それっぽい情報はあるが、めんどい。。
jcabi-beanstalk-maven-plugin - Using syslogd at Amazon Elastic Beanstalk

AWS + java + JAX-RS + session のメモ

beanstalkでさっとdynamodbのセッションを作る

Amazon DynamoDBによるTomcatセッション永続化とフェイルオーバー | Developers.IO

eclipseで普通にやるとsession用のdynamodbのテーブルが日本以外のリージョンにできてしまうので、context.xmlに以下の属性値を加える。

regionId="ap-northeast-1"

jax-rs

最初にbeanstalkでdynamodbセッション連携付きで適当なjavaアプリケーションをデプロイし、その後に同じEnvironmentにJAX-RSのアプリケーションをデプロイしたら、最初に作ったdynamodbのセッション機構が生き残っていた。
とりあえずはこれでいい。

sessionを触る

web services - How Can I Retrieve The Session Id from a Jax RS Webservice? - Stack Overflow

@Path("/session-id.txt")
public class SessionIdResource
{
@GET @Produces(MediaType.TEXT_PLAIN)
public String getSessionId( @Context HttpServletRequest request ){
return request.getSession(true).getId();
}
}

最終的にpom.xmlのdependenciesに以下を追記

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk</artifactId>
  <version>1.9.22</version>
</dependency>
<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>servlet-api</artifactId>
   <version>2.5</version>
   <scope>provided</scope>
</dependency>

=========しきりなおし===============

上記のやり方でJAX-RS上でDynamoDBに接続しようとしたところ、classpathの問題が発生した。

SEVERE: Servlet.service() for servlet [Jersey Web Application] in context with path [] threw exception [org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient] with root cause
java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient

よくわからなかったので、jax-rs周りからやり直すことにした。


JAX-RS
JAX-RS(Jersey)を使ってみる - azuki note

DynamoDB
周回遅れエンジニアノート: DynamoDB で tomcat の session を管理する
AWS - DynamoDBのドキュメントAPI、JSON対応したから簡単なサンプルで紹介する part1 - Qiita

private void getUser(String uid, String tableName) {
    	//LOGGER.info("getUser start");
    	AWSCredentials credentials = new BasicAWSCredentials("XXXXXX", "XXXXXX");
        AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials);
        client.setEndpoint("dynamodb.ap-northeast-1.amazonaws.com");
        System.out.println("ok");
        
        DynamoDB dynamo = new DynamoDB(client);
        Table table = dynamo.getTable("User");
        Item item = table.getItem("uid", "abcde");
        //AttributeをMap<String, Object>でまわせるのは便利
        for (Map.Entry<String, Object> attribute : item.attributes()) {
            System.out
                    .println(attribute.getKey() + ", " + attribute.getValue());
        }
        //LOGGER.info("getUser end");
    }

JDK1.8をcentosに入れて、デフォルトのjavaを入れ替える で jstatで監視

jstatを使ってヒープの監視がしたかったのでいれる。

このサイトの通りでいけた。
How to Install Java 8 (Jdk 8u31) on CentOS/RHEL 7/6/5

cd /opt/
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u31-b13/jdk-8u31-linux-x64.tar.gz"
tar xzf jdk-8u31-linux-x64.tar.gz

cd /opt/jdk1.8.0_31/
alternatives --install /usr/bin/java java /opt/jdk1.8.0_31/bin/java 2
# alternatives --config java
alternatives --config java

alternatives --install /usr/bin/jar jar /opt/jdk1.8.0_31/bin/jar 2
alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_31/bin/javac 2
alternatives --set jar /opt/jdk1.8.0_31/bin/jar
alternatives --set javac /opt/jdk1.8.0_31/bin/javac

### check
java -version
# java version "1.8.0_31"
# Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
# Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)

###
vim /etc/bashrc
===============
export JAVA_HOME=/opt/jdk1.8.0_31
export JRE_HOME=/opt/jdk1.8.0_31/jre
export PATH=$PATH:/opt/jdk1.8.0_31/bin:/opt/jdk1.8.0_31/jre/bin
===============

jstatでメモリの使用率を監視

# 調べたいプロセスのIDを調べる
jps -v

# 5秒に一回監視
jstat -gcutil -t ${TARGET_PID} 5000