ラベル JAVA の投稿を表示しています。 すべての投稿を表示
ラベル JAVA の投稿を表示しています。 すべての投稿を表示

2010年5月18日火曜日

[SQLite] not implemented by SQLite JDBC driver

SQLiteをJavaで使う時、
「REAL」タイプをjava側のBigDecimalにマッピングするのはできないらしい。

「not implemented by SQLite JDBC driver」というエラーが発生する。

調べてみると、ResultSetの「getBigDecimal()」と「getBLOB()」も使えないようだ。

2010年4月10日土曜日

SQLiteとH2の性能比較

H2とSQLite3の性能比較が知りたくて調べてみたが
古い記事しかなかったので簡単に性能比較してみた。

SQLiteバージョン : 3.6.23
H2バージョン : 1.2.132

テスト言語はJava(プロジェクトがJavaベースなので)
SQLiteのJDBCドライバは「SQLiteJDBC」を使用した。

SQLiteJDBC : http://www.zentus.com/sqlitejdbc/

テスト環境1


- CPU : 2.53 GHz Intel Core 2 Duo
- Memory : 4GB
- OS : Mac OS X 10.6.3
区分SQLiteH2 EmbeddedH2 In-memory
Insert (100万件)0.5 秒0.9 秒0.9 秒
Select (100万件)0.002 秒0.015 秒0.07 秒
File size2,048 bytes14,336 bytes-


テスト環境2


- CPU : 2.53 GHz Intel Core 2 Duo
- Memory : 4GB
- OS : Mac OS X 10.6.3
区分SQLiteH2 EmbeddedH2 In-memory
Insert (100万件)0.5 秒1.3 秒1.5 秒
Select (100万件)0.004 秒0.09 秒0.095 秒
File size2,048 bytes14,336 bytes-


簡単なテストだが全板的にSQLiteの勝ち。
特に瀬能が低いマシンではもっとH2よりパフォーマンスがいいらしい。
でもH2は今まで「In-memory」方式が「組込み」より早いと思ったのが大間違いだったのがショックだ。


下はテストで使用したソース

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class SqlitePerformance {
private static final int ROW_COUNT = 1000000;
private static final int MAX = 100;

/**
* SQLite3 Embedded
*
* @author babukuma
* @since 2010/04/09
* @param args
*/
public static void main(String[] args) throws Exception {
System.out.println("SQLite TEST [" + ROW_COUNT + "件]");
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager
.getConnection("jdbc:sqlite:babukuma.sqllite.db");

Statement stat = conn.createStatement();
stat.executeUpdate("drop table if exists babukuma;");
stat
.executeUpdate("create table babukuma (id integer primary key, value integer);");

conn.setAutoCommit(false);
System.out.print("Insert Test : ");
long startTime = System.currentTimeMillis();

PreparedStatement prep = conn
.prepareStatement("insert into babukuma values (?, ?);");

for (int i = 0; i < ROW_COUNT; i++) {
prep.setInt(1, i);
prep.setInt(2, i);
prep.addBatch();

if (i > 0 && (i % MAX) == 0 && i == ROW_COUNT - 1) {
prep.executeBatch();
prep.clearBatch();
}
}

conn.commit();

long endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");

System.out.print("Select Test : ");
startTime = System.currentTimeMillis();
ResultSet rs = stat.executeQuery("select * from babukuma;");
while (rs.next()) {
rs.getInt("id");
rs.getInt("value");
// System.out.println("id = " + rs.getInt("id"));
// System.out.println("value = " + rs.getString("value"));
}
rs.close();
endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");

conn.close();
}
}


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import org.h2.jdbcx.JdbcConnectionPool;

