Derby

Contents

Derbyとは


Derby(Apache Derby)とは100% Pure JavaのRDBMSである。
トランザクション等のRDBとして求められる機能一般は実装されている。
JDKにもバンドルされており、こちらはJava DBと呼ばれるが、基本的に同じものである。
最新のものを特別求めないのならこちらを使用しても問題ない。
Windows版のJDKにも同梱されており、実行できる。
DBサーバとしてネットワーク越しに使用もできるが、Javaアプリケーションに組み込んで使用することもできる。
主流な使用方法はこの組み込みの方である。

各種URL

 

 

サーバー構築

 

構築環境

 

 

 

 

OS設定

 

ネットワーク

 

固定IPアドレス割り当て


次のファイルを編集する

# ifcfg-loはループバックインタフェースであるため、触らない
vi /etc/sysconfig/network-scripts/ifcfg-<インタフェース名>


以下では例として192.168.0.51/24を割り当てた

BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.0.51
NETMASK=255.255.255.0
NETWORK=192.168.0.0
GATEWAY=192.168.0.1


ネットワークを再起動する

systemctl restart network


ip addressコマンドにより、インタフェースが有効になっていることを確認する
これによりホストマシンなどからSSHでログイン可能となる


firewalld


Derbyのデフォルトポートである、TCP/1527を開ける。
接続元IPアドレス制限は行わない。
※CentOS7.2以前のCentOS7場合はfirewalldのバージョン場古く、下記を実行できない。アップデートすること。

yum update firewalld -y

 

  1. 現在ルールが定義されていないか確認
    firewall-cmd --permanent --info-service=derby
  2. 新しいルールを定義
    firewall-cmd --new-service=derby --permanent
    firewall-cmd --service=derby --add-port=1527/tcp --permanent
  3. ルールが定義されていることを確認
    firewall-cmd --permanent --info-service=derby
  4. 現在ルールが適用されていないことを確認する
    firewall-cmd --list-services --zone=public --permanent | sed -e "s/ /\n/g" | grep derby
  5. ルールを適用する
    firewall-cmd --add-service=derby --zone=public --permanent
  6. ルールが適用されていることを確認する
    firewall-cmd --list-services --zone=public --permanent | sed -e "s/ /\n/g" | grep derby
  7. 設定を再読み込みして反映させる
    firewall-cmd --reload

 

IPを制限する場合


特定のIPアドレスからのみ接続可能に設定する場合は以下のようにする。

  1. 既にアクセス制限が設定されていないか確認
    firewall-cmd --list-services --zone=public --permanent | sed -e "s/ /\n/g" | grep derby
  2. 現在サービスが定義されていないか確認
    firewall-cmd --permanent --info-service=derby
  3. 新しいサービスを定義
    firewall-cmd --new-service=derby --permanent
    firewall-cmd --service=derby --add-port=1527/tcp --permanent
  4. サービスが定義されていることを確認
    firewall-cmd --permanent --info-service=derby
  5. 管理ゾ-ンが定義されていないか確認
    firewall-cmd --permanent --info-zone=admin
  6. 管理ゾ-ンを定義
    firewall-cmd --permanent --new-zone=admin
  7. 管理ゾ-ンが定義されていることを確認
    firewall-cmd --permanent --info-zone=admin
  8. 接続元IPアドレス、接続先サービスを追加する
    firewall-cmd --permanent --zone=admin --add-source=<IPアドレス>
    firewall-cmd --permanent --zone=admin --add-service=derby
  9. 管理ゾ-ンが適切に定義されていることを確認する
    firewall-cmd --permanent --info-zone=admin
    • 出力
      [root@derby ~]#  firewall-cmd --permanent --info-zone=admin
      admin (active)
        target: default
        icmp-block-inversion: no
        interfaces:
        sources: XXX.XXX.XXX.XXX
        services: derby
        ports:
        protocols:
        masquerade: no
        forward-ports:
        source-ports:
        icmp-blocks:
        rich rules:
  10. firewalldシステムを再起動して設定を反映させる
    systemctl restart firewalld

 

 

ホスト名


ホスト名としてderbyを設定する

hostname derby.corp
# 再起動しても有効にする
echo derby.corp > /etc/hostname

再ログインすることで有効になる。


Java環境の構築


DerbyのサーバではDerbyのみを動作させ、アプリケーションサーバ機能は持たせないので、JDKではなくJREをインストールする。
Derby自体もJDKに付属のものではなく、公式ページから最新のものをダウンロードして使用する。


ダウンロード


公式Webページ:http://www.oracle.com/technetwork/java/javase/downloads/index.html
今回は2017/05/09時点の最新版「JRE8u131」をダウンロードする。
展開するだけで使用できる圧縮版(jre-8u131-linux-x64.tar.gz)をダウンロードする。
ダウンロードの前に「Accept License Agreement」ラジオボタンにチェックを入れること。
ダウンロードの際はページに記載のハイパーリンク(http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jre-8u131-linux-x64.tar.gz)から
wgetしようとすると、エラーが発生するので、一旦PCでダウンロードを試み、それをキャンセル。
その際ダウンロードを行おうとしたURL(http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jre-8u131-linux-x64.tar.gz?AuthParam=XXXXXのようになる)をコピーし、そこから改めてwgetする。

※PCにダウンロードしてSCP転送でもよい

インストール

 

tar xzfv jre-*.tar.gz*
rm -f jre-*.tar.gz*

mv jre* /usr/local/
ln -s /usr/local/jre* /usr/local/jre

 

環境変数


環境変数を設定し、パスを通す。

export JAVA_HOME=/usr/local/jre
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar


これによって「java」コマンドが実行できるようになったので、確認する。

java -version


更に再起動・再ログインしても自動で設定されるようにbashrcに設定を追加する。

echo "" >> /etc/bashrc
echo "# JAVA ENVIRONMENT VARIABLE" >> /etc/bashrc
echo export JAVA_HOME=/usr/local/jre >> /etc/bashrc
echo export PATH=\$JAVA_HOME/bin:\$PATH >> /etc/bashrc
echo export CLASSPATH=.:\$JAVA_HOME/lib/tools.jar:\$JAVA_HOME/lib/dt.jar >> /etc/bashrc



Derbyの構築

 

ダウンロード


