S2Daoメタデータの取得処理解析

1ヶ月ぐらい前の記事で書いた、S2Daoメタデータ取得に時間がかかる処理を解析してみた。
時間がかかるのは、1回目のアクセスでそれ以降はキャッシュされるから実運用では問題ないけど、開発中の1回目のアクセスが絶えられなく
なってきたので解析。

細かくログを出力してみたところ、諸悪の根源は DatabaseMetaDataUtil#getColumnCaseInsensitiveMap これ。

public static CaseInsensitiveMap getColumnCaseInsensitiveMap(
			DatabaseMetaData dbMetaData, String tableName) {
		final String schema;
		int index = tableName.indexOf('.');
		if (index >= 0) {
			schema = tableName.substring(0, index);
			tableName = tableName.substring(index + 1);
		} else {
			schema = getUserName(dbMetaData);
		}
		final String convertedTableName = convertIdentifier(dbMetaData, tableName);

		CaseInsensitiveMap map = new CaseInsensitiveMap();
		addColumns(dbMetaData, convertIdentifier(dbMetaData, schema), convertedTableName,map);
		if (map.size() == 0) {
			addColumns(dbMetaData, schema, tableName, map);
		}
		if (map.size() == 0 && schema != null) {
			addColumns(dbMetaData, null, convertedTableName, map);
			if (map.size() == 0) {
				addColumns(dbMetaData, null, tableName, map);
			}
		}
		return map;
	}

このメソッド内のaddColumnsメソッドの中でDatabaseMetaData#getColumns(テーブルの列情報を取得するメソッド)を呼び出している、このメソッドが一番時間がかかる。
このaddColumnsは最大4回呼び出される、1回目で取得できなければ2回目、2回目で取得できなければ3回目・・。
どうすれば確実に1回目で取得できるかは、時間が無いので来年書く。