public class H2Performance {
private static final int ROW_COUNT = 1000000;
private static final int MAX = 100;

/**
* H2 Embedded
*
* @author babukuma
* @since 2010/04/09
* @param args
*/
public static void main(String[] args) throws Exception {
System.out.println("H2 TEST [" + ROW_COUNT + "件]");
JdbcConnectionPool cp = JdbcConnectionPool.create(
"jdbc:h2:babukuma.h2", "", "");
Connection conn = cp.getConnection();

Statement stat = conn.createStatement();
stat.executeUpdate("drop table if exists babukuma;");
stat
.executeUpdate("create table babukuma (id int primary key, value int);");

conn.setAutoCommit(false);
System.out.print("Insert Test : ");
long startTime = System.currentTimeMillis();

PreparedStatement prep = conn
.prepareStatement("insert into babukuma values (?, ?);");

for (int i = 0; i < ROW_COUNT; i++) {
prep.setInt(1, i);
prep.setInt(2, i);
prep.addBatch();

if (i > 0 && (i % MAX) == 0 && i == ROW_COUNT - 1) {
prep.executeBatch();
prep.clearBatch();
}
}

conn.commit();

long endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");

System.out.print("Select Test : ");
startTime = System.currentTimeMillis();
ResultSet rs = stat.executeQuery("select * from babukuma;");
while (rs.next()) {
rs.getInt("id");
rs.getInt("value");
// System.out.println("id = " + rs.getInt("id"));
// System.out.println("value = " + rs.getString("value"));
}
rs.close();
endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");

conn.close();
}
}


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import org.h2.jdbcx.JdbcConnectionPool;

public class H2InMemoryPerformance {
private static final int ROW_COUNT = 1000000;
private static final int MAX = 100;

/**
* H2 In memory
*
* @author babukuma
* @since 2010/04/09
* @param args
*/
public static void main(String[] args) throws Exception {
System.out.println("H2 In Memory TEST [" + ROW_COUNT + "件]");
JdbcConnectionPool cp = JdbcConnectionPool
.create("jdbc:h2:mem:", "", "");
Connection conn = cp.getConnection();

Statement stat = conn.createStatement();
stat.executeUpdate("drop table if exists babukuma;");
stat
.executeUpdate("create table babukuma (id int primary key, value int);");

conn.setAutoCommit(false);
System.out.print("Insert Test : ");
long startTime = System.currentTimeMillis();

PreparedStatement prep = conn
.prepareStatement("insert into babukuma values (?, ?);");

for (int i = 0; i < ROW_COUNT; i++) {
prep.setInt(1, i);
prep.setInt(2, i);
prep.addBatch();

if (i > 0 && (i % MAX) == 0 && i == ROW_COUNT - 1) {
prep.executeBatch();
prep.clearBatch();
}
}

conn.commit();

long endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");

System.out.print("Select Test : ");
startTime = System.currentTimeMillis();
ResultSet rs = stat.executeQuery("select * from babukuma;");
while (rs.next()) {
rs.getInt("id");
rs.getInt("value");
// System.out.println("id = " + rs.getInt("id"));
// System.out.println("value = " + rs.getString("value"));
}
rs.close();
endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");

conn.close();
}
}

2010年4月9日金曜日

SQLite과 H2의 성능비교

궁금해서 임베디드 DB인 H2와 SQLite3를 비교해보았다.

SQLite 버젼 : 3.6.23
H2 버젼 : 1.2.132

둘다 사용할 프로젝트가 Java인 관계로 언어는 Java로.
SQLite는 JDBC드라이버인 SQLiteJDBC를 사용하였다.

SQLiteJDBC : http://www.zentus.com/sqlitejdbc/

테스트 환경 1


- CPU : 2.53 GHz Intel Core 2 Duo
- Memory : 4GB
- OS : Mac OS X 10.6.3
구분SQLiteH2 EmbeddedH2 In-memory
Insert (100만건)0.5 초0.9 초0.9 초
Select (100만건)0.002 초0.015 초0.07 초
File size2,048 bytes14,336 bytes-


테스트 환경 2


- CPU : 2.53 GHz Intel Core 2 Duo
- Memory : 4GB
- OS : Mac OS X 10.6.3
구분SQLiteH2 EmbeddedH2 In-memory
Insert (100만건)0.5 초1.3 초1.5 초
Select (100만건)0.004 초0.09 초0.095 초
File size2,048 bytes14,336 bytes-


비록 간단한 테스트이지만 대략적으로 SQLite가 우세한 듯 보인다.
특히 성능이 낮은 머신에서 H2와의 성능차이가 뚜렷하다.
그리고 H2는 여지껏 「In-memory」방식이 「임베디드」방식보다 성능이 더 좋을 줄 알았는데,
전혀 생각과 틀려 충격이었다.