ダウンロードページから最新のものをダウンロードする。
今回ダウンロードするバージョンのリンクはこちら

wget http://ftp.riken.jp/net/apache//db/derby/db-derby-10.13.1.1/db-derby-10.13.1.1-bin.tar.gz

 

インストール


インストールは展開して任意の場所に配置するだけである。

tar xzfv db-derby-*.tar.gz
rm -f db-derby-*.tar.gz

mv db-derby* /usr/local/`ls | grep db-derby-* | sed -e "s/db-\|-bin.*//g"`
ln -s /usr/local/*derby* /usr/local/derby

cd /usr/local/derby

 

インストール確認


インストールできているか確認する。

bin/sysinfo


このコマンドを実行した際、インストールしたJavaとDerbyのバージョンが
表示されているか確認しておく。

 

環境変数の追加


環境変数を設定して簡単に使えるようにしておく。

export DERBY_HOME=/usr/local/derby
export PATH=$DERBY_HOME/bin:$PATH


次回ログイン時にも設定されるようにする。

echo "" >> /etc/bashrc
echo "# DERBY ENVIRONMENT VARIABLE" >> /etc/bashrc
echo "export DERBY_HOME=$DERBY_HOME" >> /etc/bashrc
echo "export PATH=\$DERBY_HOME/bin:\$PATH" >> /etc/bashrc

 

不要ファイルの削除


ドキュメントなど、サーバの実行に不要なファイルは消しておく。

インストールされているファイル


存在するファイルは以下

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

削除の実行

 



 

 

 

 

 

 

 

 

 

設定ファイルの用意


サーバ用設定ファイルを用意しておく。
空のままでも良いが、設定変更する場合はこのファイルを編集する。

touch derby.properties

 

NetworkServerControlスクリプトのリンク作成


サーバとして利用する際、NetworkServerControlスクリプトを中心に使用するのだが、NetworkServerControlという名前は長く、大文字が混在しているので、キーボードから入力しづらい。
その為、簡単な名前のリンクを作成する。
derbyという名前のリンクにする場合。

cd bin
ln -s NetworkServerControl derby
cd ../

 

NetworkServerControlスクリプトの変更


NetworkServerControlスクリプトは実行時のカレントディレクトリを起点としてログファイルの生成、設定ファイルの読み込みなどを行う。
いずれのディレクトリにおいても$DERBY_HOMEディレクトリが起点となるように変更する。
更に、JVMオプションを設定できるようにする。

sed -i -e "s/derby_exec_command=/cd \$DERBY_HOME\nexport DERBY_OPTS="\`cat env\`"\nderby_exec_command=/g" $DERBY_HOME/bin/derby2
echo > $DERBY_HOME/env


例えば初期メモリサイズを32MB、最大メモリサイズを64MBに制限したい場合は次のように設定する。

echo -Xms32M > $DERBY_HOME/env
echo -Xmx64M >> $DERBY_HOME/env

 

ijスクリプトの変更


ij用のデフォルト設定ファイルを読み込むように変更する
ijスクリプトは実行時のカレントディレクトリをデータベースのストレージパスとして扱う。
その為、データベースを作成した時と異なるパスで再度ijでデータベースにアクセスしようとしてもアクセスできない。
いずれのディレクトリにおいても$DERBY_HOMEディレクトリが起点となるように変更する。

touch ij.properties
sed -i -e "s/\$@\"/\$@ -p \$DERBY_HOME\/ij.properties\"/g" -e "s/derby_exec_command=/cd \$DERBY_HOME\nderby_exec_command=/g" bin/ij

 

SQL直接実行スクリプトの作成


DerbyにはLinuxコンソールから直接SQLを実行できず、毎回ijで一旦ログインしなければならない。
その為、Linuxコンソールから直接SQLを実行できるプログラムを作成する。

cat > bin/qtoderby << EOT
ij <(echo "\$*")
echo ""
EOT
chmod 744 bin/qtoderby


qtoderbyというプログラムが作成されたので、コマンドライン引数にSQLを指定して直接実行できるようになった。
ただし、適切にエスケープを行う必要がある。

Derby実行ユーザ作成

 

useradd --user-group --no-create-home --shell /sbin/nologin derby
chown -R derby:derby /usr/local/derby*

 

 

初期設定


環境によっては以下の設定は行うべきではない。ただし、あるとDerbyを使用しやすい設定である。

サーバ設定


デフォルトではIPv6のみでしか接続できないので、全てのIPv4アドレスを持つインタフェースへ接続を許可する。

cat > derby.properties << EOT
derby.system.home=$DERBY_HOME
derby.drda.host=0.0.0.0
derby.language.logQueryPlan=true
derby.infolog.append=true
EOT

 

ij設定

 

cat > ij.properties << EOT
ij.protocol=jdbc:derby://127.0.0.1:1527/
ij.database = <メインで使用するデータベース>;create=true
EOT



起動

 

derbyStart

接続確認を行う

ij
--プロンプトが表示されたら実行する。
--データベース作成ができていれば正常に完了する。
show tables;
--デフォルトデータベースのみが表示される。
exit;

Derbyを終了させる場合は以下を実行

derby shutdown




ローカル開発環境の構築


Derbyは組み込みモードでも使用でき、開発するアプリケーションから直接起動することができる。

インストール


jarファイルをダウンロードして所定のパスに配置する。
ライブラリには通常バージョンとDerby開発者向けの開発バージョンが存在する。

 

Derbyの起動プログラムサンプル

 

/*

   Derby - Class SimpleNetworkServerSample

   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

 */

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.derby.drda.NetworkServerControl;

/**
 * In order for a database to be consistent, only one JVM is allowed
 * to access it at a time. The embedded driver is loaded when the Network Server
 * is started. Hence, the JVM that starts the Network Server can get an
 * embedded connection to the same database that Network Server is accessing
 * to serve the clients from other JVMs. This solution allows you to take
 * advantage of the performance benefits of the embedded driver as well as allow
 * for client connections from other JVMs to connect to the same database.
 *
 *
 * In particular, this sample program
 * 1) 	starts the Derby Network Server using a property and
 *		also loads the embedded driver
 * 2)	checks if the Derby Network Server is up and running
 * 3)	creates the database 'NSSimpleDB' if not already created
 * 4)	obtains an embedded database connection
 * 5)	tests the database connection by executing a sample query
 * 6)	allows for client connections to connect to the server until
 *      the user decides to stop the server and exit the program
 * 7)	closes the connections
 * 8)	shuts down the Derby Network Server before exiting the program.
 *
 * Note: On running this program, there will be a NSSimpleDB database directory
 * created if not present already, and there will be a derby.log file which
 * contains messages from Derby.
 *
 *  <P>
 *  Usage: java SimpleNetworkServerSample
 *
 */
