2010年12月28日火曜日

【Oracle】DataSourceを使用してデータベース接続をキャッシュ

OracleDataSourceにはプール機能(接続のキャッシュ機能)がある。Webコンテナで提供されるDataSourceのプール機能と同じもの。

この機能を使うと、Connectionの取得要求のたびにデータベースとの物理接続を確立する必要がないのでパフォーマンスが向上する。(はず)
普通は、Webコンテナの機能使えばいいのであんまり必要にならないけど、バッチ処理のようにWebコンテナ以外で実行されるアプリの場合には必須の機能だと思う。

キャッシュを使用しない場合

キャッシュを使用しない場合の実装は、【Oracle】DataSourceを使用してデータベース接続と同じ。
// DB接続前のセッション数を出力
printHogeSession("開始前");

OracleDataSource dataSource = new OracleDataSource();
dataSource.setUser("hoge");
dataSource.setPassword("hoge");
dataSource.setURL("jdbc:oracle:thin:@localhost:1521:xe");
Connection connection = dataSource.getConnection();

// getConnection呼び出し後のセッション数を出力
printHogeSession("OracleDataSource.getConnection()呼出し後");
connection.close();

// close呼び出し後のセッション数を出力
printHogeSession("Connection.close()呼出し後");

実行結果

getConnection()の呼出し後には、セッション数が1つになる。
Connection.close()を呼び出すと、物理接続がcloseされるためセッション数は0になる。

この場合、getConnectionの度にOracleとの物理接続が確立されるため、性能的に非常にまずくなる。
開始前
---------------------------------------------


OracleDataSource.getConnection()呼出し後
---------------------------------------------
HOGE             JDBC Thin Client


Connection.close()呼出し後
---------------------------------------------


キャッシュを使用した場合


以下の実装だと、OracleDataSourceが持っているキャッシュ機能を有効化できる。
ただし、OracleDataSourceのキャッシュ機能を使えるのはojdbc14.jarまで。
JDK5やJDK6用のojdbc5、ojdbc6.jarでは別の機能を使用してキャッシュ機能を有効化する必要がる。
// DB接続前のセッション数を出力
printHogeSession("開始前");

OracleDataSource dataSource = new OracleDataSource();
dataSource.setUser("hoge");
dataSource.setPassword("hoge");
dataSource.setURL("jdbc:oracle:thin:@192.168.0.5:1521:xe");

// キャッシュの設定
Properties prop = new Properties();
// 初期容量(デフォルト:0)
prop.setProperty("InitialLimit", "2");
// 最大容量(デフォルト:Integer.MAX_VALUE)
prop.setProperty("MaxLimit", "2");

// 上記で設定した、キャッシュプロパティを設定する。
dataSource.setConnectionCacheProperties(prop);
// setConnectionCachingEnabledを呼び出してキャッシュを有効化する。
dataSource.setConnectionCachingEnabled(true);

Connection connection = dataSource.getConnection();

// getConnection呼び出し後のセッション数を出力
printHogeSession("OracleDataSource.getConnection()呼出し後");
connection.close();

// close呼び出し後のセッション数を出力
printHogeSession("Connection.close()呼出し後");

実行結果

キャッシュ機能が有効になっていることが確認できる。
getConnectionを呼び出したあとでは、初期容量の物理接続が確立されている。
close呼び出し後には、キャッシュを使わなかった時とは異なり物理接続が切断されていないことが確認できる。
物理接続は切断されていなくても論理的な接続は切断されているので、close呼び出し後はDBアクセスはできない。

ちなみに、キャッシュはDataSourceのインスタンス単位にされるので、異なるインスタンスの場合には異なる接続がキャッシュされている。
開始前
---------------------------------------------


OracleDataSource.getConnection()呼出し後
---------------------------------------------
HOGE             JDBC Thin Client
HOGE             JDBC Thin Client


Connection.close()呼出し後
---------------------------------------------
HOGE             JDBC Thin Client
HOGE             JDBC Thin Client