테스트용 소스는 아래와 같다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class SqlitePerformance {
private static final int ROW_COUNT = 1000000;
private static final int MAX = 100;

/**
* SQLite3 Embedded
*
* @author babukuma
* @since 2010/04/09
* @param args
*/
public static void main(String[] args) throws Exception {
System.out.println("SQLite TEST [" + ROW_COUNT + "件]");
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager
.getConnection("jdbc:sqlite:babukuma.sqllite.db");

Statement stat = conn.createStatement();
stat.executeUpdate("drop table if exists babukuma;");
stat
.executeUpdate("create table babukuma (id integer primary key, value integer);");

conn.setAutoCommit(false);
System.out.print("Insert Test : ");
long startTime = System.currentTimeMillis();

PreparedStatement prep = conn
.prepareStatement("insert into babukuma values (?, ?);");

for (int i = 0; i < ROW_COUNT; i++) {
prep.setInt(1, i);
prep.setInt(2, i);
prep.addBatch();

if (i > 0 && (i % MAX) == 0 && i == ROW_COUNT - 1) {
prep.executeBatch();
prep.clearBatch();
}
}

conn.commit();

long endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");

System.out.print("Select Test : ");
startTime = System.currentTimeMillis();
ResultSet rs = stat.executeQuery("select * from babukuma;");
while (rs.next()) {
rs.getInt("id");
rs.getInt("value");
// System.out.println("id = " + rs.getInt("id"));
// System.out.println("value = " + rs.getString("value"));
}
rs.close();
endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");

conn.close();
}
}


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import org.h2.jdbcx.JdbcConnectionPool;

public class H2Performance {
private static final int ROW_COUNT = 1000000;
private static final int MAX = 100;

/**
* H2 Embedded
*
* @author babukuma
* @since 2010/04/09
* @param args
*/
public static void main(String[] args) throws Exception {
System.out.println("H2 TEST [" + ROW_COUNT + "件]");
JdbcConnectionPool cp = JdbcConnectionPool.create(
"jdbc:h2:babukuma.h2", "", "");
Connection conn = cp.getConnection();

Statement stat = conn.createStatement();
stat.executeUpdate("drop table if exists babukuma;");
stat
.executeUpdate("create table babukuma (id int primary key, value int);");

conn.setAutoCommit(false);
System.out.print("Insert Test : ");
long startTime = System.currentTimeMillis();

PreparedStatement prep = conn
.prepareStatement("insert into babukuma values (?, ?);");

for (int i = 0; i < ROW_COUNT; i++) {
prep.setInt(1, i);
prep.setInt(2, i);
prep.addBatch();

if (i > 0 && (i % MAX) == 0 && i == ROW_COUNT - 1) {
prep.executeBatch();
prep.clearBatch();
}
}

conn.commit();

long endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");

System.out.print("Select Test : ");
startTime = System.currentTimeMillis();
ResultSet rs = stat.executeQuery("select * from babukuma;");
while (rs.next()) {
rs.getInt("id");
rs.getInt("value");
// System.out.println("id = " + rs.getInt("id"));
// System.out.println("value = " + rs.getString("value"));
}
rs.close();
endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");

conn.close();
}
}


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import org.h2.jdbcx.JdbcConnectionPool;

public class H2InMemoryPerformance {
private static final int ROW_COUNT = 1000000;
private static final int MAX = 100;

/**
* H2 In memory
*
* @author babukuma
* @since 2010/04/09
* @param args
*/
public static void main(String[] args) throws Exception {
System.out.println("H2 In Memory TEST [" + ROW_COUNT + "件]");
JdbcConnectionPool cp = JdbcConnectionPool
.create("jdbc:h2:mem:", "", "");
Connection conn = cp.getConnection();

Statement stat = conn.createStatement();
stat.executeUpdate("drop table if exists babukuma;");
stat
.executeUpdate("create table babukuma (id int primary key, value int);");

conn.setAutoCommit(false);
System.out.print("Insert Test : ");
long startTime = System.currentTimeMillis();

PreparedStatement prep = conn
.prepareStatement("insert into babukuma values (?, ?);");

for (int i = 0; i < ROW_COUNT; i++) {
prep.setInt(1, i);
prep.setInt(2, i);
prep.addBatch();

if (i > 0 && (i % MAX) == 0 && i == ROW_COUNT - 1) {
prep.executeBatch();
prep.clearBatch();
}
}

conn.commit();

long endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");

System.out.print("Select Test : ");
startTime = System.currentTimeMillis();
ResultSet rs = stat.executeQuery("select * from babukuma;");
while (rs.next()) {
rs.getInt("id");
rs.getInt("value");
// System.out.println("id = " + rs.getInt("id"));
// System.out.println("value = " + rs.getString("value"));
}
rs.close();
endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");

conn.close();
}
}