public class SimpleNetworkServerSample
{

	/*
	 * The database is located in the same directory where this program is being
	 * run. Alternatively, you can specify the absolute path of the database location
	 */
	private static String DBNAME="NSSimpleDB";


	public static void main (String[] args)
		throws Exception
	{
		Connection embeddedConn = null;

		try
		{
			startNetworkServer();

			/*
			  Can now spawn threads to do many things with
			  embedded connections but allow others to connect via
			  Network Server. But for sample purposes, an embedded connection
			  will be obtained and a sample query executed before waiting for
			  the user to give input to shut down the server.
			*/

		}
		catch (Exception e)
		{
			System.out.println("Failed to start NetworkServer: " + e);
			System.exit(1);
		}

		try
		{
			// get an embedded connection
			// Since the Network Server was started in this JVM, this JVM can get an embedded
			// connection to the same database that the Network Server
			// is accessing to serve clients from other JVMs.
			// The embedded connection will be faster than going across the
			// network
			embeddedConn = getEmbeddedConnection(DBNAME,"create=true;");
			System.out.println("Got an embedded connection.");


			System.out.println("Testing embedded connection by executing a sample query ");
			// test connections by doing some work
			test(embeddedConn);

			// print how to connect to the network server using ij
			String howToConnect = ijUsage();
			System.out.println(howToConnect);

			waitForExit();

		}
		catch (SQLException sqle)
		{
			System.out.println("Failure making connection: " + sqle);
			sqle.printStackTrace();
		}
		finally
		{

			if(embeddedConn != null)
				embeddedConn.close();
			try
			{
				// shut down Derby Network Server
				DriverManager.getConnection("jdbc:derby:;shutdown=true");
			}
			catch(SQLException se)
			{
				//ignore se
			}

		}

	}

	/**
	 *  Setting the derby.drda.startNetworkServer property to true,
	 *  either in the System properties as we do here or in
	 *  the derby.properties file, will cause the Network Server to
	 *  start as soon as Derby is loaded.
	 *
	 *  To load Derby, we just need to load the embedded
	 *  driver with:
	 *  Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
	 *
	 *  Then we will test for a while and make sure it is up, before
	 *  we give up.
  	 *
	 *  Alternatively, the Network Server might be started from the command
	 *  line or from some other program. Note: only the JVM that starts
	 *  Network Server can make an embedded connection.
	 */

	public static void startNetworkServer() throws Exception
	{
		// Start the Network Server using the property
		// and then wait for the server to start by testing a connection
		startWithProperty();
		waitForStart();
	}

	/**
	 * Start Derby Network Server using the property
	 * derby.drda.startNetworkServer. This property can be set as a system property or
	 * or in the derby.properties file.
	 * Setting this property to true starts the Network Server when
	 * Derby boots up.
	 * The port at which the Derby Network Server listens can be changed
	 * by setting the derby.drda.portNumber property. By default, the server starts
	 * at port 1527.
	 * Server output goes to derby.log.
	 */

	private static void startWithProperty() throws Exception
	{
		System.out.println("Starting Network Server");
		System.setProperty("derby.drda.startNetworkServer","true");

		// Booting Derby
        Class<?> clazz = Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
        clazz.getConstructor().newInstance();
	}



	/**
	 * Tries to check if the Network Server is up and running by calling ping
	 * If successful, it returns; otherwise, it tries for 50 seconds before giving up and throwing
	 * an exception.
	 * @throws Exception when there is a problem with testing if the Network Server is up
	 * and running
	 */
	private static void waitForStart() throws Exception
	{

		// Server instance for testing connection
		org.apache.derby.drda.NetworkServerControl server = null;

		// Use NetworkServerControl.ping() to wait for the
		// Network Server to come up.  We could have used
		// NetworkServerControl to start the server, but the property is
		// easier.
		server = new NetworkServerControl();

		System.out.println("Testing if Network Server is up and running!");
		for (int i = 0; i < 10 ; i ++)
		{
			try {

				Thread.currentThread().sleep(5000);
				server.ping();
			}
			catch (Exception e)
			{
				System.out.println("Try #" + i + " " +e.toString());
				if (i == 9 )
				{
					System.out.println("Giving up trying to connect to Network Server!");
					throw e;
				}
			}
		}
		System.out.println("Derby Network Server now running");

	}

	/**
	 * Used to return an embedded Derby connection.
	 * The protocol used is "jdbc:derby:dbName" where dbName is the database name
	 * @pre the Derby embedded JDBC driver must be loaded before calling
	 * this method
	 * Alternatively, if the Derby Network Server is started in this JVM, the embedded driver
	 * org.apache.derby.jdbc.EmbeddedDriver is already loaded and it need not be loaded again.
	 * @param	dbName	database name (ie location of the database)
	 * @param 	attributes attributes for the database connection
	 *			(for example, create=true;
	 *					 upgrade=true;)
	 * @return	returns embedded database connection
	 * @throws Exception if there is any error
	 */
	public static Connection getEmbeddedConnection(String database,String attributes)
		throws Exception
	{
		String dbUrl = "jdbc:derby:"+database +";"+attributes;
		Connection conn = DriverManager.getConnection(dbUrl);
		return conn;
	}



	/**
	 * Test a connection by executing a sample query
	 * @param	conn 	database connection
	 * @throws Exception if there is any error
	 */
	public static void test(Connection conn)
		throws Exception
	{

	  Statement stmt = null;
	  ResultSet rs = null;
	  try
	  {
		// To test our connection, we will try to do a select from the system catalog tables
		stmt = conn.createStatement();
		rs = stmt.executeQuery("select count(*) from sys.systables");
		while(rs.next())
			System.out.println("number of rows in sys.systables = "+ rs.getInt(1));

	  }
	  catch(SQLException sqle)
	  {
		  System.out.println("SQLException when querying on the database connection; "+ sqle);
		  throw sqle;
  	  }
  	  finally
  	  {
		  if(rs != null)
		  	rs.close();
		  if(stmt != null)
		  	stmt.close();
 	  }

	}


