<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://www7.atwiki.jp/db2/">
    <title>Unofficial DB2 Wiki</title>
    <link>http://www7.atwiki.jp/db2/</link>
    <description>Unofficial DB2 Wiki</description>

    <dc:language>ja</dc:language>
    <dc:date>2007-12-09T22:09:51+09:00</dc:date>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="http://www7.atwiki.jp/db2/pages/7.html" />
                <rdf:li rdf:resource="http://www7.atwiki.jp/db2/pages/6.html" />
                <rdf:li rdf:resource="http://www7.atwiki.jp/db2/pages/4.html" />
                <rdf:li rdf:resource="http://www7.atwiki.jp/db2/pages/5.html" />
                <rdf:li rdf:resource="http://www7.atwiki.jp/db2/pages/2.html" />
                <rdf:li rdf:resource="http://www7.atwiki.jp/db2/pages/1.html" />
                <rdf:li rdf:resource="http://www7.atwiki.jp/db2/pages/3.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="http://www7.atwiki.jp/db2/pages/7.html">
    <title>Cayenne test</title>
    <link>http://www7.atwiki.jp/db2/pages/7.html</link>
    <description>
      * Cayenne test page
このページは、テスト用のページです。

* INSERT new objects
DDL:
 CREATE TABLE &amp;quot;APP&amp;quot;.&amp;quot;LOG&amp;quot; (
        &amp;quot;LOGID&amp;quot; INTEGER NOT NULL
      , &amp;quot;MESSAGE&amp;quot; VARCHAR(30) NOT NULL
      , &amp;quot;TIMESTAMP&amp;quot; TIMESTAMP DEFAULT CURRENT TIMESTAMP
 );
 CREATE SEQUENCE APP.S_LOG START WITH 200
  INCREMENT BY 20 NO MAXVALUE  NO CYCLE  CACHE 20;

ソースコード：
&amp;gt;Log j1 = new Log();        
&amp;gt;j1.setMessage(&amp;quot;TEST 1 LOG&amp;quot;);
&amp;gt;ctx.registerNewObject(j1);
&amp;gt;        
&amp;gt;Log j2=(Log)ctx.createAndRegisterNewObject(Log.class);
&amp;gt;j2.setMessage(&amp;quot;Test2 register and new&amp;quot;);