2010年3月15日月曜日

[SWT] SWT on 64bit Mac OS X

Mac OS X 10.6.2 Snow Leopardで
SWTアプリケーションがちゃんと動かない現象があって色々調べてみたら
どうやらオプションが必要のようだ。

「-d64」オプションと「-XstartOnFirstThread」オプション

「-d64」オプションは明確に64bit VMを指定するために使う。

「-XstartOnFirstThread」オプションはMacでSWTアプリケーションが正常に動けるため必要のようだ。SWTに限ったオプションではないらしい。

二つのオプションを付けると。。
java -d64 -XstartOnFirstThread -jar babukuma_swt_test.jar

実際テストしてみると問題なく動作した。

参照してサイト
http://www.eclipse.org/swt/macosx
http://www.eclipse.org/swt/faq.php

[SWT] SWT on 64bit Mac OS X

Mac OS X 10.6.2 Snow Leopard위에
SWT어플리케이션을 실행시키면 뭔가 제대로 실행이 안되는 현상이 있다.
그래서 이것저것 찾아보니 몇가지 옵션이 필요한 듯 하다.

「-d64」옵션과 「-XstartOnFirstThread」옵션

「-d64」옵션 : 명확하게 64bit VM에서 동작하도록 지정해준다.

「-XstartOnFirstThread」옵션 : Mac에서 SWT어플리케이션이 정상적으로 동작하는데 필요한 옵션인 듯 하다. SWT에 한정된 옵션은 아닌 듯.

두 옵션을 실제 사용해 보면
java -d64 -XstartOnFirstThread -jar babukuma_swt_test.jar

실제 테스트에서 문제없이 작동하였다.

참고한 사이트.
http://www.eclipse.org/swt/macosx
http://www.eclipse.org/swt/faq.php

2009年12月25日金曜日

[HTML5] 簡単なWebSocketサーバを作ってみた。

HTML5のWebSocketサーバを作ってみた。

作ったのは これ



作ったサーバでシンプルなEchoサーバとクライアントも作ってみたのがこちら。。
まだWebSocketを対応してるのがChromeしかないので、当然Chromeしか動作しない。

EchoServer.java

package websocket.echoserver;

import java.io.IOException;

import com.babukuma.commons.websocket.WebSocketServer;

public class EchoServer {
public static void main(String[] args) throws IOException {
new WebSocketServer(8888, "/EchoServer", new EchoHandlerFactory()).start();
}
}

EchoHandlerFactory.java

package websocket.echoserver;

import com.babukuma.commons.websocket.WebSocketHandler;
import com.babukuma.commons.websocket.WebSocketHandlerFactory;

public class EchoHandlerFactory implements WebSocketHandlerFactory {

@Override
public WebSocketHandler createHandler(String urlPath) {
return new EchoHandler();
}

@Override
public void removeHandler(String urlPath, WebSocketHandler handler) {
// TODO Auto-generated method stub
}
}

EchoHandler.java

package websocket.echoserver;

import com.babukuma.commons.websocket.SimpleWebSocketHandler;

public class EchoHandler extends SimpleWebSocketHandler {

@Override
public void onMessage(String message) {
send
(message);
}

@Override
public void onClose() {
System.out.println("close");
}

@Override
public void onError(Throwable e) {
e
.printStackTrace();
}

@Override
public void onOpen() {
System.out.println("open");
}
}


次はTomcatとかWebServerでも動けるようにWebSocketServletを作成!!


2009年11月25日水曜日

[メモ] Commons-Emailの文字化け解決方法

Commons-Email利用する時の日本語文字化け

ドキュメントのサンプルとおりやると化けってしまう。

SimpleEmail email = new SimpleEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("日本語タイトル");
email.setMsg("日本語メッセージ");
email.send();