	/**
	 * This method waits until the user presses Enter to stop the server
	 * and eventually exit this program
	 * Allows clients to continue to connect using client connections from other
	 * JVMs to the Derby Network Server that was started in this program
	 */
 	private static void waitForExit() throws Exception
 	{
		System.out.println("Clients can continue to connect: ");
 		BufferedReader in =
 			new BufferedReader(new InputStreamReader(System.in));
 		System.out.println("Press [Enter] to stop Server");
 		in.readLine();
	}

	/**
	 * Returns a string with information as to how to connect to Derby Network Server
	 */
	private static String ijUsage()
	{

		String ijUsage = "\nWhile my app is busy with embedded work, ";
		ijUsage += "ij might connect like this:\n\n";
		ijUsage +=  "\t$ java -Dij.user=me -Dij.password=pw -Dij.protocol=jdbc:derby://localhost:1527/ org.apache.derby.tools.ij\n";
		ijUsage += "\tij> connect '" + DBNAME + "';\n\n";

		return ijUsage;
	}
}





設定


設定はシステムレベルの設定とデータベースレベルの設定、更に作成時永続設定が存在する。

 

 


また、各設定には起動時にのみ指定できる静的設定と、起動後も随時変更できる動的な設定がある。

設定方法


設定は設定ファイルに記述するほか、起動時オプションに指定したり、動的設定であれば、コネクションに書き出すことで設定変更が可能。

設定ファイル


Derbyのホームディレクトリに「derby.properties」という名前で作成することで、起動時に自動で読み込む。

 

設定内容

 




ネットワークサーバ

 

受付インタフェース


https://db.apache.org/derby/docs/10.13/adminguide/radmindrdahost.html

 

コネクションへのログ出力


ネットワーク接続中のコネクションにログを出力するかどうか。
いずれの場合でもログファイルへの出力は行われる。

 



ログ

 

ログの追記


ログファイルはデフォルトでは起動時に上書きされてしまうが、この設定を有効にすることで、既存のログファイルに追記させることができる。

 

 

実行計画ログ出力


この設定を有効にすることで、クエリが実行されるたびに実行計画がログに出力される。
負荷がかかるが、チューニング等に役に立つ。ただし、OS名など冗長な情報も多い。

 

 



ステートメントログ出力


この設定を有効にすることで、データベースで実行されるステートメント(実行単位)がログ出力される。
1クエリーが5ステートメントに分解されるなど、ログが多量に出る割には余り有用な情報は出力されない。

 

 







運用

 

起動


デフォルトの動作として、CentOSではIPv6が有効な場合、Java系のネットワークサーバプロダクトはデフォルトで受付インタフェースとしてIPv6のみを許可する。
また、IPv6を無効にした場合は受付インタフェースとしてループバックアドレスのみ許可する。
従って、Derby使用時にはIPv4アドレスで外部のホストから接続を許可したい場合、明示的に接続できるIPアドレスを指定しなければならない。
特定のインタフェースに割り当てられたIPアドレスを指定することで、そのIPアドレスを持つインタフェースのみ接続を許可することができる。
「0.0.0.0」を指定すれば、すべてのインタフェースで接続を許可することができる。

 




起動時にサーバのホスト名に解決できないものを設定している場合次のようなWarningが出る。
※derbyというホスト名に設定した場合

Fri May 26 14:01:35 JST 2017 : Warning: UnknkownHostException: derby: derby: Name or service not known.

無視しても問題ないが、気になる場合、次のように設定してから起動する。

hostname localhost

または

hostname <自身のIPアドレス>

 

停止

 

stopNetworkServer -h \
 `ip address | grep "inet " | grep -v "127.0.0.1" | sed -e "s/^[^0-9]*//g" -e "s/\/.*//g"`

 

トラブルシューティング

 

Derbyに接続できない

 

自作のプログラムから接続できない

 

エラーXSDB6(エラーXJ040)

 

 

 

 

ijから接続できない

 

エラーXSDB6(エラーXJ040)

 

 

 



ツール


$DERBY_HOME/bin配下にインストールされている。

NetworkServerControl

 

[root@derby derby]# NetworkServerControl
Fri May 26 15:04:54 JST 2017 : No command given.
Usage: NetworkServerControl <commands>
Commands:
start [-h <host>] [-p <port number>] [-noSecurityManager] [-ssl <ssl mode>]
shutdown [-h <host>][-p <port number>] [-ssl <ssl mode>] [-user <username>] [-password <password>]
ping [-h <host>][-p <port number>] [-ssl <ssl mode>]
sysinfo [-h <host>][-p <port number>] [-ssl <ssl mode>]
runtimeinfo [-h <host>][-p <port number>] [-ssl <ssl mode>]
logconnections { on|off } [-h <host>][-p <port number>] [-ssl <ssl mode>]
maxthreads <max>[-h <host>][-p <port number>] [-ssl <ssl mode>]
timeslice <milliseconds>[-h <host>][-p <port number>] [-ssl <ssl mode>]
trace { on|off } [-s <session id>][-h <host>][-p <port number>] [-ssl <ssl mode>]
tracedirectory <trace directory>[-h <host>][-p <port number>] [-ssl <ssl mode>]

 

 

スクリプトの変更


このスクリプトは実行時のカレントディレクトリを起点としてログファイルの生成、設定ファイルの読み込みなどを行う。
いずれのディレクトリにおいても$DERBY_HOMEディレクトリが起点となるように変更した方が良い。

sed -i.original -e "s/derby_exec_command=/cd \$DERBY_HOME\nderby_exec_command=/g" bin/derby

 

ネットワークサーバ起動


プロセスを分離しないとコントロールが戻らなくなる。

NetworkServerControl start &


初期設定にてすべてのインタフェースで接続を有効にしているが、デフォルトの動作として、CentOSではIPv6が有効な場合、Java系のネットワークサーバプロダクトはデフォルトで受付インタフェースとしてIPv6のみを許可する。
また、IPv6を無効にした場合は受付インタフェースとしてループバックアドレスのみ許可する。
従って、Derby使用時にはIPv4アドレスで外部のホストから接続を許可したい場合、明示的に接続できるIPアドレスを指定しなければならない。
特定のインタフェースに割り当てられたIPアドレスを指定することで、そのIPアドレスを持つインタフェースのみ接続を許可することができる。
「0.0.0.0」を指定すれば、すべてのインタフェースで接続を許可することができる。