2010年12月26日日曜日

【MySql】DataSouceを使用してデータベース接続

MySqlのJDBCドライバ(Connector/J)を使用してデータベース接続を行う方法。

DataSourceのインスタンスを生成して接続先情報を設定

// MysqlDataSourceのインスタンスを生成
MysqlDataSource dataSource = new MysqlDataSource();
// 接続先情報として、URLとユーザ、パスワードを設定
dataSource.setURL("jdbc:mysql://localhost/test");
dataSource.setUser("root");
dataSource.setPassword("password");

java.sql.Connectionの取得

Connection connection = dataSource.getConnection();

取得したConnectionを使用してSQLを実行

// JDBCのAPIを使ってSQL文(testスキーマのテーブル名をリスト表示する)を実行。
PreparedStatement statement = connection.prepareStatement(
        "select * "
        + "from INFORMATION_SCHEMA.TABLES"
        + " where table_schema = 'test'");
ResultSet set = statement.executeQuery();
while (set.next()) {
    System.out.println("set.getString(1) = " + set.getString("table_name"));
}

2010年12月24日金曜日

【ruby】シンボル

シンボルの宣言

:s = 's'
s = :s
# これは、シンボル同士の比較だから一致する。
# クォートで囲ってもシンボルは同一となる。
puts s == :"s"  # => true
puts s == :s    # => true

# これは、文字列との比較だから一致しない
puts s == "s"   # => false

string = "hoge"
# 文字列をシンボルに変換するには、internかto_symを使う
puts :hoge == string          # => false
puts :hoge == string.intern   # => true
puts :hoge == string.to_sym   # => true

シンボルを使ってリフレクション

array = Array.new
puts array                      # => []

# リフレクションでメソッドの存在チェック
puts array.respond_to?(:push)   # => true

# リフレクションでメソッド呼び出し
array.send(:push, "hoge")
puts array                      # => [hoge]

2010年12月15日水曜日

【Oracle】DataSourceを使用してデータベース接続

DataSourceを使用してOracleに接続する方法。
単純にDBに接続したいのであれば、この実装で十分可能。ただし、この実装だとgetConnection()を呼び出すたびにデータベースとの物理接続が行われて性能面に与える影響が大きくなる。
実業務では、こんなコード書くことはまずないと思う。

OracleDataSourceに接続情報を設定

この実装は、TYPE4(thin)ドライバを使用している。
URLの記述形式は、Oracleのマニュアルを参照するとよい。
// OracleDataSourceのインスタンスを生成
OracleDataSource dataSource = new OracleDataSource();
// URLを設定
dataSource.setURL("jdbc:oracle:thin:@localhost:1521:xe");
// ユーザ名、パスワードを設定
dataSource.setUser("hoge");
dataSource.setPassword("hoge");

データベース接続(java.sql.Connection)の取得

getConnection()を呼び出すことによってデータベース接続を取得する。
getConnectionは、javax.sql.DataSourceインタフェースで定義されているメソッドとなっている。
// コネクションの取得
Connection connection = dataSource.getConnection();

SQLの実行

JDBCで提供されているインタフェースを使ってSQL文を実行する。
この実装は、DBにつながったことを確認するだけなので簡単なSQL文を実行しているだけ。
// JDBCのAPIを使ってSQLを実行する。
// 実行結果として標準出力に「result = 1」と表示される。
PreparedStatement statement = connection.prepareStatement("select '1' from dual");
ResultSet resultSet = statement.executeQuery();

while (resultSet.next()) {
    System.out.println("result = " + resultSet.getString(1));
}

2010年12月4日土曜日

【Vim】検索結果のハイライト表示

下記のオプションで切り替えられる。

ハイライト表示オン

:set hlsearch
省略形は・・・
:set hls

ハイライト表示オフ

:set nohlsearch
省略形は・・・
:set nohls

現在の検索結果のハイライト表示のみオフ

:nohlsearch
省略形は・・・
:noh