提交 774b1795 authored 作者: Thomas Mueller's avatar Thomas Mueller

--no commit message

--no commit message
上级 dae44578
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<!--
Copyright 2004-2007 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
Initial Developer: H2 Group
-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>H2 データベース エンジン</title>
<script type="text/javascript" src="navigation.js"></script>
<link rel="stylesheet" type="text/css" href="stylesheet.css" />
<link rel="alternate" type="application/atom+xml" title="H2 Newsfeed" href="http://www.h2database.com/html/newsfeed-atom.xml" />
<link rel="alternate" type="application/rss+xml" title="H2 Newsfeed" href="http://www.h2database.com/html/newsfeed-rss.xml" />
</head>
<frameset cols="180,*" rows="*" frameborder="2" framespacing="4" border="4" onLoad="loadFrameset()">
<frame frameborder="0" marginheight="0" marginwidth="0" src="search_ja.html" name="menu" />
<frame frameborder="0" marginheight="0" marginwidth="0" src="main_ja.html" name="main" />
</frameset>
<noframes>
<body>
<p>
H2 (for 'Hypersonic 2') is free a Java SQL DBMS.
Clustering, embedded and server mode, transactions, referential integrity,
views, subqueries, triggers, encryption, and disk based or in-memory operation
are supported. A browser based console application is included.
If you see this page your browser does not support frames.
Please click here to view the <a href="search_ja.html">index</a>.
</p>
</body>
</noframes>
</html>
...@@ -1125,6 +1125,7 @@ Hypersonic SQL or HSQLDB. H2 is built from scratch. ...@@ -1125,6 +1125,7 @@ Hypersonic SQL or HSQLDB. H2 is built from scratch.
</li><li>In MySQL mode, for AUTO_INCREMENT columns, don't set the primary key </li><li>In MySQL mode, for AUTO_INCREMENT columns, don't set the primary key
</li><li>Use JDK 1.4 file locking to create the lock file (but not yet by default); writing a system property to detect concurrent access from the same VM (different classloaders). </li><li>Use JDK 1.4 file locking to create the lock file (but not yet by default); writing a system property to detect concurrent access from the same VM (different classloaders).
</li><li>Read-only sessions (Connection.setReadOnly) </li><li>Read-only sessions (Connection.setReadOnly)
</li><li>Support compatibility for jdbc:hsqldb:res:
</li></ul> </li></ul>
<h3>Not Planned</h3> <h3>Not Planned</h3>
......
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Copyright 2004-2007 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
Initial Developer: H2 Group
-->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="ja">
<head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" /><title>
Installation
</title><link rel="stylesheet" type="text/css" href="stylesheet.css" />
<script type="text/javascript" src="navigation.js"></script>
</head><body onload="frameMe();">
<table class="content"><tr class="content"><td class="content"><div class="contentDiv">
<h1>インストール</h1>
<a href="#requirements">
必要条件</a><br />
<a href="#supported_platforms">
サポートされているプラットフォーム</a><br />
<a href="#installing">
ソフトウェアのインストール </a><br />
<a href="#directory_structure">
ディレクトリ構成</a><br />
<br /><a name="requirements"></a>
<h2>必要条件</h2>
<p>
データベースを実行するために、以下のソフトウェアが動作することを確認します。 互換性のあるソフトウェアでも動作しますが、テストはされていません。
</p>
<ul>
<li>Windows XP, MacOS, or Linux
</li><li>Recommended Windows file system: NTFS (FAT32 supports files up to 4 GB)
</li><li>Sun JDK 1.4 or newer
</li><li>Mozilla Firefox 1.5 or newer
</li></ul>
<br /><a name="supported_platforms"></a>
<h2>サポートされているプラットフォーム</h2>
<p>
このデータベースはJavaで書かれているため、多くの異なったプラットフォームで実行することができます。 Java 1.4 と 1.5でテストされましたが、GCJを使用することでネイティブコードにコンパイルすることもできます。 ソースコードはJava 1.5の特徴は使われていません。現在、データベースはWindows XPでSun JDKを使用して開発、テストされていますが、 おそらく、他の多くのOSと他のJava Runtime Environmentを使用しても動作するでしょう。
</p>
<br /><a name="installing"></a>
<h2>ソフトウェアのインストール</h2>
<p>
ソフトウェアをインストールするために、インストーラーを実行するか 選択したディレクトリにソフトウェアを解凍します。
</p>
<br /><a name="directory_structure"></a>
<h2>ディレクトリ構成</h2>
<p>
インストール後、下記のディレクトリ構成が作られます:
</p>
<table>
<tr>
<th>ディレクトリ</th>
<th>コンテンツ</th>
</tr>
<tr>
<td>bin</td>
<td>JAR and batch files</td>
</tr>
<tr>
<td>docs</td>
<td>Documentation</td>
</tr>
<tr>
<td>docs/html</td>
<td>HTML pages</td>
</tr>
<tr>
<td>docs/javadoc</td>
<td>Javadoc files</td>
</tr>
<tr>
<td>odbc</td>
<td>ODBC drivers and tools</td>
</tr>
<tr>
<td>service</td>
<td>Tools to run the database as a Windows Service</td>
</tr>
<tr>
<td>src</td>
<td>Source files</td>
</tr>
</table>
</div></td></tr></table></body></html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- Copyright 2004-2007 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html). -->
<html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" /><title>
H2 データベース エンジン
</title><link rel="stylesheet" type="text/css" href="stylesheet.css" />
<link rel="alternate" type="application/atom+xml" title="H2 Newsfeed" href="http://www.h2database.com/html/newsfeed-atom.xml" />
<link rel="alternate" type="application/rss+xml" title="H2 Newsfeed" href="http://www.h2database.com/html/newsfeed-rss.xml" />
<script type="text/javascript" src="navigation.js"></script>
<style type="text/css">
<!--
h3 { margin-top: 0px; margin-bottom: 10px; }
-->
</style>
</head><body onload="frameMe();">
<table class="content"><tr class="content"><td class="content"><div class="contentDiv">
<h1>H2 データベース エンジン</h1>
<p>
ようこそ、無料のSQLデータベース、H2へ。H2の主な特徴は:
</p>
<ul>
<li>速度がとても速く、全ての方が無料で使用でき、ソースコードが含まれています
</li><li>Javaで書かれています; GCJ (Linux) でコンパイル可能
</li><li>エンベッド、サーバー、クラスターモードに対応
</li><li>JDBC、 (部分的な) ODBC API; Web クライアントアプリケーション
</li></ul>
<table style="border: 0px; width: 395px;">
<tr><td style="background-color: #eee;">
<table style="border: 0px; margin: 5px; background-color: #eee;">
<tr><td style="border: 0px; background-color: #eee;" colspan="2">
<h3>ダウンロード</h3>
Version 1.0 / 2007-08-02:
</td></tr>
<tr><td style="border: 0px; background-color: #eee;">
<a href="http://www.h2database.com/h2-setup-2007-08-02.exe"><img border="1" src="images/download.png" alt="download" /></a>
</td><td style="vertical-align: middle; border: 0px; background-color: #eee;">
<a href="http://www.h2database.com/h2-setup-2007-08-02.exe">Windows Installer (2.7 MB)</a>
</td></tr>
<tr><td style="border: 0px; background-color: #eee;">
<a href="http://www.h2database.com/h2-2007-08-02.zip"><img border="1" src="images/download.png" alt="download" /></a>
</td><td style="vertical-align: middle; border: 0px; background-color: #eee;">
<a href="http://www.h2database.com/h2-2007-08-02.zip">All platforms (zip, 3.7 MB)</a>
</td></tr>
<tr><td style="border: 0px; background-color: #eee;" colspan="2">
<a href="download.html">全てダウンロード</a>
</td></tr>
</table>
</td><td style="border: 0px;">&nbsp;&nbsp;&nbsp;</td>
<td style="background-color: #eee;">
<table style="border: 0px; margin: 5px;">
<tr><td style="border: 0px; background-color: #eee;">
<h3>サポート</h3>
<p>
<a href="http://groups.google.com/group/h2-database" target="_top">Google グループ: ヘルプとディスカッション</a><br /><br />
e-mail はこちらから:<br />
<script type="text/javascript">
<!--
var a = '-support.png';
var b = 'mail';
var c = 'support ';
var d = 'db';
var e = 'at ';
var f = '.com';
var g = 'h2database';
var alt = 'mail address: ' + d + c + e + g + f + '(without spaces)';
document.write('<' + 'a h'+'ref="em' + 'ail:' + d + c + e + g + f +'">' + d + c + e + g + f);
//-->
</script>
</p>
</td></tr>
</table>
</td></tr>
<tr><td colspan="3" style="border: 0px">&nbsp;</td></tr>
<tr><td colspan="3" style="border: 0px">
<table style="border: 0px; margin: 5px; width: 100%;">
<tr><td style="border: 0px;" >
<h3>パフォーマンス</h3>
<img border="0" src="images/performance.png" alt="Performance comparison" /><br />
操作/秒 (高い方がより良い) - <a href="performance.html">このテストについての詳しい情報</a>
</td></tr>
</table>
</td></tr>
<tr><td colspan="3" style="border: 0px">&nbsp;</td></tr>
<tr><td colspan="3" style="background-color: #eee;">
<table style="border: 0px; margin: 5px; background-color: #eee;">
<tr><td style="border: 0px; background-color: #eee;">
<h3>ニュース</h3>
<p>
<b>ニュースフィード:</b> 二種類から選べます:
<a href="http://www.h2database.com/html/newsfeed-atom.xml" target="_blank">フルテキスト (Atom)</a>
または <a href="http://www.h2database.com/html/newsfeed-rss.xml" target="_blank">ヘッダーのみ (RSS)</a>.
</p>
<form name="newsletter" method="post" action="php/newsletter.php">
<b>Email ニュースレター:</b>
<a href="http://groups.google.com/group/h2database-news/subscribe">
H2 データベース ニュース (Googleアカウントが必要です)</a>
に署名し、ニューリリースについての情報を入手して下さい。
あなたのemailアドレスはこのコンテンツでのみ使用されます。
もしGoogleアカウントを入手したくないのであれば、 こちらのリストに入力して下さい: <br />
Email: <input type="text" name="email" size="30"/>
<input type="hidden" name="text" value="subscribe"/>
<input type="submit" value="Submit"/>
</form>
</td></tr>
</table>
</td></tr>
<tr><td colspan="3" style="border: 0px">&nbsp;</td></tr>
<tr><td colspan="3" style="background-color: #eee;">
<table style="border: 0px; margin: 5px;">
<tr><td style="border: 0px; background-color: #eee;">
<h3>寄稿する</h3>
<p>
H2の発展のため、フィードバックやバグ報告を送ったり、H2コンソールアプリケーション
(ファイル h2/src/main/org/h2/server/web/res/_text_*.properties)を訳すなど、
投稿することができます。また、下にある PayPal ボタンをクリックすることで
寄付することもできます。 支援者として、あなたの名前が載ります:
</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
<input type="hidden" name="cmd" value="_s-xclick"/>
<input type="image" src="https://www.paypal.com/en_US/i/btn/x-click-but04.gif" border="0" name="submit" alt="PayPal"/>
<img alt="" border="0" src="https://www.paypal.com/de_DE/i/scr/pixel.gif" width="1" height="1" />
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----MIIHNwYJKoZIhvcNAQcEoIIHKDCCByQCAQExggEwMIIBLAIBADCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJKoZIhvcNAQEBBQAEgYBT5YHCnqqyWDNUoD0DGudVB/0gMr1D2iOAKr/X+zR9VGBMeZsBtgmJphsbszGxXXEGxwzIVAv/ys+8TKW/uvk9UvZcDqFbCvupXmVIv3dp143N1xHsyLQGGHd8aFNraqCF7fdFoQ8GHzwvNw0VaPbGqU6udswpKz/225zBkMCjTjELMAkGBSsOAwIaBQAwgbQGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIvFAVO1Ru/gCAgZCWN/nYxfM8UtcqFy4Z+KefQIgmUISauadMhddUvvkARcSyEOITMCoEkJCc0KC+2mp9noBz2VhDO7uxNIjdj4O74V4iNcRsSy2d7CJe4QEBw2PCrnw2GsLkcL0DDfCE4Y0KfF6zHyUq/GNGUVR8ZhrFTSSLjh4tJJzuLYBPIbWHv89K1OJsWGuHs8dB5zGcbQ6gggOHMIIDgzCCAuygAwIBAgIBADANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wHhcNMDQwMjEzMTAxMzE1WhcNMzUwMjEzMTAxMzE1WjCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMFHTt38RMxLXJyO2SmS+Ndl72T7oKJ4u4uw+6awntALWh03PewmIJuzbALScsTS4sZoS1fKciBGoh11gIfHzylvkdNe/hJl66/RGqrj5rFb08sAABNTzDTiqqNpJeBsYs/c2aiGozptX2RlnBktH+SUNpAajW724Nv2Wvhif6sFAgMBAAGjge4wgeswHQYDVR0OBBYEFJaffLvGbxe9WT9S1wob7BDWZJRrMIG7BgNVHSMEgbMwgbCAFJaffLvGbxe9WT9S1wob7BDWZJRroYGUpIGRMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbYIBADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAIFfOlaagFrl71+jq6OKidbWFSE+Q4FqROvdgIONth+8kSK//Y/4ihuE4Ymvzn5ceE3S/iBSQQMjyvb+s2TWbQYDwcp129OPIbD9epdr4tJOUNiSojw7BHwYRiPh58S1xGlFgHFXwrEBb3dgNbMUa+u4qectsMAXpVHnD9wIyfmHMYIBmjCCAZYCAQEwgZQwgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tAgEAMAkGBSsOAwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0wNzAxMDcxMTI5MzFaMCMGCSqGSIb3DQEJBDEWBBRCGFuirr8xc1NmatO8jdDYt93luzANBgkqhkiG9w0BAQEFAASBgLJMfUrlr/Ckx/peA6UOkMqsB20W7M9FC4dYaGrlhSf0Og2N3NVlBrliloxGq85KpLnwJsKsh1wbP2aMGHvbicpCOsRoogPVvFI0cLb2UfPFkT0fRuEKerxcVVZQq26WjMq3h/Gps5tQEBGEB5Ok9IGP/dusNA+YijCt5XA/WM47-----END PKCS7-----"/>
</form>
</td></tr>
</table>
</td></tr>
<tr><td colspan="3" style="border: 0px">&nbsp;</td></tr>
<tr><td colspan="3" style="background-color: #eee;">
<table style="border: 0px; margin: 5px;">
<tr><td style="border: 0px; background-color: #eee;">
<h3>フィードバック</h3>
質問や要望、その他あらゆるフィードバックはこちらから送信して下さい:
<form method="post" action="php/sendMail.php">
<p>
Email (任意):<br />
<input name="email" size="73" type="text"/>
</p>
メッセージ:<br />
<textarea name="text" cols="70" rows="5"></textarea>
<br />
<input value="Submit" type="submit"/>
</form>
</td></tr>
</table>
</td></tr>
</table>
</div></td></tr></table></body></html>
\ No newline at end of file
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Copyright 2004-2007 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
Initial Developer: H2 Group
-->
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" /><title>
H2 Database Engine
</title><link rel="stylesheet" type="text/css" href="stylesheet.css" />
<script type="text/javascript" src="navigation.js"></script>
</head><body onload="frameMe();">
<table class="content"><tr class="content"><td class="content"><div class="contentDiv">
<h1>H2 データベース エンジン</h1>
<p>
ようこそ、無料のSQLデータベース、H2へ
</p>
<br />
<p>
<a href="quickstartText_ja.html" style="font-size: 16px; font-weight: bold">クイックスタート</a>
<br />
Click here to get a fast overview.
</p>
<p>
<a href="tutorial_ja.html" style="font-size: 16px; font-weight: bold">チュートリアル</a>
<br />
Go through the samples.
</p>
<p>
<a href="features.html" style="font-size: 16px; font-weight: bold">特徴</a>
<br />
See what this database can do and how to use these features.
</p>
</div></td></tr></table></body></html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Copyright 2004-2007 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
Initial Developer: H2 Group
-->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="ja">
<head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" /><title>
Quickstart
</title><link rel="stylesheet" type="text/css" href="stylesheet.css" />
<script type="text/javascript" src="navigation.js"></script>
</head><body onload="frameMe();">
<table class="content"><tr class="content"><td class="content"><div class="contentDiv">
<h1>クイックスタート</h1>
<a href="#embedding">
Embedding H2 in an Application</a><br />
<a href="#h2_console">
H2 コンソール アプリケーション</a><br />
<br /><a name="embedding"></a>
<h2>Embedding H2 in an Application</h2>
<p>
This database can be used in embedded mode, or in server mode. To use it in embedded mode, you need to:
</p>
<ul>
<li>Add <code>h2.jar</code> to the classpath
</li><li>Use the JDBC driver class: <code>org.h2.Driver</code>
</li><li>The database URL <code>jdbc:h2:~/test</code> opens the database 'test' in your user home directory
</li></ul>
<br /><a name="h2_console"></a>
<h2>H2 コンソール アプリケーション</h2>
<p>
このコンソールはブラウザインターフェースを使ってSQL データベースにアクセスします。
<br />
<img src="images/console.png" alt="Web Browser - H2 Console Server - H2 Database" />
<br />
Windows XPをご使用でなかったり、 期待通りに機能しない場合は、 <a href="tutorial.html">チュートリアル</a> 内の 詳細説明をご覧下さい。
</p>
<h3>手順</h3>
<h4>インストール</h4>
<p>
Windows インストーラーを使用してソフトウェアをインストールしましょう (まだインストールされていない場合)。
</p>
<h4>コンソールを起動する</h4>
<p>
<span class="button">スタート</span>
<span class="button">すべてのプログラム</span>
<span class="button">H2</span>
<span class="button">H2 Console (Command Line)</span>をクリックします:<br />
<img class="screenshot" src="images/quickstart-1.png" alt="screenshot: start H2 Console" /><br />
コンソールウィンドウが 開きます:<br />
<img class="screenshot" src="images/quickstart-2.png" alt="screenshot: H2 Running" /><br />
新しいブラウザで URL http://localhost:8082/ にアクセスして下さい。 ファイアーウォールによるセキュリティ警告を設定することができます。
外部ネットワークから あなたのマシンのデータベースにアクセスされたくないのであれば、ファイアーウォールが他の接続を遮断します。 ローカル接続のみ必要です。
</p>
<h4>ログイン</h4>
<p>
<span class="button">Generic H2</span>を選び、<span class="button">Connect</span>をクリックします:<br />
<img class="screenshot" src="images/quickstart-3.png" alt="screenshot: Login screen" /><br />
ログインされました。
</p>
<h4>サンプル</h4>
<p>
<span class="button">Sample SQL Script</span>をクリックします。: <br />
<img class="screenshot" src="images/quickstart-4.png" alt="screenshot: click on the sample SQL script" /><br />
SQLコマンドがコマンドエリアに表示されます。<br />
</p>
<h4>実行する</h4>
<p>
<span class="button">Run</span>をクリックします:<br />
<img class="screenshot" src="images/quickstart-5.png" alt="screenshot: click Run" /><br />
左側のデータベースアイコンの下に、 新しいテーブル TEST が追加されます。動作とステートメントの結果は、スクリプトの下に表示されます。<br />
<img class="screenshot" src="images/quickstart-6.png" alt="screenshot: see the result" /><br />
</p>
<h4>切断</h4>
<p>
<span class="button">Disconnect</span>をクリックします:<br />
<img src="images/icon_disconnect.gif" alt="Disconnect icon" /><br />
データベースを閉じます。
</p>
<h4>終了</h4>
<p>
コンソールウィンドウを閉じます。詳細は<a href="tutorial.html">チュートリアル</a>をご覧下さい。
</p>
</div></td></tr></table></body></html>
...@@ -44,7 +44,6 @@ Initial Developer: H2 Group ...@@ -44,7 +44,6 @@ Initial Developer: H2 Group
<tr class="search"> <tr class="search">
<td class="search" colspan="2"> <td class="search" colspan="2">
<table id="result" style="border: 0px;"> <table id="result" style="border: 0px;">
<tr><td /></tr>
</table> </table>
</td> </td>
</tr> </tr>
......
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Copyright 2004-2007 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
Initial Developer: H2 Group
-->
<html><head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Search</title>
<link rel="stylesheet" type="text/css" href="stylesheet.css" />
<script type="text/javascript" src="index.js"></script>
<script type="text/javascript" src="search.js"></script>
<script type="text/javascript" src="navigation.js"></script>
</head>
<body style="margin: 10px 0px 0px 0px;" onload="frameMe('menu');">
<div class="menu">
<img border="0" src="images/h2-logo.png" alt="H2 Logo" onclick="document.location='main.html'" />
</div>
<form name="searchForm" action="submit" onsubmit="return goFirst();">
<table width="100%" class="search">
<tr class="search">
<td class="search" colspan="2">
<a href="frame.html" target="_top"><img border="0" src="images/language_en.gif" alt="English" /></a>
<a href="frame_ja.html" target="_top"><img border="0" src="images/language_ja.gif" alt="Japanese" /></a>
</td>
</tr>
<tr class="search">
<td class="search" colspan="2">
<b>検索:</b>
</td>
</tr>
<tr class="search">
<td class="search" colspan="2">
<input id="search" name="search" type="text" size="21" maxlength="100" onKeyup="listWords(this.value, '')" /><br />
<input type="reset" id="clear" style="display:none;" value="Clear" onclick="listWords('', '');" />
</td>
</tr>
<tr class="search" style="display:none;" >
<td width="1%" class="search" style="vertical-align: middle;"><input id="highlight" type="checkbox" checked="checked" onclick="highlightCurrent(this.checked, search.value)" /></td>
<td width="99%" class="search" style="padding: 0px; vertical-align: middle;">Highlight keyword(s)</td>
</tr>
<tr class="search">
<td class="search" colspan="2">
<table id="result" style="border: 0px;">
</table>
</td>
</tr>
</table>
</form>
<div class="menu">
<b><a href="main_ja.html" target="main">ホーム</a></b><br />
<a href="quickstartText_ja.html" target="main">クイックスタート</a><br />
<a href="installation_ja.html" target="main">インストール</a><br />
<a href="tutorial_ja.html" target="main">チュートリアル</a><br />
<a href="features.html" target="main">特徴</a><br />
<a href="performance.html" target="main">パフォーマンス</a><br />
<a href="advanced.html" target="main">Advanced Topics</a><br />
<br />
<b>参照</b><br />
<a href="grammar.html" target="main">SQL文</a><br />
<a href="functions.html" target="main">関数</a><br />
<a href="datatypes.html" target="main">データ型</a><br />
<a href="../javadoc/index.html" target="main">Javadoc JDBC API</a><br />
<a href="../h2.pdf" target="_blank">PDFドキュメント</a><br />
<br />
<b>付録</b><br />
<a href="build.html" target="main">構築</a><br />
<a href="history.html" target="main">歴史とロードマップ</a><br />
<a href="faq.html" target="main">Q&A</a><br />
<a href="license.html" target="main">ライセンス</a><br />
<br />
</div>
</body></html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Copyright 2004-2007 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
Initial Developer: H2 Group
-->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="ja">
<head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" /><title>
Tutorial
</title><link rel="stylesheet" type="text/css" href="stylesheet.css" />
<script type="text/javascript" src="navigation.js"></script>
</head><body onload="frameMe();">
<table class="content"><tr class="content"><td class="content"><div class="contentDiv">
<h1>チュートリアル</h1>
<a href="#tutorial_starting_h2_console">
起動とH2コンソールの使用</a><br />
<a href="#connecting_using_jdbc">
JDBCを使用してデータベースに接続 </a><br />
<a href="#creating_new_databases">
新しいデータベースを作成する </a><br />
<a href="#using_server">
サーバーを使用する </a><br />
<a href="#using_hibernate">
Hibernateを使用する </a><br />
<a href="#web_applications">
Webアプリケーションで データベースを使用する</a><br />
<a href="#csv">
CSV (Comma Separated Values) サポート</a><br />
<a href="#upgrade_backup_restore">
アップグレード、 バックアップ、修復</a><br />
<a href="#open_office">
OpenOffice Baseを使用する</a><br />
<a href="#web_start">
Java Web Start / JNLP</a><br />
<br /><a name="tutorial_starting_h2_console"></a>
<h2>起動とH2コンソールの使用</h2>
<p>
このアプリケーションはブラウザインターフェースを使ってSQLデータベースにアクセスします。 これは、H2データベース、またはJDBC APIをサポートする別のデータベースであるかもしれません。
</p>
<img src="images/console.png" alt="Web Browser - H2 Console Server - H2 Database" />
<p>
これはクライアント / サーバーアプリケーションで、サーバーとクライアントの両方実行されることが必要です。
</p><p>
プラットフォームと環境によって、アプリケーションの起動方法が多数あります:
</p>
<table><tr><th>OS</th><th>起動</th></tr>
<tr>
<td>Windows</td>
<td>
[スタート]、 [すべてのプログラム]、 [H2]、 [H2 Console]をクリックします<br />
正しく動作したら、 システムトレイにアイコンが追加されます:
<img src="images/h2.png" alt="[H2 icon]" /><br />
システムトレイアイコンが表示されなかったら、 Javaが正しくインストールされていないのかもしれません。
(この場合は、 他のアプリケーション起動方法を試して下さい) ブラウザウィンドウが開き、ログインページが表示されます。 (URL: http://localhost:8082/)
</td>
</tr>
<tr>
<td>Windows</td>
<td>
ファイルブラウザを開き、h2/binフォルダまで進み、h2.batをダブルクリックします。
正しく動作したら、システムトレイにアイコンが追加されます。 問題があれば、コンソールウィンドウにエラーメッセージが表示されます。 ブラウザウィンドウが開き、ログインページが表示されます。 (URL: http://localhost:8082/)
</td>
</tr>
<tr>
<td>Any</td>
<td>
コンソールウィンドウを開き、'h2/lib'ディレクトリまで進み、下記を実行します:
<pre>
java -cp h2.jar org.h2.tools.Server
</pre>
</td>
</tr>
</table>
<h3>ファイアウォール</h3>
<p>
サーバーを起動させたら、ファイアウォールによるセキュリティ警告を受けるでしょう (1度インストールした場合)。外部ネットワークから あなたのマシンのデータベースにアクセスされたくないのであれば、 ファイアーウォールが他の接続を遮断します。ローカルマシンからの接続はまだつながっています。 他のコンピュータから、このコンピューターのデータベースにアクセスしたい場合のみ、 ファイアウォールでリモート接続を許可する必要があります。
</p><p>
小さなファイアーウォールはすでにサーバーに組み込まれています。 デフォルトによるこの構造は、他のコンピューターがサーバーにアクセスすることを許可していません。 これは、好きなように変更することができます (他のコンピューターからの接続を許可します)。
</p>
<h3>ネイティブ バージョン</h3>
<p>
ネイティブ バージョンはJavaを必要としていません。なぜなら、 これはGCJを使用してコンパイルされるからです。しかし、H2は現在、Windows上のGCJプロジェクトでは実行されません。 異なったプラットフォームでソフトウェアをコンパイルすることが可能です。
</p>
<h3>Javaをテストする</h3>
<p>
インストールしたJavaのバージョンを調べるためには、 コマンドプロンプトを開き、 下記を入力します:
<pre>
java -version
</pre>
もしエラーメッセージが表示されたら、Javaのバイナリディレクトリを環境変数のPathに追加します。
</p>
<h3>エラーメッセージ 'Port is in use'</h3>
<p>
ひとつのH2コンソールのみ起動することができます。 そうでなければ、次のようなエラーメッセージが表示されます:
<code>Port is in use, maybe another ... server already running on...</code>
複数のコンソールアプリケーションを同じコンピューターで起動することは可能です (異なったポートを使用します)、しかし、コンソールが複数の同時接続を維持するということは、普通は必要とされていません。
</p>
<h3>他のポートを使用する</h3>
<p>
もしポートが他のアプリケーションによって使用されている場合は、H2コンソールを 異なったポートで起動したいはずです。これは、.h2.server.properties.ファイル内のポートを変更することにより実行できます。 このファイルはユーザディレクトリ内に格納されています (Windowsでは通常、"Documents and Settings/&lt;ユーザ名&gt;")。関連する項目はwebPortです。
</p>
<h3>起動成功</h3>
<p>
コンソールウィンドウからのサーバー起動が成功したら、新しいウィンドウが開き、 下記のように表示されます:
<pre>
H2 Server running on port 9092
Webserver running on https://localhost:8082/
</pre>
ウィンドウ内をクリックしないで下さい; アプリケーションが遮断されてしまいます (Fast-Edit モードが有効の場合)。
</p>
<h3>ブラウザを使用してサーバーに接続</h3>
<p>
サーバーの接続に成功したら、webブラウザを使用してサーバーに接続することができます。 ブラウザにはJavaScript、フレーム、カスケードスタイルシート (css)のサポートが必要です。 もし同じコンピューターのブラウザでサーバーを起動したら、 http://localhost:8082 へアクセスしてください。他のコンピューターからアプリケーションに接続したい場合は、 サーバーのIPアドレスを用意することが必要です。 例: http://192.168.0.2:8082 サーバー側でSSLを使用したい場合は、URLをHTTPSから始めます。
</p>
<h3>複数の同時セッション</h3>
<p>
複数の同時ブラウザセッションがサポートされています。 データベースオブジェクトはサーバーに属しているため、同時接続の数はサーバーアプリケーションの利用可能メモリによって制限されています。
</p>
<h3>アプリケーションプロパティ</h3>
<p>
サーバーを起動するとローカルのホームディレクトリに .h2.server.properties と呼ばれるファイル構成が作成されます。Windowsのインストールでは、このファイルは will be in the directory C:\Documents and Settings\[ユーザ名]のディレクトリ内にあります。このファイルはアプリケーションのセッティングに含まれています。
</p>
<h3>ログイン</h3>
<p>
ログインページでは、データベースに接続するための接続情報を設定する必要があります。 JDBCドライバをデータベースのクラスに設定し、JDBCのURL、ユーザ名とパスワードを入力します。 完了したら [Connect] をクリックします。
</p><p>
保存された設定をあらかじめ保存し、再び使用することができます。設定はアプリケーションプロパティファイルに記憶されます。
</p>
<h3>エラーメッセージ</h3>
<p>
エラーメッセージは赤で表示されます。 メッセージをクリックすることによって、例外の記録の表示、非表示を切り替えることができます。
</p>
<h3>データベースドライバの追加</h3>
<p>
H2DRIVERSかCLASSPATHの環境変数に、ドライバのJarファイルの位置を追加することにより、データベースドライバの追加を行うことができます。 例 (Windowsの場合): データベースドライバのライブラリに C:\Programs\hsqldb\lib\hsqldb.jar を追加し、H2DRIVERSの環境変数に C:\Programs\hsqldb\lib\hsqldb.jar を設定します。
</p><p>
複数のドライバを設定することも可能です; それぞれのパスは ';' (Windows) や ':' (他のOS) で区切ります。 パス名内のスペースは有効です。設定は引用されません。
</p><p>
ドライバの追加はJavaバージョンのみでサポートされています (この特徴はネイティブバージョンではサポートされていません)。
</p>
<h3>アプリケーションを使用する</h3>
<p>
アプリケーションは3つのメインパネルを保持しています。上部のツールバー、左側のツリーとクエリ、右側の結果表示パネルです。 データベースオブジェクト (例; テーブル) は左側のパネルに一覧表示されます。クエリパネルにSQLコマンドを打ち、 'Run' をクリックします。 コマンドの結果は、コマンドのすぐ下に表示されます。
</p>
<h3>テーブル名、またはカラム名をインサートする</h3>
<p>
テーブル名やカラム名は、ツリー内のテーブル名、カラム名をクリックすることによって スクリプトにインサートすることができます。クエリが空の時にテーブルをクリックすると、 'SELECT * FROM ...' も同様に追加されます。 クエリを入力している間、使用されているテーブルはツリー内で自動的に拡張されます。例えば、 'SELECT * FROM TEST T WHERE T.' と入力すると、ツリー内のTESTテーブルは自動的に拡張されます。
</p>
<h3>切断とアプリケーションの終了</h3>
<p>
ブラウザでは、ツールバーパネルの 'Disconnect' をクリックします。データベースからログアウトします。しかし、サーバーはまだ接続されていて、 新しいセッションを受け入れる準備をしています。
</p><p>
サーバーを止めるためには、システムトレイアイコンを右クリックし、 [Exit] を選択します。もしアイコンが表示されていないのであれば、 (別の方法で実行した場合) サーバーが実行されたコンソール上で [Ctrl]+[C] を押すか (Windowsの場合)、 コンソールウィンドウを閉じます。
</p>
<br /><a name="connecting_using_jdbc"></a>
<h2>JDBCを使用してデータベースに接続</h2>
<p>
データベースに接続するためにJavaアプリケーションに最初に必要なことは、 データベースドライバをロードし、接続することです。簡単な方法は、次のコードを使用します:
<pre>
import java.sql.*;
public class Test {
public static void main(String[] a)
throws Exception {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.
getConnection("jdbc:h2:~/test", "sa", "");
// add application code here
}
}
</pre>
このコードは最初にドライバをロードして (Class.forName())、 接続を開始します (DriverManager.getConnection())。 このドライバの名前は全てのケースにおいて "org.h2.Driver" です。 データベースに認識されるため、データベースのURLは常に jdbc:h2: から始まります。 getConnection() 内の2番目のパラメーターはユーザ名を指しています ('sa' はこの場合、システム管理者を表しています)。3番目のパラメーターはパスワードです。 このデータベースでは、ユーザ名は大文字と小文字を区別していませんが、パスワードは大文字と小文字を区別しています。
</p>
<br /><a name="creating_new_databases"></a>
<h2>新しいデータベースを作成する</h2>
<p>
初期設定では、データベースの指定されたURLがまだ存在しない場合、自動的に新しい (空の) データベースが作られます。
</p>
<br /><a name="using_server"></a>
<h2>サーバーを使用する</h2>
<p>
H2は現在、3つのサーバーをサポートしています: Webサーバー、TCPサーバー、ODBCサーバーです。 これらのサーバーは異なった方法で起動します。
</p>
<h3>コマンドラインから起動する</h3>
<p>
初期設定でコマンドラインからサーバーを起動させるには、次のように実行します。
<pre>
java org.h2.tools.Server
</pre>
サーバーはデフォルトオプションで起動します。オプションの一覧を取得するには、次のように実行します。
<pre>
java org.h2.tools.Server -?
</pre>
異なったポートの使用が可能なオプションや、サーバーの一部を起動、終了させるオプションなどがあります。 詳細はサーバーツールのAPIドキュメントをご覧下さい。
</p>
<h3>Connecting to the TCP Server</h3>
<p>
To remotly connect to a database using the TCP server, use the following driver and database URL:
</p>
<ul>
<li>JDBC driver class: org.h2.Driver
</li><li>Database URL: jdbc:h2:tcp://localhost/~/test
</li></ul>
<p>
For details about the database URL, see also in Features.
</p>
<h3>アプリケーション内で起動する</h3>
<p>
アプリケーション内からサーバーを起動、終了することも可能です。 以下はサンプルコードです:
<pre>
import org.h2.tools.Server;
...
// start the TCP Server
Server server = Server.createTcpServer(args).start();
...
// stop the TCP Server
server.stop();
</pre>
</p>
<h3>他の過程からTCPサーバーを終了する</h3>
<p>
TCPサーバーは他の過程から終了することができます。 コマンドラインからサーバーを終了するには、次のように実行します:
<pre>
java org.h2.tools.Server -tcpShutdown tcp://localhost:9092
</pre>
ユーザアプリケーションからサーバーを終了するには、次のコードを使用します:
<pre>
org.h2.tools.Server.shutdownTcpServer("tcp://localhost:9094");
</pre>
この機能はサーバー上の System.exit を呼んでいます。この機能は、データベースが次回起動された時のリカバリーを回避するため、 データベースへの全ての接続が切断された後に呼ばれます。リモートサーバーを終了するには、サーバー上でリモート接続が可能である必要があります。
</p>
<h3>サーバーの制限</h3>
<p>
現在、サーバーやクラスターモードを使用する時にいくつかの制限があります:
</p>
<ul>
<li>Statement.cancel() はエンベッドモードのみサポートされています。接続はサーバー、またはクラスターモードで1度にひとつのオペレーションで実行され、 このオペレーションが終了するまで接続は遮断されます。
</li></ul>
<br /><a name="using_hibernate"></a>
<h2>Hibernateを使用する</h2>
<p>
このデータベースはHibernate version 3.1 と以降の新しいバージョンをサポートしています。 HSQLDB Dialect、または H2 Dialectは src/tools/org/h2/tools/hibernate/H2Dialect.txt ファイル内で使用可能です。 H2 dialectは Hibernateのより新しいバージョンに含まれています。H2 dialectが含まれていないバージョンでは、 src\org\hibernate\dialect (Hibernate 3.1の場合) フォルダ内のファイルをコピーし、 H2Dialect.java にファイル名を変更し、 Hibernateを再びコンパイルします。
</p>
<br /><a name="web_applications"></a>
<h2>Webアプリケーションでデータベースを使用する</h2>
<p>
Webアプリケーション内からデータベースに接続するには様々な方法があります。 以下はTomcatかJBossを使用の場合のいくつかの例です。
</p>
<h3>エンベッドモード</h3>
<p>
(現在)最も簡単なソリューションはエンベッドモードでデータベースを使用することです。 それは、アプリケーションが起動する時や (良いソリューションは Servletリスナーを使用します。下記参照)、 セッションが起動する時、アプリケーションにおける接続が開始するということを意味します。 データベースは、セッションやアプリケーションが同じ過程で実行している限り、 多様なセッションやアプリケーションから同時に接続されることが可能です。 多くのServletコンテナは (例; Tomcat) ただひとつのプロセスで利用されるので、問題はありません。 (Tomcatをクラスターモードで起動している場合を除いて)。 Tomcatはマルチスレッドとマルチクラスローダーを使用しています。 もし複数のアプリケーションが同じデータベースに同時にアクセスする場合、データベースjarをshared/lib、またはserver/libディレクトリに置く必要があります。 webアプリケーションが起動した時にデータベースを開き、webアプリケーションが終了した時にデータベースを閉じるのが良い方法です。 もし複数のアプリケーションを使用する場合、そのうちひとつのアプリケーションをこのように動作することが必要です。 アプリケーションでは、セッションごとにひとつの接続を使うか、リクエスト(アクション)ごとにひとつの接続を使うという概念があります。 これらの接続はできる限り、使用後に終了させます(しかし、終了させなくても悪くはありません)。
</p>
<h3>サーバーモード</h3>
<p>
サーバーモードは類似していますが、他のプロセスでサーバーを起動させることを許可しています。
</p>
<h3>データベースの起動と終了にServletリスナーを使用する</h3>
<p>
以下を web.xmlファイルに追記して下さい。 (context-paramとfilterの間):
<pre>
&lt;listener>
&lt;listener-class>org.h2.server.web.DbStarter&lt;/listener-class>
&lt;/listener>
</pre>
For details on how to access the database, see the code DbStarter.java
</p>
<br /><a name="csv"></a>
<h2>CSV (Comma Separated Values) サポート</h2>
<p>
データベースにCSVREADとCSVWRITEの関数を使用することで、 CSVファイルサポートを使用することができ、スタンドアロンツールとしてデータベースの外でCSVライブラリを使用することができます。
</p>
<h3>データベース内からCSVファイルに書き込む</h3>
<p>
クエリからCSVファイルを作成するのに、組込み関数 CSVWRITEを使用することができます。例:
<pre>
CREATE TABLE TEST(ID INT, NAME VARCHAR);
INSERT INTO TEST VALUES(1, 'Hello'), (2, 'World');
CALL CSVWRITE('test.csv', 'SELECT * FROM TEST');
</pre>
</p>
<h3>データベース内からCSVファイルを読み込む</h3>
<p>
CSVREAD関数を使用してCSVファイルを読み込むことができます。 例:
<pre>
SELECT * FROM CSVREAD('test.csv');
</pre>
</p>
<h3>JavaアプリケーションからCSVファイルに書き込む</h3>
<p>
データベースを全く使用しなくても、JavaアプリケーションでCSVツールを使用することができます。 例:
<pre>
SimpleResultSet rs = new SimpleResultSet();
rs.addColumn("NAME", Types.VARCHAR, 255, 0);
rs.addColumn("EMAIL", Types.VARCHAR, 255, 0);
rs.addColumn("PHONE", Types.VARCHAR, 255, 0);
rs.addRow(new String[]{"Bob Meier", "bob.meier@abcde.abc", "+41123456789"});
rs.addRow(new String[]{"John Jones", "john.jones@abcde.abc", "+41976543210"});
Csv.write("test.csv", rs, null);
</pre>
</p>
<h3>JavaアプリケーションからCSVファイルを読み込む</h3>
<p>
データベースを開かなくてもCSVファイルを読み込むことができます。 例:
<pre>
ResultSet rs = Csv.read("test.csv", null, null);
ResultSetMetaData meta = rs.getMetaData();
while(rs.next()) {
for(int i=0; i&lt;meta.getColumnCount(); i++) {
System.out.println(meta.getColumnLabel(i+1) + ": " + rs.getString(i+1));
}
System.out.println();
}
rs.close();
</pre>
</p>
<br /><a name="upgrade_backup_restore"></a>
<h2>アップグレード、バックアップ、修復</h2>
<h3>データベースのアップグレー</h3>
<p>
あるバージョンのデータベースエンジンを次のバージョンにアップグレードする際の推奨する方法は、 古いエンジンを使って(SQLスクリプトのフォームでの)データベースのバックアップを作成し、新しいエンジンを使ってSQLスクリプトを実行します。
</p>
<h3>バックアップ</h3>
<p>
異なった方法のデータベースのバックアップがあります。例えば、データベースファイルをコピーすることが可能です。 しかしながら、この方法はデータベースが使用されている間は推奨しません。データベースは人が判読しやすく、極めて大きいというわけではありません。 データベースバックアップの推奨する方法は、圧縮したSQLスクリプトを作成することです。この方法は、バックアップツールを使用することで可能です:
<pre>
java org.h2.tools.Script -url jdbc:h2:~/test -user sa -script test.zip -options compression zip
</pre>
オプションについての情報は、SQLコマンドスクリプトをご覧下さい。バックアップは遠隔で行えますが、ファイルはサーバー側に作られます。 サーバーからファイルを取るのに、ビルトインFTPサーバーを使用することができます。データベースのバックアップを作るのに、SQLコマンドスクリプトを 使用することもできます。
</p>
<h3>修復</h3>
<p>
SQLスクリプトファイルからデータベースを修復するには、RunScriptツールを使用する必要があります:
<pre>
java org.h2.tools.RunScript -url jdbc:h2:~/test -user sa -script test.zip -options compression zip
</pre>
オプションについての情報は、SQLコマンド RUNSCRIPTをご覧下さい。修復は遠隔で行えますが、サーバー側にファイルが存在する必要があります。 サーバーからファイルをコピーするのに、ビルトインFTPサーバーを使用することができます。SQLスクリプトを実行するために、 SQLコマンド RUNSCRIPTを使用することができます。SQLスクリプトファイルには、RUNSCRIPTコマンドのフォーム内に他のスクリプトファイルのリファレンスが含まれています。 しかしながら、サーバーモードを使用している時、リファレンススクリプトファイルはサーバー側で利用可能であることが必要です。
</p>
<h3>Online Backup</h3>
<p>
The BACKUP SQL statement and the Backup tool both create a zip file
with all database files. However, the contents of this file are not human readable.
Other than the SCRIPT statement, the BACKUP statement does not lock the
database objects, and therefore does not block other users. The resulting
backup is transactionally consistent:
<pre>
BACKUP TO 'backup.zip'
</pre>
The Backup tool (org.h2.tools.Backup) can not be used to create a online backup;
the database must not be in use while running this program.
</p>
<br /><a name="open_office"></a>
<h2>OpenOffice Baseを使用する</h2>
<p>
OpenOffice.org Base はJDBC API上のデータベースアクセスをサポートしています。 OpenOffice Baseを使ってH2データベースに接続するためには、最初にOpenOfficeにJDBCドライバを追加する必要があります。H2データベースに接続する手順:
</p>
<ul>
<li>オートスタートを含め、OpenOfficeを終了する
</li><li>h2.jar ファイルを &lt;OpenOffice&gt;\program\classes ディレクトリ内にコピーする
</li><li>OpenOffice Base を起動する
</li><li>存在するデータベースに接続し、JDBCを選択し、[Next] をクリックする
</li><li>データソースURLの例: jdbc:h2:c:/temp/test
</li><li>JDBCドライバクラス: org.h2.Driver
</li></ul>
<p>
これで、C:/temp ディレクトリ内に格納されているデータベースにアクセス可能です。
</p>
<br /><a name="web_start"></a>
<h2>Java Web Start / JNLP</h2>
<p>
When using Java Web Start / JNLP (Java Network Launch Protocol), permissions tags must be set in the .jnlp file,
and the application .jar file must be signed. Otherwise, when trying to write to the file system, the following
exception will occur: java.security.AccessControlException: access denied (java.io.FilePermission ... read).
Example permission tags:
<pre>
&lt;security>
&lt;all-permissions/>
&lt;/security>
</pre>
</p>
</div></td></tr></table></body></html>
\ No newline at end of file
...@@ -205,7 +205,7 @@ public class ScriptCommand extends ScriptBase { ...@@ -205,7 +205,7 @@ public class ScriptCommand extends ScriptBase {
add(sql, false); add(sql, false);
if(Table.TABLE.equals(tableType)) { if(Table.TABLE.equals(tableType)) {
if(table.canGetRowCount()) { if(table.canGetRowCount()) {
String rowcount = "-- " + table.getRowCount() + " = SELECT COUNT(*) FROM " + table.getSQL(); String rowcount = "-- " + table.getRowCount(session) + " = SELECT COUNT(*) FROM " + table.getSQL();
add(rowcount, false); add(rowcount, false);
} }
if(data) { if(data) {
......
...@@ -735,7 +735,7 @@ public class Database implements DataHandler { ...@@ -735,7 +735,7 @@ public class Database implements DataHandler {
} }
public synchronized Session createSession(User user) { public synchronized Session createSession(User user) {
Session session = new Session(this, user, nextSessionId++); Session session = new Session(this, user, ++nextSessionId);
sessions.add(session); sessions.add(session);
traceSystem.getTrace(Trace.SESSION).info("connecting #" + session.getId() + " to " + databaseName); traceSystem.getTrace(Trace.SESSION).info("connecting #" + session.getId() + " to " + databaseName);
if(delayedCloser != null) { if(delayedCloser != null) {
......
...@@ -155,7 +155,7 @@ public class Aggregate extends Expression { ...@@ -155,7 +155,7 @@ public class Aggregate extends Expression {
switch(type) { switch(type) {
case COUNT_ALL: case COUNT_ALL:
Table table = select.getTopTableFilter().getTable(); Table table = select.getTopTableFilter().getTable();
return ValueLong.get(table.getRowCount()); return ValueLong.get(table.getRowCount(session));
case MIN: case MIN:
case MAX: case MAX:
boolean first = type == MIN; boolean first = type == MIN;
......
...@@ -58,7 +58,7 @@ public class BtreeIndex extends Index implements RecordReader { ...@@ -58,7 +58,7 @@ public class BtreeIndex extends Index implements RecordReader {
if(head != null && head.getConsistent()) { if(head != null && head.getConsistent()) {
setRoot((BtreePage) storage.getRecord(session, head.getRootPosition())); setRoot((BtreePage) storage.getRecord(session, head.getRootPosition()));
needRebuild = false; needRebuild = false;
rowCount = table.getRowCount(); rowCount = table.getRowCount(session);
} else { } else {
truncate(session); truncate(session);
needRebuild = true; needRebuild = true;
...@@ -164,12 +164,17 @@ public class BtreeIndex extends Index implements RecordReader { ...@@ -164,12 +164,17 @@ public class BtreeIndex extends Index implements RecordReader {
public void remove(Session session, Row row) throws SQLException { public void remove(Session session, Row row) throws SQLException {
setChanged(session); setChanged(session);
if(rowCount == 1) { if(SysProperties.MVCC) {
// TODO performance: maybe improve truncate performance in this case
truncate(session);
} else {
root.remove(session, row, 0); root.remove(session, row, 0);
rowCount--; rowCount--;
} else {
if(rowCount == 1) {
// TODO performance: maybe improve truncate performance in this case
truncate(session);
} else {
root.remove(session, row, 0);
rowCount--;
}
} }
} }
...@@ -199,8 +204,8 @@ public class BtreeIndex extends Index implements RecordReader { ...@@ -199,8 +204,8 @@ public class BtreeIndex extends Index implements RecordReader {
} }
} }
public long getCost(int[] masks) throws SQLException { public double getCost(Session session, int[] masks) throws SQLException {
return 10 * getCostRangeIndex(masks, tableData.getRowCount()); return 10 * getCostRangeIndex(masks, tableData.getRowCount(session));
} }
public Record read(Session session, DataPage s) throws SQLException { public Record read(Session session, DataPage s) throws SQLException {
......
...@@ -30,7 +30,7 @@ public class BtreeLeaf extends BtreePage { ...@@ -30,7 +30,7 @@ public class BtreeLeaf extends BtreePage {
private boolean writePos; private boolean writePos;
private int cachedRealByteCount; private int cachedRealByteCount;
BtreeLeaf(BtreeIndex index, Session session,DataPage s) throws SQLException { BtreeLeaf(BtreeIndex index, Session session, DataPage s) throws SQLException {
super(index); super(index);
writePos = s.readByte() == 'P'; writePos = s.readByte() == 'P';
if(writePos) { if(writePos) {
...@@ -60,7 +60,18 @@ public class BtreeLeaf extends BtreePage { ...@@ -60,7 +60,18 @@ public class BtreeLeaf extends BtreePage {
if (comp == 0) { if (comp == 0) {
if(index.indexType.isUnique()) { if(index.indexType.isUnique()) {
if(!index.isNull(newRow)) { if(!index.isNull(newRow)) {
throw index.getDuplicateKeyException(); if(SysProperties.MVCC) {
int todoMVCC;
// currently, throw a duplicate row exception even if another transaction
// updated or deleted the same row and did not yet commit - PostgreSQL waits but in most cases transactions are committed
if(row.getDeleted() && row.getSessionId() == session.getId()) {
// ignore: deleted
} else {
throw index.getDuplicateKeyException();
}
} else {
throw index.getDuplicateKeyException();
}
} }
} }
comp = index.compareKeys(row, newRow); comp = index.compareKeys(row, newRow);
...@@ -251,7 +262,9 @@ public class BtreeLeaf extends BtreePage { ...@@ -251,7 +262,9 @@ public class BtreeLeaf extends BtreePage {
int size = 2 + dummy.getIntLen() * (len+1); int size = 2 + dummy.getIntLen() * (len+1);
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
SearchRow row = (SearchRow) pageData.get(i); SearchRow row = (SearchRow) pageData.get(i);
size += getRowSize(dummy, row); if(!row.getDeleted()) {
size += getRowSize(dummy, row);
}
} }
size += index.getRecordOverhead(); size += index.getRecordOverhead();
cachedRealByteCount = size; cachedRealByteCount = size;
......
...@@ -56,10 +56,12 @@ public class BtreeNode extends BtreePage { ...@@ -56,10 +56,12 @@ public class BtreeNode extends BtreePage {
this.pageData = pageData; this.pageData = pageData;
} }
protected SearchRow getData(Session session, int i) throws SQLException { protected SearchRow getData(int i) throws SQLException {
SearchRow r = (SearchRow) pageData.get(i); SearchRow r = (SearchRow) pageData.get(i);
if(r == null) { if(r == null) {
int p = pageChildren.get(i+1); int p = pageChildren.get(i+1);
// MVCC: get the committed data
Session session = index.getDatabase().getSystemSession();
BtreePage page = index.getPage(session, p); BtreePage page = index.getPage(session, p);
r = page.getFirst(session); r = page.getFirst(session);
pageData.set(i, r); pageData.set(i, r);
......
...@@ -46,7 +46,7 @@ public class FunctionIndex extends Index { ...@@ -46,7 +46,7 @@ public class FunctionIndex extends Index {
return new FunctionCursor(result); return new FunctionCursor(result);
} }
public long getCost(int[] masks) throws SQLException { public double getCost(Session session, int[] masks) throws SQLException {
if(masks != null) { if(masks != null) {
throw Message.getUnsupportedException(); throw Message.getUnsupportedException();
} }
......
...@@ -121,7 +121,7 @@ public class HashIndex extends Index { ...@@ -121,7 +121,7 @@ public class HashIndex extends Index {
return new HashCursor(result); return new HashCursor(result);
} }
public long getCost(int[] masks) { public double getCost(Session session, int[] masks) {
for (int i = 0; i < columns.length; i++) { for (int i = 0; i < columns.length; i++) {
Column column = columns[i]; Column column = columns[i];
int index = column.getColumnId(); int index = column.getColumnId();
......
...@@ -75,7 +75,7 @@ public abstract class Index extends SchemaObject { ...@@ -75,7 +75,7 @@ public abstract class Index extends SchemaObject {
public abstract void add(Session session, Row row) throws SQLException; public abstract void add(Session session, Row row) throws SQLException;
public abstract void remove(Session session, Row row) throws SQLException; public abstract void remove(Session session, Row row) throws SQLException;
public abstract Cursor find(Session session, SearchRow first, SearchRow last) throws SQLException; public abstract Cursor find(Session session, SearchRow first, SearchRow last) throws SQLException;
public abstract long getCost(int[] masks) throws SQLException; public abstract double getCost(Session session, int[] masks) throws SQLException;
public abstract void remove(Session session) throws SQLException; public abstract void remove(Session session) throws SQLException;
public abstract void truncate(Session session) throws SQLException; public abstract void truncate(Session session) throws SQLException;
public abstract boolean canGetFirstOrLast(boolean first); public abstract boolean canGetFirstOrLast(boolean first);
......
...@@ -59,7 +59,7 @@ public class LinearHashIndex extends Index implements RecordReader { ...@@ -59,7 +59,7 @@ public class LinearHashIndex extends Index implements RecordReader {
firstBucketBlock = 4; firstBucketBlock = 4;
storage = database.getStorage(id, diskFile); storage = database.getStorage(id, diskFile);
storage.setReader(this); storage.setReader(this);
rowCount = table.getRowCount(); rowCount = table.getRowCount(session);
int pos = storage.getNext(null); int pos = storage.getNext(null);
if(pos == -1) { if(pos == -1) {
truncate(session); truncate(session);
...@@ -489,7 +489,7 @@ public class LinearHashIndex extends Index implements RecordReader { ...@@ -489,7 +489,7 @@ public class LinearHashIndex extends Index implements RecordReader {
return new LinearHashCursor(tableData.getRow(session, key)); return new LinearHashCursor(tableData.getRow(session, key));
} }
public long getCost(int[] masks) throws SQLException { public double getCost(Session session, int[] masks) throws SQLException {
for (int i = 0; i < columns.length; i++) { for (int i = 0; i < columns.length; i++) {
Column column = columns[i]; Column column = columns[i];
int index = column.getColumnId(); int index = column.getColumnId();
......
...@@ -139,7 +139,7 @@ public class LinkedIndex extends Index { ...@@ -139,7 +139,7 @@ public class LinkedIndex extends Index {
} }
} }
public long getCost(int[] masks) throws SQLException { public double getCost(Session session, int[] masks) throws SQLException {
return 100 + getCostRangeIndex(masks, rowCount + Constants.COST_ROW_OFFSET); return 100 + getCostRangeIndex(masks, rowCount + Constants.COST_ROW_OFFSET);
} }
......
...@@ -48,7 +48,7 @@ public class MetaIndex extends Index { ...@@ -48,7 +48,7 @@ public class MetaIndex extends Index {
return new MetaCursor(rows); return new MetaCursor(rows);
} }
public long getCost(int[] masks) throws SQLException { public double getCost(Session session, int[] masks) throws SQLException {
if(scan) { if(scan) {
return 10000; return 10000;
} }
......
...@@ -42,7 +42,7 @@ public class RangeIndex extends Index { ...@@ -42,7 +42,7 @@ public class RangeIndex extends Index {
return new RangeCursor(start, end); return new RangeCursor(start, end);
} }
public long getCost(int[] masks) throws SQLException { public double getCost(Session session, int[] masks) throws SQLException {
return 1; return 1;
} }
......
...@@ -6,6 +6,7 @@ package org.h2.index; ...@@ -6,6 +6,7 @@ package org.h2.index;
import java.sql.SQLException; import java.sql.SQLException;
import org.h2.constant.SysProperties;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.result.Row; import org.h2.result.Row;
import org.h2.result.SearchRow; import org.h2.result.SearchRow;
...@@ -42,6 +43,18 @@ public class ScanCursor implements Cursor { ...@@ -42,6 +43,18 @@ public class ScanCursor implements Cursor {
} }
public boolean next() throws SQLException { public boolean next() throws SQLException {
if(SysProperties.MVCC) {
while(true) {
row = scan.getNextRow(session, row);
if(row == null) {
break;
}
if(row.getSessionId() == 0 || row.getSessionId() == session.getId()) {
break;
}
}
return row != null;
}
row = scan.getNextRow(session, row); row = scan.getNextRow(session, row);
return row != null; return row != null;
} }
......
...@@ -142,8 +142,8 @@ public class ScanIndex extends Index { ...@@ -142,8 +142,8 @@ public class ScanIndex extends Index {
return new ScanCursor(session, this); return new ScanCursor(session, this);
} }
public long getCost(int[] masks) throws SQLException { public double getCost(Session session, int[] masks) throws SQLException {
long cost = tableData.getRowCount() + Constants.COST_ROW_OFFSET; long cost = tableData.getRowCount(session) + Constants.COST_ROW_OFFSET;
if(storage != null) { if(storage != null) {
cost *= 10; cost *= 10;
} }
......
...@@ -293,8 +293,8 @@ public class TreeIndex extends Index { ...@@ -293,8 +293,8 @@ public class TreeIndex extends Index {
} }
} }
public long getCost(int[] masks) throws SQLException { public double getCost(Session session, int[] masks) throws SQLException {
return getCostRangeIndex(masks, tableData.getRowCount()); return getCostRangeIndex(masks, tableData.getRowCount(session));
} }
public void remove(Session session) throws SQLException { public void remove(Session session) throws SQLException {
......
...@@ -212,13 +212,6 @@ public class ViewIndex extends Index { ...@@ -212,13 +212,6 @@ public class ViewIndex extends Index {
return query; return query;
} }
public long getCost(int[] masks) throws SQLException {
if(masks != null) {
throw Message.getUnsupportedException();
}
return Long.MAX_VALUE;
}
public void remove(Session session) throws SQLException { public void remove(Session session) throws SQLException {
throw Message.getUnsupportedException(); throw Message.getUnsupportedException();
} }
......
...@@ -872,11 +872,11 @@ SET MAX_LENGTH_INPLACE_LOB int ...@@ -872,11 +872,11 @@ SET MAX_LENGTH_INPLACE_LOB int
Sets the maximum size of an in-place LOB object. LOB objects larger Sets the maximum size of an in-place LOB object. LOB objects larger
that this size are stored in a separate file, otherwise stored that this size are stored in a separate file, otherwise stored
directly in the database (in-place). directly in the database (in-place).
The default max size is 128. The default max size is 1024.
This setting is persistent. This setting is persistent.
Admin rights are required to execute this command. Admin rights are required to execute this command.
"," ","
SET MAX_LENGTH_INPLACE_LOB 512 SET MAX_LENGTH_INPLACE_LOB 128
" "
"Commands (Other)","SET MAX_LOG_SIZE"," "Commands (Other)","SET MAX_LOG_SIZE","
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
*/ */
package org.h2.result; package org.h2.result;
import org.h2.engine.Session;
import org.h2.value.Value; import org.h2.value.Value;
public interface SearchRow { public interface SearchRow {
...@@ -13,5 +14,8 @@ public interface SearchRow { ...@@ -13,5 +14,8 @@ public interface SearchRow {
int getColumnCount(); int getColumnCount();
void setValue(int idx, Value v); void setValue(int idx, Value v);
void setPos(int pos); void setPos(int pos);
void setDeleted(Session session, boolean deleted);
int getSessionId();
boolean getDeleted();
} }
...@@ -4,12 +4,15 @@ ...@@ -4,12 +4,15 @@
*/ */
package org.h2.result; package org.h2.result;
import org.h2.engine.Session;
import org.h2.value.Value; import org.h2.value.Value;
public class SimpleRow implements SearchRow { public class SimpleRow implements SearchRow {
private int pos; private int pos;
private Value[] data; private Value[] data;
private int sessionId;
private boolean deleted;
public SimpleRow(Value[] data) { public SimpleRow(Value[] data) {
this.data = data; this.data = data;
...@@ -35,4 +38,18 @@ public class SimpleRow implements SearchRow { ...@@ -35,4 +38,18 @@ public class SimpleRow implements SearchRow {
return data[i]; return data[i];
} }
public boolean getDeleted() {
return deleted;
}
public void setDeleted(Session session, boolean deleted) {
this.sessionId = session.getId();
this.deleted = deleted;
}
public int getSessionId() {
int testing;
return sessionId;
}
} }
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
*/ */
package org.h2.result; package org.h2.result;
import org.h2.engine.Session;
import org.h2.value.Value; import org.h2.value.Value;
public class SimpleRowValue implements SearchRow { public class SimpleRowValue implements SearchRow {
...@@ -12,6 +13,8 @@ public class SimpleRowValue implements SearchRow { ...@@ -12,6 +13,8 @@ public class SimpleRowValue implements SearchRow {
private int index; private int index;
private int virtualColumnCount; private int virtualColumnCount;
private Value data; private Value data;
private int sessionId;
private boolean deleted;
public SimpleRowValue(int columnCount) { public SimpleRowValue(int columnCount) {
this.virtualColumnCount = columnCount; this.virtualColumnCount = columnCount;
...@@ -35,4 +38,18 @@ public class SimpleRowValue implements SearchRow { ...@@ -35,4 +38,18 @@ public class SimpleRowValue implements SearchRow {
data = v; data = v;
} }
public boolean getDeleted() {
return deleted;
}
public void setDeleted(Session session, boolean deleted) {
this.sessionId = session.getId();
this.deleted = deleted;
}
public int getSessionId() {
int testing;
return sessionId;
}
} }
...@@ -10,6 +10,7 @@ import org.h2.engine.Constants; ...@@ -10,6 +10,7 @@ import org.h2.engine.Constants;
import org.h2.engine.Database; import org.h2.engine.Database;
import org.h2.expression.Expression; import org.h2.expression.Expression;
import org.h2.util.ObjectArray; import org.h2.util.ObjectArray;
import org.h2.util.RandomUtils;
import org.h2.util.StringUtils; import org.h2.util.StringUtils;
import org.h2.value.Value; import org.h2.value.Value;
import org.h2.value.ValueNull; import org.h2.value.ValueNull;
...@@ -110,9 +111,11 @@ public class SortOrder { ...@@ -110,9 +111,11 @@ public class SortOrder {
} }
private void sort(ObjectArray rows, int l, int r) throws SQLException { private void sort(ObjectArray rows, int l, int r) throws SQLException {
// quicksort
int i, j; int i, j;
while (r - l > 10) { while (r - l > 10) {
i = (r + l) >> 1; // randomized pivot to avoid worst case
i = RandomUtils.nextInt(r - l - 4) + l + 2;
if (compare((Value[]) rows.get(l), (Value[]) rows.get(r)) > 0) { if (compare((Value[]) rows.get(l), (Value[]) rows.get(r)) > 0) {
swap(rows, l, r); swap(rows, l, r);
} }
......
...@@ -6,6 +6,7 @@ package org.h2.store; ...@@ -6,6 +6,7 @@ package org.h2.store;
import java.sql.SQLException; import java.sql.SQLException;
import org.h2.constant.SysProperties;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.util.CacheObject; import org.h2.util.CacheObject;
...@@ -81,6 +82,12 @@ public abstract class Record extends CacheObject { ...@@ -81,6 +82,12 @@ public abstract class Record extends CacheObject {
if((isChanged() && !isLogWritten()) || isPinned()) { if((isChanged() && !isLogWritten()) || isPinned()) {
return false; return false;
} }
if(SysProperties.MVCC) {
// TODO not required if we write the log only when committed
if(sessionId != 0) {
return false;
}
}
return true; return true;
} }
......
...@@ -113,7 +113,7 @@ public class FunctionTable extends Table { ...@@ -113,7 +113,7 @@ public class FunctionTable extends Table {
return false; return false;
} }
public long getRowCount() throws SQLException { public long getRowCount(Session session) throws SQLException {
throw Message.getInternalError(); throw Message.getInternalError();
} }
......
...@@ -1272,7 +1272,7 @@ public class MetaTable extends Table { ...@@ -1272,7 +1272,7 @@ public class MetaTable extends Table {
throw Message.getUnsupportedException(); throw Message.getUnsupportedException();
} }
public long getRowCount() { public long getRowCount(Session session) {
throw Message.getInternalError(); throw Message.getInternalError();
} }
......
...@@ -84,7 +84,7 @@ public class RangeTable extends Table { ...@@ -84,7 +84,7 @@ public class RangeTable extends Table {
return false; return false;
} }
public long getRowCount() throws SQLException { public long getRowCount(Session session) throws SQLException {
return max - min; return max - min;
} }
......
...@@ -252,11 +252,11 @@ public abstract class Table extends SchemaObject { ...@@ -252,11 +252,11 @@ public abstract class Table extends SchemaObject {
public PlanItem getBestPlanItem(Session session, int[] masks) throws SQLException { public PlanItem getBestPlanItem(Session session, int[] masks) throws SQLException {
PlanItem item = new PlanItem(); PlanItem item = new PlanItem();
item.setIndex(getScanIndex(session)); item.setIndex(getScanIndex(session));
item.cost = item.getIndex().getCost(null); item.cost = item.getIndex().getCost(session, null);
ObjectArray indexes = getIndexes(); ObjectArray indexes = getIndexes();
for (int i = 1; indexes != null && masks != null && i < indexes.size(); i++) { for (int i = 1; indexes != null && masks != null && i < indexes.size(); i++) {
Index index = (Index) indexes.get(i); Index index = (Index) indexes.get(i);
long cost = index.getCost(masks); double cost = index.getCost(session, masks);
if (cost < item.cost) { if (cost < item.cost) {
item.cost = cost; item.cost = cost;
item.setIndex(index); item.setIndex(index);
...@@ -440,7 +440,7 @@ public abstract class Table extends SchemaObject { ...@@ -440,7 +440,7 @@ public abstract class Table extends SchemaObject {
public abstract boolean canGetRowCount(); public abstract boolean canGetRowCount();
public abstract boolean canDrop(); public abstract boolean canDrop();
public abstract long getRowCount() throws SQLException; public abstract long getRowCount(Session session) throws SQLException;
public boolean getGlobalTemporary() { public boolean getGlobalTemporary() {
return false; return false;
......
...@@ -243,7 +243,7 @@ public class TableData extends Table implements RecordReader { ...@@ -243,7 +243,7 @@ public class TableData extends Table implements RecordReader {
return true; return true;
} }
public long getRowCount() { public long getRowCount(Session session) {
return rowCount; return rowCount;
} }
......
...@@ -96,7 +96,7 @@ public class TableFilter implements ColumnResolver { ...@@ -96,7 +96,7 @@ public class TableFilter implements ColumnResolver {
if (indexConditions.size() == 0) { if (indexConditions.size() == 0) {
item = new PlanItem(); item = new PlanItem();
item.setIndex(table.getScanIndex(session)); item.setIndex(table.getScanIndex(session));
item.cost = item.getIndex().getCost(null); item.cost = item.getIndex().getCost(session, null);
} else { } else {
int len = table.getColumns().length; int len = table.getColumns().length;
int[] masks = new int[len]; int[] masks = new int[len];
......
...@@ -242,7 +242,7 @@ public class TableLink extends Table { ...@@ -242,7 +242,7 @@ public class TableLink extends Table {
} }
} }
public long getRowCount() throws SQLException { public long getRowCount(Session session) throws SQLException {
PreparedStatement prep = getPreparedStatement("SELECT COUNT(*) FROM "+originalTable); PreparedStatement prep = getPreparedStatement("SELECT COUNT(*) FROM "+originalTable);
ResultSet rs = prep.executeQuery(); ResultSet rs = prep.executeQuery();
rs.next(); rs.next();
......
...@@ -175,7 +175,7 @@ public class TableView extends Table { ...@@ -175,7 +175,7 @@ public class TableView extends Table {
throw Message.getUnsupportedException(); throw Message.getUnsupportedException();
} }
public long getRowCount() { public long getRowCount(Session session) {
throw Message.getInternalError(); throw Message.getInternalError();
} }
......
...@@ -17,4 +17,8 @@ public class CacheHead extends CacheObject { ...@@ -17,4 +17,8 @@ public class CacheHead extends CacheObject {
public void write(DataPage buff) throws SQLException { public void write(DataPage buff) throws SQLException {
} }
public boolean canRemove() {
return false;
}
} }
...@@ -58,9 +58,7 @@ public abstract class CacheObject { ...@@ -58,9 +58,7 @@ public abstract class CacheObject {
return false; return false;
} }
public boolean canRemove() { abstract public boolean canRemove();
return true;
}
/* /*
* Get the estimated memory size. * Get the estimated memory size.
......
package org.h2.samples;
import java.io.*;
import java.sql.*;
import org.h2.tools.RunScript;
public class InitDatabaseFromJar {
public static void main(String[] args) throws Exception {
new InitDatabaseFromJar().createScript();
new InitDatabaseFromJar().initDb();
}
private void createScript() throws Exception {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:mem:test");
Statement stat = conn.createStatement();
stat.execute("CREATE TABLE TEST(NAME VARCHAR)");
stat.execute("INSERT INTO TEST VALUES('Hello World')");
stat.execute("SCRIPT TO 'script.sql'");
conn.close();
}
void initDb() throws Exception {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:mem:test");
InputStream in = getClass().getResourceAsStream("script.sql");
if(in == null) {
System.out.println("Please add the file script.sql to the classpath, package " + getClass().getPackage().getName());
} else {
RunScript.execute(conn, new InputStreamReader(in));
ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM TEST");
while(rs.next()) {
System.out.println(rs.getString(1));
}
conn.close();
}
}
}
...@@ -94,6 +94,16 @@ java -Xmx512m -Xrunhprof:cpu=samples,depth=8 org.h2.tools.RunScript -url jdbc:h2 ...@@ -94,6 +94,16 @@ java -Xmx512m -Xrunhprof:cpu=samples,depth=8 org.h2.tools.RunScript -url jdbc:h2
/* /*
table with constraint
alter the table
add data
-> object is closed
CREATE TABLE TEST(ID INT, PARENT INT, CONSTRAINT A FOREIGN KEY(PARENT) REFERENCES(ID));
ALTER TABLE TEST ALTER COLUMN PARENT BIGINT;
INSERT INTO TEST VALUES(1, 1, 1);
add MVCC add MVCC
test and document fulltext search test and document fulltext search
......
package org.h2.test.mvcc;
import java.sql.*;
import org.h2.tools.DeleteDbFiles;
public class TestMVCC {
Connection c1, c2;
Statement s1, s2;
public static void main(String[] args) throws Exception {
TestMVCC app = new TestMVCC();
app.test();
}
void test() throws Exception {
// TODO Prio 1: don't store records before they are committed (otherwise re-reading from a different session may return the wrong value)
// TODO Prio 1: getRowCount: different row count for different sessions: TableData
// TODO Prio 2: getRowCount: different row count for different sessions: TableLink (use different connections?)
System.setProperty("h2.mvcc", "true");
DeleteDbFiles.execute(null, "test", true);
Class.forName("org.h2.Driver");
c1 = DriverManager.getConnection("jdbc:h2:test");
s1 = c1.createStatement();
c2 = DriverManager.getConnection("jdbc:h2:test");
s2 = c2.createStatement();
c1.setAutoCommit(false);
c2.setAutoCommit(false);
s1.execute("CREATE TABLE TEST(ID INT, NAME VARCHAR)");
// s1.execute("CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR)");
s1.execute("INSERT INTO TEST VALUES(1, 'Hello')");
test(s2, "SELECT COUNT(*) FROM TEST WHERE NAME!='X'", "0");
c1.commit();
// TODO support snapshot isolation
// test(s2, "SELECT COUNT(*) FROM TEST WHERE NAME!='X'", "0");
test(s2, "SELECT COUNT(*) FROM TEST WHERE NAME!='X'", "1");
c1.close();
c2.close();
}
private void test(Statement stat, String sql, String expected) throws Exception {
ResultSet rs = stat.executeQuery(sql);
if(rs.next()) {
String s = rs.getString(1);
if(expected == null) {
throw new Error("expected: no rows, got: " + s);
} else if(!expected.equals(s)) {
throw new Error("expected: " + expected + ", got: " + s);
}
} else {
if(expected != null) {
throw new Error("expected: " + expected + ", got: no rows");
}
}
// TODO Auto-generated method stub
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论