NetworkServerControl start -h <IPアドレス>

 

IPアドレス

 

 

ネットワークサーバ停止

 

NetworkServerControl shutdown

特定のIPアドレスを指定して起動している場合は-hオプションにより、IPアドレスを指定する。





dblook


データベースの情報からDDL文を復元するツールである。
このツール以外にDDL文を復元する方法はない。

 

使い方


いずれにおいてもユーザ定義のDDLのみ表示可能で、システムが定義したDDLは表示されない。

データベース全てのDDLを生成する

 

dblook -d jdbc:derby:<IPアドレス>:1527/<DB名>

 

テーブルを指定してDDLを生成する


指定したテーブルに関連付けれているインデックスなども表示される

dblook -d jdbc:derby:<IPアドレス>:1527/<DB名> -t <テーブル名>

 

ヘルプ

 

[root@derby derby]# dblook

 Usage:
 java org.apache.derby.tools.dblook -d <source database url> [options]

        where the source URL is the full URL, including the connection protocol
        and any connection attributes that might apply.  For example, use
        'jdbc:derby:myDB', or 'jdbc:derby://localhost:1527/myDB;user=usr;'.

        options include:

        -z <schema name> to specify a schema to which the DDL generation
         should be limited.  Only database objects with that schema will have
         their DDL generated.

        -t <table one> <table two> ... to specify a list of tables for which
         the DDL will be generated; any tables not in the list will be ignored.

        -td <value> to specify what should be appended to the end
         of each DDL statement.
                This defaults to ';'.

        -noview to prevent the generation of DDL for views.

        -append to keep from overwriting the output files.

        -verbose to have error messages printed to the console (in addition
         to the log file).  If not specified, errors will only be printed to the
         log file.

        -o <filename> to specify the file name to which the generated DDL
         will be written.
                If not specified, default is the console.



ij


DerbyのCLIクライアントツール。

スクリプトの修正


ijは明示的に指定しない限りij用設定ファイルを読み込まない。
そこで、ij用のデフォルト設定ファイルを読み込むように変更する。
設定ファイルを読み込むオプション(-p <設定ファイルパス>)を指定した場合、二つ目以降のオプションは無視されるので、正常に動作する。

また、ijスクリプトは実行時のカレントディレクトリをデータベースのストレージパスとして扱う。
その為、データベースを作成した時と異なるパスで再度ijでデータベースにアクセスしようとしてもアクセスできない。
いずれのディレクトリにおいても$DERBY_HOMEディレクトリが起点となるように変更する。

  1. ij用設定ファイルが未作成の場合、作成しておく
    touch $DERBY_HOME/ij.properties
  2. スクリプトを変更する
    この時バックアップを作成しておく(ij.original)
    sed -i.original -e "s/\$@\"/\$@ -p \$DERBY_HOME\/ij.properties\"/g" -e "s/derby_exec_command=/cd \$DERBY_HOME\nderby_exec_command=/g" $DERBY_HOME/bin/ij


以下の行を変更している

[root@eldorado-of derby]# diff bin/ij bin/ij.original
191,192c191
< cd $DERBY_HOME
< derby_exec_command="exec \"$JAVACMD\" $DERBY_OPTS -classpath \"$LOCALCLASSPATH\" org.apache.derby.tools.ij $@ - p $DERBY_HOME/ij.properties"
---
> derby_exec_command="exec \"$JAVACMD\" $DERBY_OPTS -classpath \"$LOCALCLASSPATH\" org.apache.derby.tools.ij $@"



起動


起動時には設定ファイルを指定することが可能。
設定ファイルを指定しない場合、設定ファイルが読み込まれることはない。
オプションを直接指定することはできないので設定ファイルに記述のして、そのファイルを渡す必要がある。
設定ファイルを指定するオプションを複数回指定した場合、最初のもののみ読み込まれ、2番目以降のものは無視され、設定ファイルが存在しなくてもエラーにならない。
起動後は対話的に処理を実行していく。

 

 

終了

 

exit;

 

ヘルプ

 

help;

 

 

接続


ループバックアドレスで接続が受け付けられている必要がある。

connect '<URL>';

通常は以下のように指定する

connect 'jdbc:derby://127.0.0.1:1527/<DB名>';

DBがない場合は新規作成する場合は以下のようにする。

connect 'jdbc:derby://127.0.0.1:1527/<DB名>;create=true';

設定ファイルでオプション”ij.protocol”をJDBCに指定することで、プロトコル、接続先を省略可能で、ローカルサーバのDB名のみを指定して接続可能になる。
その場合、以下のようになる。

connect '<DB名>';
connect '<DB名>;create=true';


接続に成功すると、以降SQLを発行可能である。

切断

 

disconnect;

 

コメント


“–“で開始する

--comment

“/*”と”*/”でくくる

/*
comment
*/

 

クエリ直接実行


標準入力のリダイレクトを用いてijの引数に直接SQLを与えて実行する。
末尾のセミコロンは省略してもよい。

ij <(echo "select * from table1")


記号の入力が多く面倒であるため、以下のようにスクリプトを作成すると便利である。

cat > bin/qtoderby << EOT
ij <(echo "\$*")
echo ""
EOT
chmod 744 bin/qtoderby


アスタリスク(*)、シングルクォート(‘)、ダブルクォート(“)、丸括弧(())を入力する際はバックスラッシュでエスケープするか(\*)、クエリ全部をダブルクォーテーションでくくらなければならないが、それ以外は引数としてそのままクエリを記述可能である。

 

設定ファイル


サーバ用プログラムと同様に設定ファイルを用意することで、特定の設定を有効にした状態で、ijを使用できる。
設定ファイルは自動で読み込まれず、明示的に指定する必要がある。
その為、設定ファイルを特定の名前にする必要はない。

 

接続プロトコル


デフォルトのDBサーバ接続プロトコルを指定する。



接続データベース

 

 

 

 

接続名


ij使用中にURLをすべて記載せずに、設定した簡単な接続名を指定して接続することが可能

