制約の解除

あまり使わないだろうシリーズ。
まぁ動いちゃってる環境で定義変更が起きた時ぐらいか。

制約を確認する
SELECT * FROM user_constraints;
※↑制約名を検索するための条件がLONGなので面倒なことこの上ない
select * from USER_CONS_COLUMNS;

制約を削除する
ALTER TABLE テーブル名 DROP CONSTRAINT 制約名;

制約を無効化する
ALTER TABLE テーブル名 DISABLE CONSTRAINT 制約名;

制約を有効化する
ALTER TABLE テーブル名 ENABLE CONSTRAINT 制約名;

■リンク
ORACLE MASTER SILVER(ORACLE入門)
http://www.geocities.co.jp/SiliconValley-Bay/1428/oracle/oracle_oracle.html
Oracle のデータ型
http://www.jjon.com/oracle/OracleSilver/datatype.html
Oracle管理者のためのSQLリファレンス > 表の確認/作成/変更/削除
http://www.atmarkit.co.jp/fdb/ref/ref_oracle/table.html

JSTL解決


2時間ぐらいして判明。
JSTL1.1のtaglib定義をservel2.3で使用していたダケダッタ。
1.0のtaglib定義に書き換えてみたら動いたのだ
というかあまりに微妙に変わっていてキガツカンカッタ。


それぞれ以下のように修正*1
taglib

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
 ↓
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


web.xmlDTDは使用しないらしい)

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

 ↓
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">


実行結果

<c:out value="${hoge.hogeValue}"/>

 ↓

HOGEHOGE


Tomcat5.0.28のサンプルアプリがservlet2.3で書いてあるからいかんのだよ!



追記
途中ででたException

StandardWrapperValve[jsp]: サーブレット jsp のServlet.service()が例外を投げました
org.apache.jasper.JasperException: /index.jsp(12,1) TLD又はタグファイル中のattribute指示子に従って属性valueはどんな式も受け付けません
	at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:39)
	at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:409)


これはservlet2.4+JSTL1.0にしてしまったときにでる(らしい)*2


■リンク
JSTL入門
http://www.oklab.org/java/jstl.html
Taglibs(Standard Taglibs:coreタグライブラリ)
http://www.javaroad.jp/opensource/js_taglibs4.htm#out
タグライブラリとJSP
http://www.wakhok.ac.jp/~tomoharu/web2004/text/index_c5.html
Standard Taglib トピックス
http://four.sssg.org/documents/jajakarta/taglibs/topics/docs/core_topics.html
JavaServer Pages Standard Tag Library 1.1 Tag Reference
http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html
JSTLちょこっとメモ
http://www.programmers-paradise.com/java/jstl.html

Java 開発の実用問答集

最近のJ2SEの流行を解説している本。
J2SEの経験が1年ぐらいたってから読むと分かりやすいかもしれない。
新人あたりがいきなり読んでも次の日には.netに行きたくなるかもしれない。


別段一問一答になっているわけではないか。


・・・まぁ誰かが持っていたら読んでもいいぐらいか?


Java 開発の実用問答集 (プログラマーズ叢書)

Java 開発の実用問答集 (プログラマーズ叢書)

JSTLうごかーん

・・・セッションオブジェクトを取得しようとすると、

<c:out value="${hoge.hogeValue}"/>


↓表示されるもの

${hoge.hogeValue}


あれー?


Strutsではうまくいくんだけどな。

<logic:match name="hoge" property="hogeValue" value="true">

キャッシュの設定〜警告ログの削除


前回*1の続き。


以下のログを消したい。

WARN (Configurator.java:125) - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: file:/hoge/ehcache-failsafe.xml


このログを出しているのは、ehcache.jarにあるnet.sf.ehcache.config.Configuratorというクラス。
さっそくダウンロード*2・・・と思ったらCVSに接続しないといけないらしい。。


どうもEclipse経由でプロキシが使えないので、Browseを使って単品で落としてくることに。