エンコーディングを指定すれば、問題ない。


SimpleEmail email = new SimpleEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("日本語タイトル");
email.setContent("日本語メッセージ","text/plain; charset=ISO-2022-JP");
email.setCharset("ISO-2022-JP");
email.send();


いつも使って、いつも忘れて、いつも探してるコード

2009年10月30日金曜日

正規表現で全角、半角、半角カナチェック

今回必要だったから作った。
簡単にテストしてみたけど、とりあえず使えそう。


/**
* 全角チェック
*
* @param String
* str チェック元文字列
* @return boolean true:全角
*/
public static boolean checkZenkaku(String str) {
if (str == null) {
return false;
}

return str.matches("^[^ -~。-゚]+$");
}

/**
* 全角と空白文字チェック
*
* @param String
* str チェック元文字列
* @return boolean true:全角と空白文字
*/
public static boolean checkZenkakuWithSpace(String str) {
if (str == null) {
return false;
}

return str.matches("^([^ -~。-゚]|\\s)+$");
}

/**
* 半角チェック
*
* @param String
* str チェック元文字列
* @return boolean true:半角
*/
public static boolean checkHankaku(String str) {
if (str == null) {
return false;
}

return str.matches("^[ -~。-゚]+$");
}

/**
* 半角と空白文字チェック
*
* @param String
* str チェック元文字列
* @return boolean true:半角と空白文字
*/
public static boolean checkHankakuWithSpace(String str) {
if (str == null) {
return false;
}

return str.matches("^([ -~。-゚]|\\s)+$");
}

/**
* 半角カナチェック
*
* @param String
* str チェック元文字列
* @return boolean true:半角カナのみ
*/
public static boolean checkHankakuKana(String str) {
if (str == null) {
return false;
}

return str.matches("^[ア-ン゙゚]+$");
}

/**
* 半角カナと空白文字チェック
*
* @param String
* str チェック元文字列
* @return boolean true:半角カナと空白文字
*/
public static boolean checkHankakuKanaWithSpace(String str) {
if (str == null) {
return false;
}

return str.matches("^([ア-ン゙゚]|\\s)+$");
}

2009年10月20日火曜日

JasperReportでパスワード付きPDF生成

JasperReportでパスワード付きPDF生成してみた。
テストしたコードはこれだ。

try {
File jasperFile = new File("/test/test.jasper");

if (!jasperFile.exists()) {
System.out.println("not found file");
return;
}

Map params = new HashMap();
params.put("p1", "aaa");
params.put("p2", "bbb");

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperFile.getPath(), params);

// Exporterの生成
JRPdfExporter exporter = new JRPdfExporter();

// 出力オブジェクトの設定
exporter.setParameter(JRPdfExporterParameter.JASPER_PRINT, jasperPrint);

// 出力先の設定
exporter.setParameter(JRPdfExporterParameter.OUTPUT_FILE_NAME, "/test/test.pdf");
// パスワード保護を有効にする
exporter.setParameter(JRPdfExporterParameter.IS_ENCRYPTED, Boolean.TRUE);
// パスワードの設定
exporter.setParameter(JRPdfExporterParameter.USER_PASSWORD, "1234");
exporter.setParameter(JRPdfExporterParameter.OWNER_PASSWORD, "4321");

// 出力の実行
exporter.exportReport();
} catch (JRException e) {
e.printStackTrace();
}


実行してみたら、

java.lang.NoClassDefFoundError: org/bouncycastle/asn1/ASN1OctetString

エラーが発生した。( ´д`)

足りないライブラリを探してみたら、どうやら「www.bouncycastle.org」で提供するライブラリらしい。

現時点の最新バージョン(1.44)を落とした。
http://www.bouncycastle.org/latest_releases.html

クラスパスに追加してテストしてみると、成功!(´∀`)


2009年10月13日火曜日

MD5 for java



import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
* @author BABUKUMA
*/
public final class Digest {
public static byte[] md5(final String data) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] dat = data.getBytes();
md.update(dat);
return md.digest();
}

// MD5 ハッシュ関数
private static String hashByte2MD5(byte[] hash) {
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
if ((0xff & b) < 0x10) {
hexString.append("0" + Integer.toHexString((0xFF & b)));
} else {
hexString.append(Integer.toHexString(0xFF & b));
}
}