ij.connection.<接続名> = <URL>

 

例外出力


例外発生時に例外の内容をすべて出力するかどうか

ij.exceptionTrace = { true | false }

 

一行あたり出力最大長

 

ij.maximumDisplayWidth = <最大長>

 

結果のファイル出力

 

ij.outfile = <ファイル名>

 

ログイン情報

 

 

プロトコル名

 

ij.protocol.<プロトコル名> = <プロトコル>

 

エラーコード表示


エラーコードを表示するかどうか。
エラーコードはエラーの重大度で、エラーの内容を表すエラー識別子とは別のものである。

ij.showErrorCode = { true | false }

 

起動時接続名表示


ij起動時に自動接続するよう設定している場合に、接続先を表示するかどうか

ij.showNoConnectionsAtStart = { true | false }

 

SELECT結果行数表示


ij.showNoCountForSelect = { true | false }

組み込みモード時URLチェック


組み込みモードで使用する際に指定したURLのチェックを行うかどうか。
DerbyのJDBC以外を使用する場合にこのオプションを無効かする。

 

 

文字コード、ロケール



 




setEmbeddedCP


Javaアプリケーションで組み込んで使用するためのクラスパスを設定するスクリプト。
直接実行してもスクリプト中で設定した環境変数はスクリプト内でしか有効にならないので、自作のスクリプト内で使用する。インストール時に含まれているツールでこのスクリプトを使用しているものはない。
その為、自身で明示的にこのスクリプトを使用しないのなら削除してしまっても問題ない。

setNetworkClientCP


Derbyサーバへクライアントとしてアクセスするためのクラスパスを設定するスクリプト。
直接実行してもスクリプト中で設定した環境変数はスクリプト内でしか有効にならないので、自作のスクリプト内で使用する。インストール時に含まれているij、dblook等のツールは内部で独自に設定を行っている。
その為、自身で明示的にこのスクリプトを使用しないのなら削除してしまっても問題ない。

setNetworkServerCP


Derbyをサーバとして使用するためのクラスパスを設定するスクリプト。
直接実行してもスクリプト中で設定した環境変数はスクリプト内でしか有効にならないので、自作のスクリプト内で使用する。インストール時に含まれているstartNetworkServer、NetworkServerControl等のツールは内部で独自に設定を行っている。
その為、自身で明示的にこのスクリプトを使用しないのなら削除してしまっても問題ない。

startNetworkServer


サーバモードで起動するスクリプト。
NetworkServerControlにてサーバの管理ができるので、基本的に使用しない。

 

stopNetworkServer


サーバモードで起動しているDerbyを停止するスクリプト。
NetworkServerControlにてサーバの管理ができるので、基本的に使用しない。

sysinfo


JAVAやOSのバージョンなどのシステム情報を表示する。
NetworkServerControlからでも行えるの削除してしまってもよい。(NetworkServerControl sysinfo)

 

derby.war


データベースサーバ管理のWEBアプリケーション。

 

 

PlanExporter


実行計画の結果出力ツール。
実行計画の生成自体はijコマンド中で行えるが、結果表示が困難なため、別途このツールを用いてファイル出力して確認する。



 

手順


実行計画は常に生成できるわけではなく、機能を有効にしたときのみ生成できる。
機能を有効にすると、その間中に発行された全てのクエリで実行計画が生成される。
また、実行計画を生成すると、すぐに表示されるわけではなく、専用のテーブルに格納される。
実行計画生成終了後に機能を無効にしてから、それを閲覧することになるが、結果は複数のテーブルに分散されており、MySQLのように垂直表示(\G)ができないため、非常に見づらい。
その為、一旦ijを終了し、XML形式かHTML形式でファイル出力してから見た方が良い。

実行計画の生成結果は指定したスキーマに専用のテーブルが作成され、そこに保存される。
以下では専用のスキーマとして「XPLAIN」を指定している。

  1. ijを起動する
    ij
  2. DBに接続する
  3. 実行計画を有効にする
    CALL SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS(1);
    CALL SYSCS_UTIL.SYSCS_SET_XPLAIN_SCHEMA('XPLAIN');
  4. 任意のSQLを発行する
  5. 実行計画を無効にする
    CALL SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS(0);
    CALL SYSCS_UTIL.SYSCS_SET_XPLAIN_SCHEMA('');
  6. 結果一覧を表示する
    select stmt_text, stmt_id from XPLAIN.SYSXPLAIN_STATEMENTS;
    この後でファイル出力する際にここで表示される”statement ID”が必要になる。
  7. ijを終了する
    exit;
  8. 結果をファイル出力し、表示する
    全て一度に出力できず”statement ID”を変更して1度ずつ実行しなければならない。
    ファイル名を変更しない場合、上書きされるので、1つずつ結果確認しなければならない。
    ※指定するスキーマ名は大文字にしなければならない。
    java -classpath $DERBY_HOME/lib/derbytools.jar:$DERBY_HOME/lib/derby.jar org.apache.derby.tools.PlanExporter jdbc:derby:test XPLAIN <statement ID> -xml xplain.xml; cat xplain.xml; cat xplain.xml;

 

生成されるテーブル

 





その他



http://executequery.org/index.php
http://eclipsesql.sourceforge.net/
http://squirrel-sql.sourceforge.net/


アプリケーション開発


http://db.apache.org/derby/docs/10.13/ref/index.html

サンプルプログラム

 

JDBC利用サンプル


このサンプルを実行すると「jdbcTest」データベースが作成される

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLTransactionRollbackException;
import java.sql.Statement;
import java.sql.Timestamp;