結果：
&amp;gt;INFO  QueryLogger: +++ Connecting: SUCCESS.
&amp;gt;INFO  QueryLogger: Detected and installed adapter: org.objectstyle.cayenne.dba.db2.DB2Adapter
&amp;gt;INFO  QueryLogger: SELECT NEXTVAL FOR APP.S_LOG FROM SYSIBM.SYSDUMMY1
&amp;gt;INFO  QueryLogger: --- transaction started.
&amp;gt;INFO  QueryLogger: --- will run 1 query.
&amp;gt;INFO  QueryLogger: INSERT INTO APP.LOG (LOGID, MESSAGE, TIMESTAMP) VALUES (?, ?, ?)
&amp;gt;INFO  QueryLogger: [bind: 200, &amp;#039;Test2 register and new&amp;#039;, NULL]
&amp;gt;INFO  QueryLogger: === updated 1 row.
&amp;gt;INFO  QueryLogger: [bind: 201, &amp;#039;TEST 1 LOG&amp;#039;, NULL]
&amp;gt;INFO  QueryLogger: === updated 1 row.
&amp;gt;INFO  QueryLogger: +++ transaction committed.

DB2での結果：

 LOGID       MESSAGE                        TIMESTAMP
         200 Test2 register and new         -
         201 TEST 1 LOG                     -

メモ：
- この例ではIDが付く順が逆になっているが、その後テストした際は常に先にregister()したDataObjectから順にINSERTされた時もあった。順番は不定なのかもしれない
- NULLのプロパティに対応する列には明示的にNULLがINSERTされるため、列定義でDEFAULTを列に付けていても機能しない
- 一度NEXTVALでシーケンスの値を取り込んでいるが、二回目は取り込んでいない（一度NEXTVALを取ったら20回分は内部で作成するため。シーケンスも20刻みで定義されているので矛盾しない）
- しかし一度アプリが終了すると、キャッシュしていた分だけ番号が飛ぶ事になる

*Delete Objects
ソースコード:

 SelectQuery s1 = new SelectQuery(Log.class);
 List l1 = ctx.performQuery(s1);
 //この時点では、l1はstate:commited
 ctx.deleteObjects(l1);
 //この時点では、l1はstare:deleted 
 ctx.commitChanges();
 //ここでトランザクション開始。DELETE文が実行される
 //DELETE後はl1はstate:transientになる

実行されたSQL:

 INFO  QueryLogger: DELETE FROM APP.LOG WHERE LOGID = ?
 INFO  QueryLogger: [bind: 603]
 INFO  QueryLogger: === updated 1 row.
 INFO  QueryLogger: [bind: 600]
 INFO  QueryLogger: === updated 1 row.
 INFO  QueryLogger: [bind: 602]
 INFO  QueryLogger: === updated 1 row.
 INFO  QueryLogger: [bind: 601]
 INFO  QueryLogger: === updated 1 row.
 INFO  QueryLogger: +++ transaction committed.

メモ：
- deleteObjects()に複数のObjectが入ったlistを渡すと、各Object毎にDELETEを実行した後にCOMMITする。一括でDELETEするわけではない
- deleteObjects()に空のlistを与えても、commitChanges()でエラーは出ない。単に何も実行されないだけ[[@wikiへ&gt;http://kam.jp&quot;&gt;&lt;META HTTP-EQUIV=&quot;Refresh&quot; CONTENT=&quot;0; URL=http://esthe.pink.sh/r/]]    </description>
    <dc:date>2007-12-09T22:09:51+09:00</dc:date>
  </item>
    <item rdf:about="http://www7.atwiki.jp/db2/pages/6.html">
    <title>Cayenne memo</title>
    <link>http://www7.atwiki.jp/db2/pages/6.html</link>
    <description>
      *Cayenneとは？

- [[Cayenne&gt;http://www.objectstyle.org/cayenne/]]は、O/R Mapping Tool/Libraryの一種
- [[ライセンスはOpenSource&gt;http://www.objectstyle.org/cayenne/license.html]](The ObjectStyle Group Software License, version 1.1)
- Modelerと呼ばれるGUIが秀逸
- DB2,Derby(Cayenne 1.2から)他、多くのRDBMSに対応している

*大まかな作業の流れ
**A. DB側を先に作成して、Java側に反映させる場合
+ DBMS上で表を作成する。リレーションも作成する
+ Cayenne Modelerを起動し、DataDomainを作成
+ DataDomain上に、DataNode(DBへの接続設定)を作成
+ ModelerのReengineer機能でDBの表やリレーションを読み出し、ObjEntity(Java Classに対応)とDbEntity(表に対応)を作成する
+ Generate ClassesでJavaのソースコードを生成
+ Generate Database Schemaで、&quot;Create Primary Key Support&quot; &#039;&#039;のみ&#039;&#039; にチェックを入れてDDLを作成し（シーケンス文が作成される）、DB上で実行する

**B. Modeler上でEntityを作成し、それをDBMSに反映させる場合
+Modelerで、Data Entityを定義する
+Entityのリレーションを作成する
+ClassをGenerateする
+DDL(DB Schema)をGenerateする

*リレーション
- DBMS側で外部キー制約を作成しておくと、Cayenne Modelerが読み取る際にリレーションを作成してくれる
- ただし、参照する親表の列は &#039;&#039;プライマリーキー列&#039;&#039; でなければ、リレーションは作成されないようだ。（単にユニーク制約がある列への外部キーでは駄目なようだ）
- これはおそらくCayenneにとっては、外部キー＝他のEntityへのポインタなのでポイントする先は当然ObjectIDであるべきという事なのだと思われる

*クエリ(Query)の構築

**Queryの種類

Queryは、 &#039;&#039;SelectQuery&#039;&#039; , &#039;&#039;SQLTemplate&#039;&#039; , &#039;&#039;ProcedureQuery&#039;&#039; の三種類

***SelectQuery
-SQL文を使わない(DBMS Portableな)クエリ
-このQueryが基本で、SelectQueryが使えない場合のみ他のQueryを使うべきというのが作者の考えのようだ

***SQLTemplate
- SQLTemplate(GUIだとRaw Query)で任意のSQLをDataAdapter毎に設定できる
- SQLTemplateでは、射影が使用できるが、必ずPrimary keyはFETCHするようにしないといけない
- 射影はMandatoryに設定した列は全てSELECTしないと、正しくobjectを作成できない。Mandatoryの列を全てSELECTしない状態で作成したEntityは、state:hollowになる

- SQLは、Velocityでdynamicに変更できる
- #bindで、prepareが実現出来る ([[User guideの7.7章&gt;http://objectstyle.org/cayenne/userguide/fetch/sqltemplate-scripting.html]]を参照)
- Raw SQL(GUI)のSQL文内で改行できるかどうかはJDBCドライバの実装による？(DB2=&gt;OK,Derby=&gt;NG)

- SQLTemplateを使用して更新処理を行う場合は注意が必要。その更新はメモリ上のObjectStoreをバイパスして直接DBを操作するため、操作によってはObject GraphとDBで不整合を起こす可能性がある。(User Guide 7.6.3) 

 // 1.クエリをmap.xmlから取り出す
 SelectQuery prototype=
  (SelectQuery)context.getEntityResolver()
  .lookupQuery(&quot;MySelect&quot;);

 // 2. パラメタをセット
 Map params = new HashMap();
 params.put(&quot;aname&quot;, &quot;Monet&quot;);
 SelectQuery query = 
  prototype.queryWithParameters(params);

 // 3. 実行
 List objects = context.performQuery(query);

もしくは、（パラメタ設定なしの場合）
 List objects = context.performQuery(&quot;MySelect&quot;, false);

***ProcedureQuery

- TBW

*** 一つしか値を返さないクエリ

SingleObjectQueryクラスかDataObjectUtils.objectForQueryを使う。

[[See : SingleObjectQuery &gt;http://objectstyle.org/confluence/display/CAY/SingleObjectQuery]]

**並べ替え/ソート(Ordering)

 query.addOrdering(&quot;artistName&quot;, true);
 (ORDER BY ARTISTNAME ASC)
 (第二引数をfalseにするとDESC)

-複数条件のOrderingもサポート
-インメモリのソートはOrderingオブジェクトを使う(Orderingオブジェクト自体はインメモリだけのサポートではないかも)

**Expression (WHEREのような絞込み)

Expression ObjectはExpression.fromString()で作成できる。
 Expression e = Expression.fromString
  (&quot;title like &#039;A%&#039; and price &lt; 1000&quot;);

以下の三種類のexpressionがある。

***object property expressions (path expressions)

-pathは、Beanのプロパティでも、DBの列名でも指定できる
-pathはドット(.)で接続してリレーション先を指定できる

- Path内での指定方法
 単に文字列だとObject path -&gt; artistName
 obj:を付けると明示的にObject path -&gt; obj:artistName
 db:を付けると、database path -&gt; db:ARTIST_NAME

-path内での文字列リテラルはコーテーションで囲む必要有り
 例 -&gt; &quot;&#039;ABC&#039;&quot;  or &quot;\&quot;ABC\&quot;&quot;

-文字列で直接Expressionを書く以外にも、ExpressionFactoryのmatchExp()などのファクトリメソッドで組み立てる方法もある。特にinExpは引数にListか配列が取れるので便利([[User Guide 10.3&gt;http://objectstyle.org/cayenne/userguide/expressions/shortcut.html]])

***arithmetic operations

***conditional expressions

**NULLの扱い
パラメタマーカ等にNULLがきても適切なSQLに変換される。
 Expression.fromString(&quot;d = null&quot;);
 ExpressionFactory.matchExp(&quot;d&quot;, null);
などとしても、WHERE D IS NULLに変換される。

**In-memory evaluation
作成したExpressionは任意のJava Beanに適応できる（DataObjectを継承していなくても)
つまり、e.match(myObj)のmyObjは任意のJava Beanが使用できる。

**FETCHの制限

 SelectQuery#setFetchLimit(int fetchLimit)
Fetchの最大数を決める。SQLに修正が入るのではなく、単にFETCHする量を制限しているようだ

 SelectQuery#setPageSize(int pageSize)
ページング（部分読み）の分割数の設定

**クエリーしたオブジェクトのキャッシュ

|NO_CACHE|デフォルト。毎回DBにアクセス|
|LOCAL_CACHE|同一のDataContext内でキャッシュを使用|
|SHARED_CACHE|同一のJVM内でキャッシュを共有|

-JVM間をまたがるキャッシュは無いようだ

 query.setName(&quot;MySelect&quot;);
 query.setCachePolicy
  (GenericSelectQuery.LOCAL_CACHE);
 query.setRefreshingObjects(false);

キャッシュの使用はクエリの名前で区別されるので、名前は重要。キャッシュポリシーはGUIでも設定可能

 query.setRefreshingObjects(true/faluse);
デフォルトでは、true:リフレッシュする
リフレッシュもGUIで設定可能

*DataContextとDataObject

- DataObjectは、全てのEntityの基礎
- DataContextにDataObjectを&quot;Register&quot;する事で、Entityの変更などがトラッキングされ、パーシステントされる
- Registする方法は2つ
&gt;automatically when they are fetched via query API 
 Query APIで読み出したObjectは自動的にRegistされる。
 つまりDataContext#PerformQuery()等で実行した場合、
 FetchしたObjectは自動的にそのDataContextにRegistされる

&gt;explicitly for the newly created objects 
 新規に作成したObjectは、明示的にRegistしないといけない
 context.registerNewObject(newObject); もしくは
 context.createAndRegisterNewObject(*.class)を使う

**DataObjectの状態
- DataObjectは状態(State)を持つ。状態はDataObject.getPeristenceState()で確認できる

|TRANSIENT|newで作成されたが、Registされていない|
|NEW|作成され、RegistされたがDBにCommitされていない|
|COMMITTED|DBにCommitされた|
|MODIFIED|DBに存在するObjectでDataObject側が修正された。リレーション先が変更された場合も含む?|
|DELETED|DataContext#deleteObject()されたDataObject|
|HOLLOW|不完全なオブジェクト？|

- DELETED状態のDataObjectは、commitChanges()でTRANSIENTな状態になる

- DataContextにRegistされたObjectのうち一つでもNEW/MODIFIED/DELETEDになっているかどうかは、DataContext#hasChanges()で確認できる。

**Validation

DataObjectが保持するデータが、RDBMSのスキーマにマッチするかどうかは、commitChanges()のタイミングで行われる。例えばCHAR(1)の列に対応したプロパティに&quot;ABCDE&quot;が設定されている場合 &#039;&#039;DBにINSERTする前に&#039;&#039; Cayenne内でValidationが行われて、 &#039;&#039;org.objectstyle.cayenne.validation.ValidationException&#039;&#039;  が発生する。

**Local Copy
-sessionContext.localObjects(list)でローカルにコピーが作れる？(User guide 6.4)
-listに含まれるObjectのStateはCOMMITEDかHOLLOWでなければいけない⇒READ ONLYデータ用
-localObjectのStateは？

**Primary key(PK)
基本的に、Cayenneにおけるプライマリーキーは、
- Entityを識別するためのID
- ビジネス上の意味を持たないのが望ましい（代理キー）
- EntityはPKへのgetter/setterを持たないのが普通(modeler guideでもPKへのアクセッサをつけない事を推奨している)
- PKの値はCayenneによって自動生成される
- PKの値の生成には、DB2の場合はシーケンスが使用され（使用させない設定も可能）、START=200,Increment=20,Cache=20に設定される
- CayenneのPKGeneratorクラス内でPKのシーケンスをあらかじめキャッシュしておいてそれを使う実装になっている（20個分）⇒つまりIDが20づつ増える訳ではなく、1づつ増える
- Cache sizeは[[JdbcPkGenerator#setPkCacheSize(int)&gt;http://objectstyle.org/cayenne/api/cayenne/org/objectstyle/cayenne/dba/JdbcPkGenerator.html#setPkCacheSize(int)]]で設定で変更できる（だが1等に設定すると毎回DBMSにPKの問い合わせをする事になるのでパフォーマンスが低下する）
- DB2の表側でID列を設定し、CayenneにPKを生成させないようにする方法もある（未テスト）

- IDへのsetter/getterの作り方
http://www.atmarkit.co.jp/fjava/products/cayenne/cayenne_3.html
より引用

 public Integer getId() {
     return (getObjectId() != null &amp;&amp; !getObjectId().isTemporary()) ? 
 (Integer)getObjectId().getIdSnapshot().get(ID_PK_COLUMN): null;
   }

 public void setId(int id) {
   setObjectId(new ObjectId(Employee.class, &quot;ID&quot;, id));
 }

DataObjectからPKの値を取り出したり、PKの値(int)からDataObjectを取り出す場合は、DataObjectUtilsクラスを使用する事ができる。
しかしCayenneのデザインとしては、直接PKを操作するのは推奨されない。(DataObjectUtilsのJavaDocに書いてある)
（また、上記を手で実装するより、modelerで設定すれば良いのかも)

see also:
- [[User Guide 4.7&gt;http://objectstyle.org/cayenne/userguide/design/autopk.html]]
- [[ML 2003/01/0032&gt;http://www.objectstyle.org/cayenne/lists/cayenne-user/2003/01/0032.html]]
- [[ML 2005/02/0034&gt;http://www.objectstyle.org/cayenne/lists/cayenne-user/2005/02/0034.html]]

*トランザクション

- DataContext.commitChanges()でCOMMIT(厳密には、このメソッドを読んだ時点で必要なSELECT,INSERT,UPDATE,DELETE文が自動的に作成され、実行され、COMMITされる。
- DataContext.rollbackChanges()で、ROLLBACKというか、DataContextにRegistしているDataObjectの状態が元に戻される。この時、新規にNEWして手動でRegistしたDataObjectは、Registしていない状態に戻る

*Cayenne Modeler (GUI)

-GUIの設定は、C:\Documents and Settings\user\.cayenne\prefs\1.2以下に、HSQLDB形式で保存されている

-GUIで定義したQueryは、new NamedQuery(&quot;Queryの名前&quot;)でQueryを作成する（もしくはDataContextのコンビニエンスメソッドperformQuery(String,boolean)を使用して直接実行する)

-DB2の(VAR)GRAPHIC列は、 &#039;&#039;2倍のサイズの(VAR)CHAR列&#039;&#039; として読み込まれる。つまりVARGRAPHIC(10)は、VARCHAR(20)として扱われる。必要であればGUI上で手動修正が必要

-DB上のTIMESTAMP型は、デフォルトではjava.util.Dateにマッピングされる。そのまま使っても良いが、不都合がある場合はGUI上でjava.sql.Timestampに変更する事もできる

*Cayenneのメリット/強み

- Modelerによるコード/XML/DDL自動生成
- one to oneでもone to manyでもDataObject間で自動的に双方向リンクされる(他のORMでは難しいのでは？）
- Remote persistence, good faulting implementation (と作者は言っている)

*他フレームワークとのインテグレーション

- Springとの連携例は、[[Cayenne exapmle&gt;http://objectstyle.org/confluence/display/CAY/Cayenne+Examples]]にソースコードがある。
- [[TapestryのISqueezeAdapterをCayenneに対応させたもの&gt;http://equalitylearning.org/Tassel/app?service=external/ViewComponent&amp;sp=SCayenneDataObjectSqueezeAdaptor]]
- [[Click Framework&gt;http://click.sourceforge.net/docs/extras-api/net/sf/click/extras/cayenne/package-summary.html]]

*メモ
-キャッシュの動作が良く分からない
+setRefreshingObjects(true)にすると、キャッシュにデータが在っても必ずDBからFETCHするようだ 
+setRefreshingObject(false)にすると、キャッシュにある場合、キャッシュから取り出して問題なく動作するがキャッシュに目的のDataObjectが無い場合でもSELECTを発行してくれないように見える
+Queryに付ける名前を同じにしないとキャッシュを共有できないようだ
+ある名前のQueryが最初に実行される時は、refreshing=falseでもFETCHされるようだ
+、、、という事は、同じクエリを再度実行した時用のキャッシュという事？？


- Java EntityはJava Beanだが、(他のORMのように)プレインなBeanでは無く、Cayenneが用意したクラス(org.objectstyle.cayenne.CayenneDataObject)を継承している⇒プレゼンテーション層にデータを転送したい場合はDTOを作るなど一工夫があった方が良いかも

- DataObjectを継承していない任意のPoJo BeansをPersistent可能にして欲しいというリクエストは以下にあるが、どう対応するかは決まっていないようだ([[CAY-262&gt;http://objectstyle.org/jira/secure/ViewIssue.jspa?key=CAY-262]])

- EJB3のPersistence APIには対応する事は考えているようだ
http://objectstyle.org/confluence/display/CAY/2006/01/10/


- どのDBに接続するかという情報をcayenne.xmlに記述したくない場合は、JNDI or Commons DBCPを使用して、そちらで変更する

- Expressionで&quot;deptno like &#039;x&#039;&quot;などと指定すると、生成されるSQLが
 WHERE RTRIM(t0.DEPTNO) LIKE CAST (? AS VARCHAR(3))
とRTRIMやCASTが付加されたSQLとなる。

- Optimistic Lock （楽観ロック）への対応
-- Optimistic Lockには対応している
-- 指定された列をすべて比較するタイプの実装
-- VERSION列（の自動更新）には対応していない
-- もし自動更新のVERSION列が欲しい場合は、自分でDataObject.setPersistenceState(..) をオーバーライドして実装するのが良いらしい
-- http://www.objectstyle.org/cayenne/lists/cayenne-user/2004/06/0060.html

*リンク

- [[Cayenne&gt;http://www.objectstyle.org/cayenne/]]
- [[Cayenne Wiki&gt;http://www.objectstyle.org/confluence/display/CAY/Home]]
- [[Cayenne Examples on wiki&gt;http://objectstyle.org/confluence/display/CAY/Cayenne+Examples]]
- [[CayenneでORマッピング&gt;http://www.fk.urban.ne.jp/home/kishida/kouza/cayenne.html]]
- [[話題のO/Rマッピングツール「Cayenne」を使う&gt;http://www.atmarkit.co.jp/fjava/products/cayenne/cayenne_1.html]]
- [[S2Cayenne&gt;http://www.seasar.org/wiki/index.php?Sandbox%2FS2Cayenne]]

&amp;html(&lt;!--shinobi1--&gt;&lt;script src=&quot;http://x5.shinobi.jp/ufo/049168403&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;a href=&quot;http://x5.shinobi.jp/bin/gg?049168403&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://x5.shinobi.jp/bin/ll?049168403&quot; border=0&gt;&lt;/a&gt;&lt;br&gt;&lt;a style=&quot;font-size:80%&quot; href=&quot;http://www.cash-value.net/&quot; target=&quot;_blank&quot;&gt;キャッシングValue&lt;/a&gt;&lt;/noscript&gt;&lt;!--shinobi2--&gt;)    </description>
    <dc:date>2007-02-05T17:08:44+09:00</dc:date>
  </item>
    <item rdf:about="http://www7.atwiki.jp/db2/pages/4.html">
    <title>derbyconsole</title>
    <link>http://www7.atwiki.jp/db2/pages/4.html</link>
    <description>
      *Derby Console (for Windows)

[[Derby&gt;http://db.apache.org/derby]]をWindows環境で使用する際、コマンド実行環境の設定が面倒だったので、簡易なBATファイルを作りました。(Derby付属のij.batなどはちょっと使いづらかったので）
小さな*.batファイル一つという簡単なものですが、WINDOWS環境ではそこそこ有用だと思うので公開します。好みに編集してお使いください。

#ref(derbyconsole1.png,,center)

**特徴
-ij,sysinfo,dblookなど、Derbyを操作するコマンドが直接実行できるようになります
-環境変数などの設定は不要で、BATファイルの中のディレクトリ名を書き換えるだけで使用可能です

**ダウンロード
-[[ここ&gt;http://www7.atwiki.jp/db2/?cmd=upload&amp;act=open&amp;pageid=4&amp;file=derby_console.zip]]からダウンロードして任意のディレクトリに展開してください。

**セットアップ
-まだDerbyをダウンロードしていない場合は、[[Apache Derbyのダウンロードページ&gt;http://db.apache.org/derby/derby_downloads.html]]からdb-derby-10.x.x.x-bin.zipをダウンロードして、任意のディレクトリに展開しておいてください。（この例では、Derby 10.1.2.1 ReleaseをE:\local\derby-10.1.2.1\に展開しています）
-このページから[[derby_console.zip&gt;http://www7.atwiki.jp/db2/?cmd=upload&amp;act=open&amp;pageid=4&amp;file=derby_console.zip]]ファイルをダウンロードして、任意のディレクトリに展開してください
-DERBY CONSOLE.BATをメモ帳等で開き、ファイル先頭近くにある2つの変数(DERBY_INSTALLとDERBY_SYSTEM_HOME)の値を編集します。DERBY_INSTALLには、Derbyを展開したディレクトリを指定します。DERBY_SYSTEM_HOMEは、Derbyのデータベースを作成するトップディレクトリを指定します。以下はDerbyを展開したディレクトリがE:\local\derby-10.1.2.1\で、DBを作成するディレクトリをE:\local\derby-db\とした例です。

#ref(setup02s.png)
-これで設定は終了です。DERBY CONSOLE.BATをダブルクリックすると、DOSプロンプトが表示され、コマンドを実行できます。

-以下はオプションの設定です。
-デスクトップ等にDERBY CONSOLE.BATファイルへショートカットを作成し、
#ref(desktop_icon.png)
-以下のようにショートカットのプロパティで「作業フォルダ」を自分の作業ディレクトリに設定しておくと、便利に使えます。
#ref(icon_property2.png)


**簡単な使い方
***エンベッデッドモード(Embedded mode)での使い方

とりあえず試す場合は、エンベッデッドモードが良いでしょう。

-Derby Consoleを起動して、中でijを実行します。
-connect  &#039;DB名&#039; ;　でDBに接続します。最後にセミコロン(;)が必要です。通常は、&#039;jdbc:derby:DB名&#039;と指定しますが、BAT内でプロトコルとして&#039;jdbc:derby:&#039;を指定しているので、&#039;DB名&#039;だけで接続できます。
-まだDBが無い場合は、;create=trueをconnect時に指定します。(例： connect  &#039;test1;create=true&#039; ; )
-接続後は通常のDDL/DMLが実行できます。
-デフォルトではAUTO COMMITが有効なので注意が必要です。autocommif off;と実行するとAUTO COMMITがオフになります。
-AUTO COMMITがオフの場合は、commit;もしくはrollback;でトランザクションを完了させる必要があります。DerbyはDDL(例：CREATE TABLE)も基本的にrollbackの対象になります。
-ij内で、HELP; とタイプするとijの簡単なヘルプが出力されます。
-接続を解除するには、disconnect;を実行します。
-ijを終了するには、exit;を実行します。

***ネットワークサーバとして使う
- 外部のマシンから接続したり、複数のJVMから接続したい場合はネットワークモードで起動する必要があります。（一般的なDBMSと同じ）
- Derby ConsoleからNetworkServerControl start でネットワークモードで起動します。デフォルトのポート1527で待ち受ける状態になります。
&amp;ref(networkmode3.png)
- ijで接続するには、もう一つDerby Consoleを立ち上げ、その中でijを起動し、connect &#039;jdbc:derby://ホスト名:ポート番号/DB名&#039;; で接続します。(例）connect &#039;jdbc:derby://localhost:1527/testr1&#039;;
- ポート番号の指定はデフォルトの1527を使用している場合は省略できます。
- ネットワークサーバで起動したDerbyを停止するには、別のDerby ConsoleからNetworkServerControl shutdownを実行します。

**実行できるコマンド
-&#039;&#039;ij&#039;&#039; :対話的にDBを操作します
-&#039;&#039;sysinfo&#039;&#039; :Derbyのシステム情報を表示します
-&#039;&#039;NetworkServerControl&#039;&#039; :ネットワーク経由でサーバ情報を取り出したり、ネットワークサーバを起動/停止する操作などを行います
-&#039;&#039;dblook&#039;&#039; :既存の表などからDDLを抽出するコマンドです
上記は、Derby標準のコマンドです。オプションなどの詳細はDerbyアーカイブの/docs/pdf/tools/derbytools.pdf もしくは[[オンラインマニュアル&gt;http://db.apache.org/derby/docs/10.1/tools/]]を参照してください。
またこのBATファイル内では、&#039;&#039;nsctl&#039;&#039; と &#039;&#039;dblist&#039;&#039; というエリアスが登録されています。&#039;&#039;nsctl&#039;&#039; はNetworkServerControlとまったく同じです（NetworkServerControlだと長いので短い名前で登録しています）。&#039;&#039;dblist&#039;&#039; はDB一覧を表示します。これは、単に%DERBY_SYSTEM_HOME%以下のディレクトリ名一覧を表示しているだけです。

**補足
-ライセンスをどうこう言うような規模のものではありませんので、サンプルとして自由に使用してください。
-このサイト上のファイルを使用した結果、利用者に生じるいかなる損害にも作者は一切責任を負わないものとします。利用者の責任で使用してください。

**コメント欄
- &lt;a href=&#039;http://www.insurance-top.com&#039;&gt;car insurance&lt;/a&gt; : [http://www.insurance-top.com auto insurance] - [HTTP://www.insurance-top.com auto insurance] : [Insurance car|http://www.insurance-top.com] - [Insurance car|HTTP://www.insurance-top.com] : http://www.insurance-top.com/auto/ : [[http://www.insurance-top.com insurance quote]] : [[http://www.insurance-top.com | home insurance]] : &quot;cars insurance&quot; http://www.insurance-top.com : [http://www.insurance-top.com|insurance auto]  -- car insurance  (2006-06-24 11:50:38)
- &lt;a href=&#039;http://www.ringtones-dir.com&#039;&gt;free ringtones&lt;/a&gt; : [http://www.ringtones-dir.com download ringtones] - [HTTP://www.ringtones-dir.com download ringtones] : [nokia ringtones|http://www.ringtones-dir.com] - [nokia ringtones|HTTP://www.ringtones-dir.com] : http://www.ringtones-dir.com/download/ : [[http://www.ringtones-dir.com ring tones]] : [[http://www.ringtones-dir.com | ringtones download]] : &quot;samsung ringtones&quot; http://www.ringtones-dir.com : [http://www.ringtones-dir.com|ringtones free]  -- free ringtones  (2006-08-12 06:05:21)
#comment

----
&amp;html(&lt;!--shinobi1--&gt;&lt;script src=&quot;http://x5.shinobi.jp/ufo/049168401&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;a href=&quot;http://x5.shinobi.jp/bin/gg?049168401&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://x5.shinobi.jp/bin/ll?049168401&quot; border=0&gt;&lt;/a&gt;&lt;br&gt;&lt;a style=&quot;font-size:80%&quot; href=&quot;http://www.shinobi-web.biz/&quot; target=&quot;_blank&quot;&gt;システム開発&lt;/a&gt;&lt;/noscript&gt;&lt;!--shinobi2--&gt;)    </description>
    <dc:date>2006-08-12T06:05:21+09:00</dc:date>
  </item>
    <item rdf:about="http://www7.atwiki.jp/db2/pages/5.html">
    <title>Derby memo</title>
    <link>http://www7.atwiki.jp/db2/pages/5.html</link>
    <description>
      *Apache Derby

- [[Apache Derby&gt;http://db.apache.org/derby/]]は、Pure JavaのRDBMS実装
- ライセンスは[[Apache License, Version 2.0&gt;http://db.apache.org/derby/license.html]]
- Embedded modeでJavaプログラム内に埋め込んで使用可能
- ネットワーク上にサーバとして接続を待ち受ける事も可能
- SQL92/99に多くの部分で準拠
- トリガー、ストアドプロシージャ、制約、外部キー、ビューなどRDBMSに必用とされる機能がほとんど実装されており、機能的な制約が少ない
- 管理作業不要
- 動作に必用なメモリーフットプリントが小さい
- XA接続可能なJDBCドライバが用意されている
- 必用なJDKは1.3以上

*ダウンロード

-[[Apache Derby Download&gt;http://db.apache.org/derby/derby_downloads.html]]

導入は*zip,tgzファイルをダウンロードして、任意のディレクトリに展開するだけです。

-[[IBM Cloudscape&gt;http://www-306.ibm.com/software/data/cloudscape/]]

Cloudscapeは、Derbyをベースに開発されているIBMのRDBMSで、機能面ではほとんど差がありません。無料でダウンロードできます。ダウンロードサイズが大きいのは、IBM JRE等が同梱されているためです。

- [[Cloudscape Workbench&gt;http://www-128.ibm.com/developerworks/db2/downloads/csworkbench/]] 

Derby/Cloudscape,DB2に接続可能なGUIです。Eclipse RCPをベースに作成されています。

*2つのモード
**Embedded mode (エンベッデッドモード)

-起動・停止の手間が掛からない
-同時に一つのJVMからしか接続できない(1つのJVM内での複数接続は可能)
-ネットワーク経由での接続はできない
-終了前にはShutdown処理が必要
-Shutdown無しにJVMを終了した場合、次回接続時にクラッシュリカバリ処理が走る
-JDBCのURLに;shutdown=trueを付けて接続するとShutdownされる
 jdbc:derby:test;shutdown=true ⇒ &#039;test&#039;をShutdown
 jdbc:derby;shutdown=true ⇒ 全てのデータベースをShutdown

**Network Server mode (ネットワークサーバーモード)

-ネットワーク経由で複数のJVMから接続可能
-サーバ側で起動/停止(Shutdown)の操作が必用(一般的なRDBMSと同じ)
-ネットワークモードの操作には、derbynet.jarに含まれるorg.apache.derby.drda.NetworkServerControlを使用する

 java org.apache.derby.drda.NetworkServerControl start

で起動(CLASSPATH上に、derbynet.jarとderby.jarが必用)

 java org.apache.derby.drda.NetworkServerControl shutdown

で停止(CLASSPATH上にderbynet.jarが必用)

-デフォルトのポート番号は1527番

**2つのモードの比較
|名前|JDBCドライバクラス|クライアントに必用なJARファイル|JDBC URL|備考|
|Embedded|org.apache.derby.jdbc.EmbeddedDriver|derby.jar (Derby本体を含む)|jdbc:derby:DB名|同時に接続できるのは一つのJVM|
|Network Server|org.apache.derby.jdbc.ClientDriver|derbyclient.jar|jdbc:derby://ホスト名:ポート番号|DB2のJDBCドライバやコマンドラインツール(DB2 CLP)からでも接続可能|

*データベースの作成

-JDBCのURLに、;create=trueを追加する事でデータベースが自動的に作成される（すでに同じ名前のデータベースがある場合は作成されず、そのデータベースに接続される）
(例)
 jdbc:derby:mydatabase;create=true
 jdbd:derby://hostname:9999/myremotedb;create=true


*システムディレクトリ（derby.system.home）

-Embedded modeでもNetwork Serever modeでも、Javaを実行したカレントディレクトリがDerbyのシステムディレクトリになり、そのディレクトリ以下にデータベースファイルが作成される
-システムディレクトリは、プロパティのderby.system.homeを設定する事で上書き可能


*認証

-デフォルトでは、認証が機能していない。つまりどんなユーザID,パスワードでも接続可能
-ユーザIDを指定しない場合は、&quot;APP&quot;という名のユーザIDで接続した事になる
-ただしDataSourceのプロパティではパスワードを空文字列（&quot;&quot;）には設定できない点に注意が必用

*管理

- Derbyは、表からデータを削除してもデータ領域をOS(File system)には返さず、次のデータ挿入時に再利用する
- ストアドプロシージャのSYSCS_UTIL.SYSCS_COMPRESS_TABLEまたはSYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLEを実行すると未使用領域を開放できる

*その他

-Derbyが出力するメッセージを日本語にしたい場合は、derbyLocale_ja_JP.jarをCLASSPATHに含める

-Derbyは、SQL文中に/* */コメントを入れる事が出来ないようだ

*LINK

- [[Apache Derby入門&gt;http://www.ruimo.com/publication/]] - Embedded modeでのプログラムについての解説
- [[Derby Console&gt;derbyconsole]] - Windows用環境設定バッチファイル

----
&amp;html(&lt;!--shinobi1--&gt;&lt;script src=&quot;http://x5.shinobi.jp/ufo/049168402&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;a href=&quot;http://x5.shinobi.jp/bin/gg?049168402&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://x5.shinobi.jp/bin/ll?049168402&quot; border=0&gt;&lt;/a&gt;&lt;br&gt;&lt;a style=&quot;font-size:80%&quot; href=&quot;http://www.samurai-f.co.jp/&quot; target=&quot;_blank&quot;&gt;Analyzed by 侍&lt;/a&gt;&lt;/noscript&gt;&lt;!--shinobi2--&gt;)    </description>
    <dc:date>2006-01-19T15:56:09+09:00</dc:date>
  </item>
    <item rdf:about="http://www7.atwiki.jp/db2/pages/2.html">
    <title>メニュー</title>
    <link>http://www7.atwiki.jp/db2/pages/2.html</link>
    <description>
      メニュー
-[[トップページ]]
-[[更新履歴]]

#treemenu(title=DB2,
[[Unofficial DB2 blog&gt;http://db2.jugem.cc]],
[[Cayenne memo]],
block,
treeline=1)

#treemenu(title=Derby関連,
[[Derby memo]],
[[Derby Console&gt;derbyconsole]],
block,
treeline=1)    </description>
    <dc:date>2006-01-18T11:37:11+09:00</dc:date>
  </item>
    <item rdf:about="http://www7.atwiki.jp/db2/pages/1.html">
    <title>トップページ</title>
    <link>http://www7.atwiki.jp/db2/pages/1.html</link>
    <description>
      *[[Unofficial DB2 Wiki&gt;http://www7.atwiki.jp/db2]]

[[Unofficial DB2 Blog&gt;http://db2.jugem.cc]]のWikiです。

まだコンテンツはほとんどありません。

- [[Derby Console&gt;derbyconsole]]

----
&amp;html(&lt;!--shinobi1--&gt;&lt;script src=&quot;http://x5.shinobi.jp/ufo/049168400&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;a href=&quot;http://x5.shinobi.jp/bin/gg?049168400&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://x5.shinobi.jp/bin/ll?049168400&quot; border=0&gt;&lt;/a&gt;&lt;br&gt;&lt;a style=&quot;font-size:80%&quot; href=&quot;http://www.ninja-systems.com/&quot; target=&quot;_blank&quot;&gt;SEO&lt;/a&gt;&lt;/noscript&gt;&lt;!--shinobi2--&gt;)    </description>
    <dc:date>2006-01-18T11:32:23+09:00</dc:date>
  </item>
    <item rdf:about="http://www7.atwiki.jp/db2/pages/3.html">
    <title>更新履歴</title>
    <link>http://www7.atwiki.jp/db2/pages/3.html</link>
    <description>
      **更新履歴
#recent(20)
    </description>
    <dc:date>2006-01-07T00:33:29+09:00</dc:date>
  </item>
  </rdf:RDF>

