Derby
Apache Derby
データベースサーバー起動
組込モードで使用
組込モードの場合、厳密には「起動」とはいわないのかもしれません。この状態においては、複数のJVMからアクセスすることはできません。Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection connection = DriverManager.getConnection(
"jdbc:derby:/derbydata/data;create=true",
"userid", "password");
- 上記の例の場合、\derbydata\dataフォルダ内にデータベースのファイルが格納されることとなります。
ネットワークモードで使用
ネットワークモードで起動することにより、複数のJVM(及び別端末)からアクセスすることができます。- NetworkServerControlを使用する
NetworkServerControl derbyServer = null;
derbyServer = new NetworkServerControl(InetAddress.getByName("localhost"), 1527);
File f = new File("derby.log");
derbyServer.start(new PrintWriter(new OutputStreamWriter(new FileOutputStream(f, true))));
- Setvletに組み込んで使用する場合(それ以外の場合も)は、NetworkServerControlをSingletonで保持するようにするといいかと思います。
- なお、基本的に、ここで指定しているホスト名以外からのアクセスは拒絶されます。従って、localhostで指定した場合は実質別端末からのアクセスはできなくなります。
- なので、DBサーバを起動するマシンと、DBサーバへアクセスするマシンが異なる場合はDBサーバのホスト名(例えばderbydbsvrなど)で起動する必要があります。
- start(PrintWriter)の引数にnullをセットすると、ログ出力がオフになります。
データベースコネクション取得
- 組込モードの場合、データベースの起動とコネクション取得は同じ処理となります。ので、ここでの内容はネットワークモードで使用している場合の話となります。
データソースを使用する場合
- いずれの場合も、作成したデータソースからgetConnection()(あるいはgetConnection(String, String))でコネクションを取得すればOKです。
Derbyのデータソースを使用する場合
- JNDIを使用せずにデータソースを初期化することができます。
ClientDataSource cds = new ClientDataSource();
cds.setConnectionAttributes("create=true");
cds.setPortNumber(1527);
cds.setDatabaseName("\\derbydata\\testdb");
cds.setServerName("localhost");
cds.setUser("user");
cds.setPassword("password");
- setDatabaseNameの時に指定するのは、物理パスでの指定となることに注意。
- jdbc:derby://localhost:1527/\derbydata\testdbという指定ではなく、\derbydata\testdbの部分のみを指定することになります(ホスト名及びポート番号は別途指定)。最初データソースの初期化に失敗し、しばらく悩んでいたのですが原因はこの部分でした(苦笑)。
- 多くの場合、作成したDataSourceをjavax.sql.DataSourceの変数(Singleton)に代入することになるかと思います。
- ClientDataSourceではなく、ClientConnectionPoolDataSourceを使用するとコネクションプールが実現できるのではないかと思います。
Jakarta Commons DBCPを使用する場合
- Jakarta Commons DBCPを使用してデータソースの初期化を行います。
Class.forName("org.apache.derby.jdbc.ClientDriver");
dataSource = new PoolingDataSource();
pool = new StackObjectPool();
ConnectionFactory conFactory = new DriverManagerConnectionFactory("jdbc:derby://localhost:1527/C:/derbydata/\\derbydata\\testdb","user","password");
new PoolableConnectionFactory(conFactory, pool, null, null, false, true);
dataSource = new PoolingDataSource(pool);
- ここのdataSourceはjavax.sql.DataSourceです。
JNDIを使用する場合
- リソースの登録を行います(下記はTomcat5.5の場合のserver.xmlのサンプル)。
<Resource name="jdbc/derby" auth="Container" type="javax.sql.DataSource"
maxActive="10" maxIdle="2" maxWait="10000"
username="user" password="password"
driverClassName="org.apache.derby.jdbc.ClientDriver"
url="jdbc:derby://localhost:1527/\derbydata\testdb"
/>
- データソースを初期化します。
Context ctx = new InitialContext();
dataSource = (DataSource)ctx.lookup("java:comp/env/jdbc/derby");
- 必要に応じて、接続時にID/PWを指定する。
- getConnection(id, pw)
データソースを使用しない場合
Connection connection = null;
Class.forName("org.apache.derby.jdbc.ClientDriver");
connection = DriverManager.getConnection("jdbc:derby://localhost:1527/\\derbydata\\testdb", "user", "password");
- まぁ、ごく普通の接続方法です。上記の場合だと、\derbydata\testdbフォルダ内に各種ファイルが作成されることとなります。
データベースサーバー終了
組込モードで起動している場合
try {
DriverManager.getConnection("jdbc:derby:;shutdown=true");
} catch (SQLException e) {
if (!"Derby システムがシャットダウンされました。".equals(e.getMessage())) throw e;
}
- シャットダウンに成功した場合でも、必ずSQLExceptionがスローされます。
ネットワークモードで起動している場合
- NetworkServerControl#shutdown()メソッドを使用します。
derbyServer.shutdown();
- Serverに組み込んでいる場合は、コントローラ・サーブレットのdestroy()メソッド内で呼び出すようにしておくといいかと思います。
その他
スキーマの指定
- SQLにおいてスキーマ名を指定しなかった場合、接続しているユーザ名がスキーマ名として自動的に付加されるようです。例えば、testuserで接続していて、"SELECT * FROM HOGE"というようなSQLを実行した場合、"SELECT * FROM testuser.HOGE"として実行されるようです。
- スキーマの存在チェックで、これに気付かずにはまりました(^^;
スキーマの存在チェック
- 以下のようなSQLで検索することで、スキーマが存在しているかどうかをチェックすることが可能。
- CREATE SCHEMAを行う必要があるかどうかの事前チェックの場合などに使用することを想定。
SELECT SCHEMANAME FROM SYS.SYSSCHEMAS WHERE SCHEMANAME=?
- 当然のことながら、ResultSetをチェックして存在の有無を判断することとなります。
テーブルの存在チェック
- 以下のようなSQLで検索することで、テーブルが存在しているかどうかをチェックすることが可能です。
SELECT ST.TABLENAME FROM SYS.SYSTABLES AS ST,SYS.SYSSCHEMAS AS SS WHERE ST.SCHEMAID=SS.SCHEMAID AND SS.SCHEMANAME=? AND ST.TABLENAME=?
- スキーマの存在チェックの時と同様に、ResultSetをチェックして存在の有無を判断することとなります。
2006年12月15日(金) 13:53:17 Modified by syo1976