public class JDBCTest
{
	public static void main(String[] args)
	{
		String dbName = "jdbcTest";
		String tableName = "table1";
		String connectionURL = "jdbc:derby://192.168.0.51:1527/" + dbName + ";create=true";
		
		String createQuery = "CREATE TABLE " + tableName
				+ " (id INT NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, "
				+ " when TIMESTAMP DEFAULT CURRENT_TIMESTAMP, " + " val VARCHAR(32) NOT NULL) ";
		String trancateQuery = "TRUNCATE TABLE " + tableName;
		String insertQuery = "INSERT INTO " + tableName + "(val) values (?)";
		String selectQuery = "select id, when, val from " + tableName + " order by when";
		
		try(Connection connection = DriverManager.getConnection(connectionURL);
				Statement statement = connection.createStatement();)
		{
			
			System.out.println("Connected to database : " + dbName);
			try
			{
				statement.execute(createQuery);
				System.out.println("New table created : " + tableName);
			}
			catch(SQLTransactionRollbackException e)
			{
				if(e.getSQLState().equals("X0Y32"))
				{
					System.out.println("Already exists table : " + tableName);
				}
				else
				{
					throw e;
				}
			}
			
			System.out.println();
			
			BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
			
			System.out.println("program exits if enter \"e\"");
			System.out.println("data are cleared if enter \"c\"");
			
			try(PreparedStatement insertPreparedStatement = connection.prepareStatement(insertQuery);)
			{
				while(true)
				{
					System.out.print("enter string > ");
					String input = reader.readLine();
					if(input.length() == 0)
						continue;
					
					if(input.equals("e"))
						break;
					
					if(input.equals("c"))
					{
						statement.execute(trancateQuery);
						continue;
					}
					
					insertPreparedStatement.setString(1, input);
					insertPreparedStatement.executeUpdate();
					
					ResultSet resultSet = statement.executeQuery(selectQuery);
					
					System.out.println("--------------------------------------------------");
					while(resultSet.next())
					{
						String key = resultSet.getString(1);
						Timestamp when = resultSet.getTimestamp(2);
						String val = resultSet.getString(3);
						System.out.println(when + " : " + val + " (" + key + ")");
					}
					resultSet.close();
					System.out.println("--------------------------------------------------");
				}
			}
		}
		catch(Throwable e)
		{
			System.out.println("! ERROR !");
			e.printStackTrace();
		}
		System.out.println("Closed connection");
	}
}




SQL

 

 

 

 

数値

 

整数

 

SMALLINT


2 bytes

INT / INTEGER


4 bytes

BIGINT


8 bytes

実数

 

REAL


4 bytes

DOUBLE


8 bytes

文字列

 

VARCHAR


可変文字列で指定可能な最大長が32,672byte

LONG VARCHAR


可変文字列である点はVARCHARと同じだが、作成時に明示的に最大長を指定する必要はない。
最大長は32,700byteで固定。

VARCHAR FOR BIT DATA


可変文字列で、バイナリを含ませることができる。
最大長は32,672 bytes。

 

 

CLOB


可変文字列で指定可能な最大長が2,147,483,647byte。

 

時刻

 

DATE


年月日を扱える

TIME


時分秒(秒は小数点異常のみ)を扱える

TIMESTAMP


全ての時間を扱える。
つまり、年月日時分秒(秒は小数点以下9桁)を扱える。

テーブル

 

作成

 

CREATE table <テーブル名>
  {
      ( {column-definition | Table-level constraint}
      [ , {column-definition | Table-level constraint} ] * )
  |
      [ ( column-name [ , column-name ] * ) ]
      AS query-expression
      WITH NO DATA
   }

 

再作成


テーブルのデータを全て破棄する。
あくまでデータのみで、関連付けられているインデックスなどは破棄されないし、”generated identity”句を使用した自動採番の数は1に初期化されない。

truncate table <テーブル名>;

 

破棄


テーブルをデータ、定義毎破棄する。
関連付けられているインデックスなどがあれば、同時に破棄される。

drop table <テーブル名>;

 

制約

 

主キー

 

単独の列を指定する



複数の列で構成する

 

create table TEST (
	NAME1 varchar(64) not null,
	NAME2 varchar(64) not null,
	VALUE varchar(256),
	primary key (NAME1, NAME2)
);

 

インデックス

 

作成



 

 

 

 

挿入

 

insert into <テーブル名> (<列名1>, <列名2>, ...) values (<値1>, <値2>, ...);


全ての列に値を代入する場合は、列名の指定を省略できる。

insert into <テーブル名> values (<値1>, <値2>, ...);


値に文字列を指定するときはダブルクォーテーションでなく、シングルクォーテーションで囲まなければならない。

自動生成列の取得


自動で値を生成するよう設定した列の値を挿入時に返すようにするには、次のようにSQLを実行する。

 

 

 

 

 





LIMIT


結果の内、指定の行数だけを取得する。
OFFSET句を付加することで、先頭から指定の行だけスキップすることが可能。
OFFSET句のみを単独で使用することはできない。
単独で使用する場合はこちらを使用する。
LIMIT句は{}で括らないとエラーになるので注意。



OFFSET


結果の内、先頭から指定の行だけ取得しない



FETCH


結果の内、指定の行数だけを取得する

 

エラー


https://builds.apache.org/job/Derby-docs/lastSuccessfulBuild/artifact/trunk/out/ref/rrefexcept71493.html

SQLSTATE: XSDB6


接続しようとしたDBが使用中である。
他のアプリケーションが使用しているか確認する。(ijによる接続も含む)
Derbyは起動中には1種類のアプリケーション(1種類のJVMインスタンス、1種類のクラスローダー)からしか接続を受け付けない。
従って、1度何らかのアプリケーションからアクセスすると他のアプリケーションからはDerbyを再起動しない限りアクセスできない。
ただし、ネットワークサーバモードで起動することで各接続がネットワークサーバインタフェースを中継することで隠ぺいされ、単一のJVMからの接続とDerbyの管理モジュールは認識する為、同時に複数の接続元からアクセス可能となる。
つまり、ネットワークサーバモードで起動している場合、ijで接続する際もローカル接続ではなく、ネットワーク接続を行う必要がある。

PROCEDURE

 

作成例





Derbyについて

 

データ管理構造

 

データベース


データベースは1つのDerbyインスタンスにおける、データ階層の最大の単位である。

 

find $DERBY_HOME/ -maxdepth 1 -type d | egrep -v "/$|bin|lib|logs" | sed "s/.*\///g"

 

 

スキーマ


各データベースにはスキーマ(名前空間のようなもの)が存在し、ユーザはスキーマ配下にテーブルなどのオブジェクトを作成する。
Derbyではユーザがオブジェクトを作成する際、デフォルトでは”APP”スキーマが指定される。
その他のデフォルトで作成されるスキーマはDerby内部で利用されるもので、参照のみ可能である。

 

 

テーブル

 

デフォルトテーブル


データベースを作成すると、デフォルトでいくつかのテーブルが作成される。

 