return hexString.toString();
}

public static String md5String(final String data)
throws NoSuchAlgorithmException {
return hashByte2MD5(md5(data));
}
}

2009年7月7日火曜日

JasperReportsを利用するPDF出力

久々にJasper使ってみた。(^(エ)^)

1. ダウンロードURL

JasperReports : http://jasperforge.org/
iTextAsian.jar : http://itextpdf.sourceforge.net/


2. 使ったライブラリ

jasperreports-3.5.2.jar
iText-2.1.0.jar
iTextAsian.jar
commons-beanutils-1.8.0.jar
commons-collections-2.1.jar
commons-digester-1.7.jar

3. 日本語対応

fontタグのオプションを修正
<font pdfFontName="HeiseiKakuGo-W5" pdfEncoding="UniJIS-UCS2-H" isPdfEmbedded="true"/>

4. テストコード

import java.io.File;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanArrayDataSource;

public class JasperTest {

/**
* @param args
*/
public static void main(String[] args) {
String strPathMain = "jasper/report1.jasper";

File reportFile = new File(strPathMain);
try {
int length = 10;
TestBean[] beans = new TestBean[length];

for (int i = 0; i <>
beans[i] = new TestBean("f_" + i, "日本語_" + i);
}

JasperPrint jasperPrint = JasperFillManager.fillReport(reportFile
.getPath(), null, new JRBeanArrayDataSource(beans));

JasperExportManager.exportReportToPdfFile(jasperPrint,
"jasper/report1.pdf");
} catch (JRException e) {
e.printStackTrace();
}
}
}


5. iReport(今回は3.5.2)でデザインするときに日本語はオプションで設定する必要がある。





2009年6月30日火曜日

GAE/JのJPA

GAE/JでBigTableをJPAで利用してみた。

① META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">

<persistence-unit name="transactions-optional">
<provider>org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider</provider>
<properties>
<property name="datanucleus.NontransactionalRead" value="true" />
<property name="datanucleus.NontransactionalWrite" value="true" />
<property name="datanucleus.ConnectionURL" value="appengine" />
</properties>
</persistence-unit>

</persistence>


② EMF
package com.babukuma.gae.test.jpa;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class EMF {
private static final EntityManagerFactory emfInstance = Persistence
.createEntityManagerFactory("transactions-optional");

private EMF() {
}

public static EntityManagerFactory get() {
return emfInstance;
}
}

③ エンティティ

package com.babukuma.gae.test.entity;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import com.google.appengine.api.users.User;

@Entity
public class SimpleBoard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
private Long id;

@Column
private User author;

@Column
private String content;

@Column(nullable = false)
private Date date;

public SimpleBoard(User author, String content, Date date) {
this.author = author;
this.content = content;
this.date = date;
}

public Long getId() {
return id;
}

public User getAuthor() {
return author;
}

public String getContent() {
return content;
}

public Date getDate() {
return date;
}

public void setAuthor(User author) {
this.author = author;
}

public void setContent(String content) {
this.content = content;
}

public void setDate(Date date) {
this.date = date;
}
}

④ テストコード

package com.babukuma.gae.test;

import java.io.IOException;
import java.util.Date;

import javax.persistence.EntityManager;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.babukuma.gae.test.entity.SimpleBoard;
import com.babukuma.gae.test.jpa.EMF;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

@SuppressWarnings("serial")
public class DataStoreTestServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();

String content = req.getParameter("content");

System.out.println("content=" + content);
Date date = new Date();
SimpleBoard board = new SimpleBoard(user, content, date);

EntityManager manager = EMF.get().createEntityManager();
try {
System.out.println("before insert");
manager.persist(board);
System.out.println("after insert");
} catch (Exception e) {
e.printStackTrace();
} finally {
manager.close();
}

resp.setContentType("text/plain");
resp.getWriter().println("Hello, world");
}
}


これ以外に簡単にできるんだな。。(^(エ)^)

2009年6月24日水曜日

Cache削除方法

いつも忘れてしまう、Cacheの削除方法

JSPとかServletの場合。

response.setDateHeader("Expires", -1);
response.setHeader("pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");


