【PureJava】 Derby 1 【OpenSource】
このスレはApacheSoftwareFoundation(以下ASFと略す)傘下で開発が進められているPureJavaRDBのDerbyについて語るスレです。
Derbyって何?
Javaで書かれたRDBMSです。
Derbyで何ができるの?
Javaの実行環境があれば、開発したアプリケーションにRDBを組み込むことができます。
「アプリケーションの出力結果をテキストに吐き出して、必要があればそこから検索して...」
などの作業を、開発を簡単に、実行時に素早く行うことができます。
でも、DBって設定とかいろいろ難しいんでしょ?
Derbyは簡単です。「簡単に使える(Easy to Use)」がDerby開発目的の一つです。
Derbyは誰が開発しているの?
現在はASF傘下でOpenSourceプロジェクトとして開発が進められていますが、
それ以前はIBMがCloudScapeという名称で開発を進めていました。
詳細は2以降のリンク先を参照してください。 関連リンク
The Apache Derby Project
ttp://db.apache.org/derby/
IBM Cloudscape インフォメーション・センター
ttp://publib.boulder.ibm.com/infocenter/cldscp10/index.jsp
Publications home (CloudscapeマニュアルPDF版30冊)
(マニュアル検索をクリック、キーワードCloudscape、表示結果数100で検索)
ttp://www.elink.ibmlink.ibm.com/puc/jsp/index.jsp?country=J1&language=JPN
Cloudscapeと3つの「C」
ttp://www-6.ibm.com/jp/developerworks/ysl/j_ysl-cloud.html
IBM Cloudscape、Apache Derbyについて
ttp://timescape.jugem.jp/
Unofficial DB2 BLOG
ttp://db2.jugem.cc/
IBM DB2 スレ (関連スレ)
http://pc8.2ch.net/test/read.cgi/db/1057170768/ Derbyに含まれているdemoの実行方法
(Windowsを対象とします。UNIXの場合は適宜読みかえてください。db-derby-10.x.x-bin\demo\readme.html より抜粋)
1.コマンドラインを起動します。
2.ダウンロードしたdb-derby-10.x.x-bin.zipを解凍してできたディレクトリをDERBY_INSTALLとして環境変数に設定します。
例:解凍してできたフォルダが「C\:db-derby-10.x.x-bin」の場合、コマンドラインに
「set DERBY_INSTALL=C\:db-derby-10.x.x-bin」として実行します。
3.コマンドラインに「cd %DERBY_INSTALL%\demo\simple」と入力し、demo用アプリケーションの存在するフォルダへ移動します。
4.コマンドラインに「set CLASSPATH=.;%DERBY_INSTALL%\lib\derby.jar」と入力し、クラスパスを設定します。
5.コマンドラインに「java org.apache.derby.tools.sysinfo -cp embedded SimpleApp.class」と入力し実行します。
上記2〜4の設定が正しく行われていれば
FOUND IN classpath:
Derby embedded engine library (derby.jar)
user-specified class (SimpleApp)
SUCCESS: All Derby-Related classes for embedded environment found in classpath.
と出力されます。
6.5で正しく環境設定が行われていることを確認したら、コマンドラインに「java SimpleApp」と入力し実行します。
プログラムが稼働していることを確認してください。 >1
激しく乙!
ところでリリースノートのURLを間違えていましたorz
リリースノートはPDFではなく、HTMLです。
IBM Cloudscape V10.1 リリース・ノート
http://publibfp.boulder.ibm.com/epubs/html/d8864661.html >>1 おつかれ
derby(とcloudscape)って使っている人まだ少ないのかねー。
日本語の情報が全然ないもんね。
こんな良いDBがタダで使えるなんで、他に無いと思うんだけどね。
PostgreSQLとかもいいんだけど、derbyの設定いらず、管理いらずの
よさって他になかなか無いと思う。
なにげにMacでも使えるし。 今月と来月のJavaWorld(2005/11,12)でDelbyの解説をやってるね。
11月号はインストールと簡単な使い方のみでつまんなかったけど。 起動やちょっと使う程度だと、HSQLDBの方が速いかな。
HSQLDBはデータ量が増えると遅くなるから、derbyにはそのあたりの耐久性を期待。 そうそう。HSQLDBは、更新を行うテーブルの場合、データのコンパクションを行わないと
とてもとても重くなる。 derbyに期待。
HSQLDBって何件くらいで重くなるの?
Derbyで1万件位あるデータの検索は結構速かったよ なんかこっそり10.1.2.1が出てますね。
ttp://db.apache.org/derby/releases/release-10.1.2.1.cgi これ使い始めたんだけど、良いね。なんかお手軽な割にしっかり動いてるし。 HSQLと比べてどうかということだね。
Apacheライセンスってことでライセンスを統一しやすいこっちのが好きだけど たぶんHSQLDBのほうが速いだろうと予測するけども、Derbyは
ちゃんと排他処理とかやってそうな感じだな。 ストアドプロシージャやPreparedStatementが使えるなら
一般用途では性能なんてほとんど「気のせい」の世界じゃない?
HSQLとの対比がわかる表があったら嬉しい。
HSQLはファイルモードで複数ファイル作るから、こっちが1ファイルならちょっと考えちゃう。 ・・・やばい、Derby遅い。
スキーマ
create table test(id integer not null, name varchar(20))
forName
HSQL org.hsqldb.jdbcDriver
DERBY org.apache.derby.jdbc.EmbeddedDriver
connectionString
HSQL jdbc:hsqldb:file:db/hsql/hsqldata
DERBY jdbc:derby:db/derby/derbydata;create=true
1000件(左transaction, 右autoCommit)
insert into test values(" + i + ",'string" + i + "')
HSQL 0.172秒, 0.172秒
DERBY 6.203秒, 7.172秒
prepareStatement and transaction(左1,000件, 右100,000件)
insert into test values(?,?)
HSQL 0.094秒, 1.235秒
DERBY 0.906秒, 14.547秒
マシンスペック
Pentium4 1GHz, メインメモリ768MB
キャッシュなしで36倍、キャッシュありで10倍遅い。
何か起動も2秒くらいかかってるし、チューンできる場所があるのかな? 追加や更新をたくさん実行した直後のconnectが特に遅いんだよね。
その後のconnectは速いのに…なんなんだろ? ゲームに組み込むのにDerbyはどうなんだろ・・・
HSQLなら速度もネイティブと戦える速度みたいだけど
Derbyの遅さはちょっと気になるところ。
BLOGの速さを調査してみるか。 なんかログのクリアとかしてる気がするんだよなぁ<再接続時
サーバモードで動かしたときのパフォーマンスも調べてみないとダメかなぁ ログは正直イラネです。接続文字列のときに欲しけりゃ指定みたいにして、デフォはなくして欲しい。 気になって調べてみたんだが、ちゃんとシャットダウンしないと
次回起動時にリカバリー処理が走るらしい。
DriverManager.getConnection("jdbc:derby:DBNAME;shutdown=true");
で、このgetConnectionは必ずSQLExceptionを吐く。
ijとかのツールは自動的にshutdownしてくれるから気が付かなかったっぽいけど、
まぁちゃんとマニュアルくらい嫁という話だったよ orzスマン Sunが次期Sun Studioにバンドルするとかなんとか。 SunのJ2EE SDKにはPointBaseの前Cloudscapeがついてたしな >>16
PreparedStatementよりもストアドプロシージャのほうが
速いと思ってたけど、さほぼ変わりない?
というか最近じゃHibernateのようなO-Rマッピングツールばかりに頼って
ストアドプロシージャのこと考えないケースが多いのかな?
というか、このDerbyがHibernateなどのO-Rマッピングツールに
対応しているのか気になる。もし対応していたら使ってみようかなという気分になる。
Apache系だから
Jakarta Torqueにしか対応していないだったりして。
それより、PostgreSQL並みの機能を搭載しているのかも気になる。
性能は、やっぱりPureJavaでないDBよりも遅くなるのかな。
>>27
DataSourceは使ってないんですか? >>27
コネクションを切るときに
Conneciton con = null;
try{
con = DriverManager.getConnection("〜〜〜〜〜");
//(ry
} catch ( /* (ry */ ) {
//(ry
} finally {
try{
if(con != null || con.isClosed()){
con.close();
}
} catch( /* (ry*/ ){
//(ry
}
}
でclose()しておかないとエラーになるという話とは違う?
このcatchが多いclose()コードを見ていると、いい加減に、APache Jakarta Commons DBUtils使うべきかな・・・
それともHibernate使うべきかな・・・・
O/Rマッピングのツール類って、JDBCドライバさえあればどんなDBでも
マッピングできるでしょ。ApacheだからTorqueにしか対応してないなんて
ことはないでそ。 >>32
> でclose()しておかないとエラーになるという話とは違う?
まったく別。shutdownしないっていうことは、
サーバ型DBのプロセスをいきなり殺すくらいに相当するみたいよ。 O/Rマッピングは標準SQLが基本で、方言はそれようのクラスを指定するんじゃねーの? ファイルモードで動かすとやたら重く感じるけど
Postgresより速いといわれてるってことはサーバモードは優秀なんだろうな >>37
なんでそうなるんだよ
サーバモードはファイルモードの上に一層かぶさってるだけだから
Postgresがむちゃくちゃ遅くない限りそれはないだろ
>>27をやってなくて次のgetConnectionに時間がかかる、という話ならわかるが。 Derbyっていう名前がちょっとモニョモニョなんだよなあ
CLOUDSCAPEの方が格好よかった Derby=Postgres
HSQL=MySQL
という位置づけになっていくんだろうか
と囲うとしたら送信しちゃったじゃないか!
>>48
じゃあ何が出来ないの?
外部結合もサブクエリも出来るのなら、出来ないことないじゃん。 >>49 できないことがなきゃだめなの?(´・ω・`) もし全能の神が存在するとしたら、そのような神は常に邪悪であり信じてはいけない。 >>49
Derbyは、Pure Javaで書かれたデータベースの中では
飛びぬけて高機能だよ。
外部結合、view、制約、副照会、トリガー、ストアドプロシージャ
など、ほしいと思う機能のほとんどが使える。 つまり>>43のような位置づけになるのか?
欲張りたければDerbyを使えと?
それでよろし? >> 55
何か機能に問題があるわけじゃないんだから、
とりあえず自分で一度使ってみれば?
使うの全然難しくないから。 ストアドプロシージャがあるのか
してその性能は如何に? Mustangスレによると、このApache Derbyが次世代Java
Java SE 6 Mustangに取り込まれるらしい。
これにはびっくりした。 組み込まれるのは事実だが、JDKに組み込まれることに注意。
JREじゃないからね。 >>62-63
VMに組み込まれると一体どんなメリットがあるんだ?
native実装による高速化にでも期待しているのか?
というかVMに組み込むってどういうことよ。
それってDellのPC(ハードウェア)にデータベース組み込むと言ってるのと同じでは。 というか、
WindowsにAccessが標準搭載、
みたいな感じがする。
まあJDK限定じゃ、開発用のおためしDBに
使ってねって感じなんですかね。 ですねえ。思い切ってJREに付属しちゃえば普及は加速しそうだし、
「JRE 6に付属したJava DBの使い方」みたいな記事も大量に書かれそう
なんだけど。
DBベンダーからの反発がきつくなりそうだから止めたのかな。 >>65
だからnative実装で高速化じゃないか?
それでは、100%PureJavaというApache Derbyの特徴を
妨害することになってしまうが。
今のところ、そのまま標準APIの一部として組み込んだほうがマシだな。
ネイティブで実装すると、各OS毎に実装するコストがかかりそうだ。
なぜデータベース「エンジン」という「環境」の話をしているのに「標準APIの一部として
組み込め」という話になるのか。
APIはちゃんとJPAで標準化されたでしょ。 >>69
よくみろ、>>65に対するレスだろう。
あの時点では>>65はデータベースエンジンの
話はしていないので
ああいう話になっても仕方がないだろう。 >>61-62
JDK内のファイルであっても再配布可なものもあるし、実際の
ライセンス見ないとな。 >>68
RDBMSをネイティブ実装して速くなるか?
ほとんどのケースで、かえって遅くなると思われ。
JNIを呼ぶコストはでかい。
そして動的最適化はRDBMSみたいなものに向いてる。
Derbyでクラスタリングができるようになったら、
RDBMSベンダは真っ青だろうな。 >>72
それはあーる!別にJava原理主義者じゃないけど。 weblogicでクラスタ組むときにderbyを使用すると勝手にミラーリング
してくれるのか??table情報とかも??
だったら凄いけど。 HSQLならMySQLやSQLite並に速いんだろ?
Java DBとして昇格したDerbyは準拠型、H2は性能型と住み分ければいいよ。 >>72
Java純度がほぼ100%近いNetBeansがネイティブに頼ってるEclipseに
速度面で勝ってしまったことからDerbyをネイティブ化
するのはかえって遅くなると言うことか。
純粋な実行速度だけなら、HotSpotの最適化技術は凄く効果的だから
遅くなるとすればI/O処理だと思われる DerbyはPostgreSQL、HSQLDBとH2はMySQLと考えればいいんじゃね? Updateは遅いが、Queryは良い線行ってる気がする。
「Embedded用途のなんちゃってDB」と言う認識で
使い始めたのだが、なかなかどうして優秀じゃん。 ほほう。selectは頑張ってるのか。
insertでぶっちぎりでHSQLに負けたから敬遠してた。 Apache Derby Performance
ttp://wiki.apache.org/apachecon-data/attachments/Us2005OnlineSessionSlides/attachments/ApacheCon05usDerbyPerformance.pdf >>81
非常に良い資料だね。特に15pageあたりは興味深いよ。 Java6 betaにJDBC4.0対応のDerbyが入っていて、細々と実験中。
なかなか良い感じですな。 ij のrunコマンドでsqlファイルを読み込む場合、文字コードを指定することは出来ますか?
derby.ui.codesetオプションをつけてみたら、ijコマンド全体が文字化けしてしまいましたorz データの挿入を今より高速化させたいのだが良い方法を
どなたかご存知じゃありませんか?
Statement#addBatch()
を使用しているのだが。この質問って、プログラムの方かな? >>85
バッチ処理で希望のパフォーマンスがでないのなら
あきらめろとしかいいようがない。
JDBC使わずにネィティブにINSERTしろ addBatchで追加する処理が1件とかそんなオチなんでは....
PreparedStatementは、パラメータ違い以外は同じSQLなのに処理毎にnewするなんて
愚かなことをしない限り結構高速に動く。
それをやったうえでまだ遅いというなら、ストアド・プロシージャ化するしかないんじゃね? EclipseでEmbeddedドライバを使って
connection := DriverManager.getConnection("jdbc:derby:testDB;create=true",props);
stmt := connection.createStatement();
stmt.execute("CREATE ほにゃらら");
ってやったときに、DERBY_HOMEに関係なく、eclipseのインストールディレクトリ直下に
testDBのディレクトリがつくられます。どうやったらDBの作られる場所を指定できますか?
Properties props = System.getProperties();
props.setProperty("derby.system.home", "c:\\derby"); derbyでPLSQLを使うにはどうすればいいの?
OracleのDabaseLinkからDerbyに繋いでPL/SQLで…ってアホか! DerbyにはPLSQL相当の仕組みはないのだろうか??
>>93
あってるかわかんないけどJavaで書けるんじゃないかなぁ。
>>81のPDFをちょっと読んだ限りだと
PreparedStatementのSQLはコンパイルされてJavaのバイトコードなる
というあたりから、Javaで書ける仕組みがあってもおかしくないと思った。 ダービーにはストアドプロシージャあるからPL/SQL相当はいらんだろ PL/SQLってOracleのストアドプロシージャじゃないの? で、だ。
これを導入しようとしたら何か注意点はあるか? まるで情報が蓄積されていないな。すでに終わってしまった存在なのか?