SYSSTATEMENTS

 

select * from sys.SYSSTATEMENTS;

 

STMTID                              |STMTNAME |SCHEMAID                            |&|VALID|TEXT                                                                                                                              |LASTCOMPILED |COMPILATIONSCHEMAID |USINGTEXT
----------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------- ---------------------------------------------
286cc01e-015d-de6b-fdd6-000000c97380|getUDTs  |8000000d-00d0-fd77-3ed8-000a0a0b1900|S|false|SELECT CAST (NU LL AS VARCHAR(128)) AS TYPE_CAT, CASE WHEN (SCHEMANAME IS NULL) THEN CAST (NULL AS VARCHAR(128)) ELSE SCHEMANAME& |NULL
...

 

SYSTABLES

 

select * from sys.SYSTABLES;

 

TABLEID                             |TABLENAME         |&|SCHEMAID                            |&
------------------------------------------------------------------------------------------------
80000010-00d0-fd77-3ed8-000a0a0b1900|SYSCONGLOMERATES  |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
80000018-00d0-fd77-3ed8-000a0a0b1900|SYSTABLES         |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
8000001e-00d0-fd77-3ed8-000a0a0b1900|SYSCOLUMNS        |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
80000022-00d0-fd77-3ed8-000a0a0b1900|SYSSCHEMAS        |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
8000002f-00d0-fd77-3ed8-000a0a0b1900|SYSCONSTRAINTS    |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
80000039-00d0-fd77-3ed8-000a0a0b1900|SYSKEYS           |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
8000003e-00d0-fd77-3ed8-000a0a0b1900|SYSDEPENDS        |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
c013800d-00d7-ddbd-08ce-000a0a411400|SYSALIASES        |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
8000004d-00d0-fd77-3ed8-000a0a0b1900|SYSVIEWS          |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
80000056-00d0-fd77-3ed8-000a0a0b1900|SYSCHECKS         |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
8000005b-00d0-fd77-3ed8-000a0a0b1900|SYSFOREIGNKEYS    |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
80000000-00d1-15f7-ab70-000a0a0b1500|SYSSTATEMENTS     |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
80000000-00d3-e222-873f-000a0a0b1900|SYSFILES          |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
c013800d-00d7-c025-4809-000a0a411200|SYSTRIGGERS       |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
f81e0010-00e3-6612-5a96-009e3a3b5e00|SYSSTATISTICS     |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
c013800d-00f8-5b70-bea3-00000019ed88|SYSDUMMY1         |S|c013800d-00f8-5b53-28a9-00000019ed88|R
b8450018-0103-0e39-b8e7-00000010f010|SYSTABLEPERMS     |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
286cc01e-0103-0e39-b8e7-00000010f010|SYSCOLPERMS       |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
2057c01b-0103-0e39-b8e7-00000010f010|SYSROUTINEPERMS   |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
e03f4017-0115-382c-08df-ffffe275b270|SYSROLES          |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
9810800c-0121-c5e2-e794-00000043e718|SYSSEQUENCES      |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
9810800c-0121-c5e1-a2f5-00000043e718|SYSPERMS          |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
9810800c-0134-14a5-40c1-000004f61f90|SYSUSERS          |S|8000000d-00d0-fd77-3ed8-000a0a0b1900|R
a65c80ac-015d-de6b-fdd6-000000c97380|TEST              |T|80000000-00d2-b38f-4cda-000a0a412c00|R

24 rows selected

 

SYSCOLUMNS


テーブルの列情報を取得できる。
列名、定義、自動採番列の現在付与済みの番号などが分かる。
ただし、現在付与済みの番号はcommitされていない場合は表示されないものの、その番号は次回付与されないので、必ずしも次の採番は現在の値+1というわけではない。

select * from SYS.SYSCOLUMNS

 

URL


Derbyに接続する際、URLの形式で接続先を指定する。
Derby用のJDBCを用いる一般的な使用方法では以下のようになる。

ネットワーク接続

 

jdbc:derby:{<IPアドレス>|<ホスト名>}:1527/<DB名>

 

ローカル接続

 

jdbc:derby:<DB名>

 

オプション


URLの末尾にオプションを付加することができる。
オプションは”;”(セミコロン)をつけ、その後に記述する

DBの作成


このオプションは接続時にデータベースがなかった場合は作成したうえで接続するかどうかを指定する。

create={ true | false }

 

ストアドプロシージャ


DerbyではDerby内に保存して実行できるユーザ定義手続きにPROCEDUREとFUNCTIONの2種類が存在する。
両者とも、ユーザが独自のJavaメソッドを作成し、jar化してクラスパスを通すことで、任意の自作メソッドを呼び出すことができる機能である。
メソッド内でDBのデータを扱う場合はJDBC経由でアクセスする。

 

 

 

動作

 

ネットワークサーバモード

 

起動


Derbyを起動させても各データベースはすぐに使用可能にならない。
各データベースへ接続(ローカル接続も含む)があって初めて、使用可能な準備が行われる。
この準備を”boot”と呼ぶ。
bootされたデータベースはロックされ、接続しようとしたJVM、またはクラスローダーしか使用できないようになる。
オプションによって1つのデータベースがbootされたら他のデータベースもbootすると設定することが可能。
このbootプロセスがあるため、Derbyを起動後すぐにサービスインさせるのではなく、一旦何らかの接続を行ってからサービスインすると、すぐに使用可能となる。
これはキャッシュを有効にしている場合は、なおさら行うべき処理である。


リソース制限


Derbyには以下のリソース制限が存在する。

 

 

 

 

 

 

 

ファイル構成

 

ページ


テーブルとインデックスはOSで定められたページ単位に管理されるが、ページは2種類作成される。
1種類はデータそのものであるが、もう1種類は管理情報を格納するページである。
この管理用のページはデータ用のページが最大8ページになるまで1ページで管理できる。
それ以上になると、もう1ページ管理用のページが作成される。


パフォーマンスチューニング


https://builds.apache.org/job/Derby-docs/lastSuccessfulBuild/artifact/trunk/out/tuning/index.html


Notice: Trying to get property 'queue' of non-object in /usr/local/wordpress/wp-includes/script-loader.php on line 2876

Warning: Invalid argument supplied for foreach() in /usr/local/wordpress/wp-includes/script-loader.php on line 2876