・・・メンドイのでそのファイルだけ落としました('')


該当個所(適当に省略)

public class Configurator {

    private static final String DEFAULT_CLASSPATH_CONFIGURATION_FILE = "/ehcache.xml";
    private static final String FAILSAFE_CLASSPATH_CONFIGURATION_FILE = "/ehcache-failsafe.xml";

    public void configure(final Object bean)
            throws Exception {
        final SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        final BeanHandler handler = new BeanHandler(bean);
        URL url = getClass().getResource(DEFAULT_CLASSPATH_CONFIGURATION_FILE);
        if (url != null) {
            if (LOG.isDebugEnabled()) {
                LOG.debug("Configuring ehcache from ehcache.xml found in the classpath: " + url);
            }
        } else {
            url = getClass().getResource(FAILSAFE_CLASSPATH_CONFIGURATION_FILE);
            if (LOG.isWarnEnabled()) {
                LOG.warn("No configuration found. Configuring ehcache from ehcache-failsafe.xml"
                        + " found in the classpath: " + url);
            }
        }
        parser.parse(url.toExternalForm(), handler);
    }

}


"/ehcache-failsafe.xml"というのはjarに含まれているファイルなので、これをそのままプロジェクトのクラスパス直下(つまり/WEB-INF/javaなり/WEB-INF/srcということか?)にコピーして"ehcache.xml"にリネームすれば解決。


なんだ、それだけか・・・。




ついでにEHCacheとはなんぞやというと*3

EHCacheは、シンプルな構造で高速に動作するJava用のメモリ・ディスクキャッシュ機構です。
(略)
Hibernate 2.1の組み込みキャッシュとして動作する


ということらしい。


まぁキャッシュが遅い、ということになったら内容は精査すればよいのか。



cf.
Hibernateとの関係
http://wiki.bmedianode.com/Hibernate/?EHCache
↓読み難い公式
http://ehcache.sourceforge.net/
↓日本語に訳してくださった神
http://www.moriwaki.net/wiki/index.php?%5B%5BEHCache%5D%5D

hibernateキャッシュ戦略・・・の書き方

キャッシュ戦略"read-only"*1を設定してみた。

<hibernate-mapping>
  <class name="hoge.Hoge" table="HOGE">
    <cache usage="read-only"/>
  (略)
</hibernate-mapping>


起動すると以下の警告がでる。

WARN (CacheFactory.java:36) - read-only cache configured for mutable: hoge.Hoge


理由が良く分からなかったのでソースを調べる。

public final class CacheFactory {

    (略)
    if ( usage.equals(READ_ONLY) ) {
      if (mutable) log.warn( "read-only cache configured for mutable: " + name );
      ccs = new ReadOnlyCache();
    }
    (略)
}

つまり記述漏れということだ。

<hibernate-mapping>
  <class name="hoge.Hoge" table="HOGE" mutable="false">
    <cache usage="read-only"/>
  (略)
</hibernate-mapping>


これで起動時の警告が一つ減った。
すっきり〜。


mutableってのはなんじゃいというのはドキュメントに。

mutable="false" と指定された更新不能クラスは、 アプリケーションから更新や削除をできません。 これにより、Hibernateのパフォーマンスが少しだけ良くなります。 *2


・・・弱気だ。

show_sqlの出力制御

hibernateの「3.5. オプションの設定プロパティ」*1のうち、「hibernate.show_sql」をlog4jで制御できるかと思ったのだが。


net.sf.hibernate.impl.BatcherImpl*2

	private void log(String sql) {
		sqlLog.debug(sql);
		if ( factory.isShowSqlEnabled() ) System.out.println("Hibernate: " + sql);
	}


げふ、ダメじゃん。


「3.6. ロギング」*3では「パフォーマンスの問題を探すときこれが最初のステップとなります。」と書いてあるので、遅いなぁと思ったらまたtrueにしてチェックすればよかろうという結論。本番で標準出力にばしばしログを出されるのはタマラン。