Htmlの場合。

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Sat, 01 Jan 2000 00:00:00 GMT">


忘れないように (^(エ)^)

2009年6月16日火曜日

GSONを使ってみる。

GSON JavaオブジェクトとJSONの変換ライブラリ



① Mavenリポジトリの設定

    <!-- リポジトリ -->

    <repositories>

        <!-- GSONのリポジトリ追加 -->

        <repository>

            <id>gson</id>

            <url>http://google-gson.googlecode.com/svn/mavenrepo</url>

            <snapshots>

                <enabled>true</enabled>

            </snapshots>

            <releases>

                <enabled>true</enabled>

            </releases>

        </repository>

    </repositories>

    

    <dependencies>

        <!-- Gson: Java to Json conversion -->

        <dependency>

            <groupId>com.google.code.gson</groupId>

            <artifactId>gson</artifactId>

            <version>1.3</version>

            <scope>compile</scope>

        </dependency>

    </dependencies>

    



② 使い方

== Bean.java ==

public class Bean {



    private String a;

    private Integer b;

    private BBB[] bbbs;



    public BBB[] getBbbs() {

        return bbbs;

    }



    public void setBbbs(BBB[] bbbs) {

        this.bbbs = bbbs;

    }



    public String getA() {

        return a;

    }



    public void setA(String a) {

        this.a = a;

    }



    public Integer getB() {

        return b;

    }



    public void setB(Integer b) {

        this.b = b;

    }

}





== BBB.java ==

public class BBB {



    private String c;

    private String d;



    public String getC() {

        return c;

    }



    public void setC(String c) {

        this.c = c;

    }



    public String getD() {

        return d;

    }



    public void setD(String d) {

        this.d = d;

    }

}





== GsonTest.java ==

import com.google.gson.Gson;



import junit.framework.TestCase;



public class GsonTest extends TestCase {



    protected void setUp() throws Exception {

        super.setUp();

    }



    protected void tearDown() throws Exception {

        super.tearDown();

    }



    public void testGson() throws Exception {

        Bean bean = new Bean();

        bean.setA("aa");

        bean.setB(9);



        BBB b1 = new BBB();

        b1.setC("333");

        b1.setD("3d3d");



        BBB b2 = new BBB();

        b2.setC("444");

        b2.setD("4d4d");



        BBB[] bbbs = { b1, b2 };



        bean.setBbbs(bbbs);



        Gson gson = new Gson();

        String json = gson.toJson(bean);

        assertNotNull(json);

        // System.out.println(json);



        Bean bean2 = gson.fromJson(json, Bean.class);



        assertNotNull(bean2);

        assertEquals(bean.getA(), bean2.getA());

        assertEquals(bean.getB(), bean2.getB());

        assertNotNull(bean2.getBbbs());

        assertEquals(bean.getBbbs().length, bean2.getBbbs().length);



        for (int i = 0; i < bean2.getBbbs().length; i++) {

            assertEquals(bean.getBbbs()[i].getC(), bean2.getBbbs()[i].getC());

            assertEquals(bean.getBbbs()[i].getD(), bean2.getBbbs()[i].getD());

        }

    }

}





楽だね(^(エ)^)

2008年7月4日金曜日

[JAVA] transient field

transient Field

シリアライズする時保存されなくなる。
직렬화후에 보존되지 않는 필드가 됨.


// TEST SAMPLE
package test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class TransientTest implements Serializable {
private static final long serialVersionUID = 1L;

private transient String a;

private String b;

public String getA() {
return a;
}

public void setA(String a) {
this.a = a;
}

public String getB() {
return b;
}

public void setB(String b) {
this.b = b;
}

/**
* @param args
*/
public static void main(String[] args) throws Exception {
TransientTest test = new TransientTest();
test.setA("aaa");
test.setB("bbb");
System.out.println("A=" + test.getA());
System.out.println("B=" + test.getB());

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
"test.tmp"));
out.writeObject(test);
ObjectInputStream in = new ObjectInputStream(new FileInputStream(
"test.tmp"));
TransientTest clone = (TransientTest) in.readObject();
System.out.println("A=" + clone.getA());
System.out.println("B=" + clone.getB());
}
}

// RESULT
A=aaa
B=bbb
A=null
B=bbb