2009年9月5日土曜日

Monoで他のDBも使ってみたよ!+(db4o、NHibernate編)7

このエントリーをはてなブックマークに追加

おまけ

セットアップ上の変更点、および各RDBMS用NHibernateコンフィグファイルについて。

SQLite

標準で導入されているsqlite3パッケージの使用で問題ありません。

PostgreSQL

セットアップ上の変更点
「PostgreSQL 8.3.7」はAPTから導入可能です。

$ sudo apt-get install postgresql

 リモート接続用の設定を行います。

[/etc/postgresql/8.3/main/postgresql.conf の修正例]
...
# 修正
#listen_addresses = 'localhost'
listen_addresses = '*'
...

[/etc/postgresql/8.3/main/pg_hba.conf の修正例]
...
# 修正、なければ追加
# IPv4 remote connections:
host    all         all         192.168.1.0/24        md5
...
リモート接続用にユーザーを作成して、「データベースの作成」以降の操作は、当ユーザで行いました(「データベースクラスタの作成」はパッケージ導入時に行われるので不要)。

[実行例]
$ su - postgres
$ createuser -P sta
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
$ exit
$ createdb TestData
$ psql TestData -f ~/src/sql/postgresql/Products.sql
NHibernateコンフィグファイル

[PostgreSQL.cfg.xml(PostgreSQL用)]
<?xml version="1.0" encoding="utf-8"?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
  <session-factory name="NHibernateExample.Test">
    <property name="connection.driver_class">NHibernate.Driver.NpgsqlDriver</property>
    <property name="connection.connection_string">
      Server=192.168.1.5;
      Port=5432;
      User Id=sta;
      Password=password;
      Database=TestData;
    </property>
    <property name="show_sql">false</property>
    <property name="dialect">NHibernate.Dialect.PostgreSQLDialect</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
    <mapping file="Product.hbm.xml" />
  </session-factory>
</hibernate-configuration>
データプロバイダアセンブリをMONO_PATH等で設定されている検索可能な場所に置く必要があります。

$ cd ~/lib
$ ln -s /opt/mono/2.4/lib/mono/2.0/Npgsql.dll .

MySQL

セットアップ上の変更点
「MySQL 5.1」は、APTから導入可能です。

$ sudo apt-get install mysql-server-5.1

 キャラクタセット、デェフォルトストレージエンジンの設定は「/etc/mysql/my.cnf」で行えます。

[/etc/mysql/my.cnf の設定例]
...
[client]
# 追加
default-character-set=utf8

[mysqld]
# 追加
default-character-set=utf8
default-storage-engine=INNODB

# コメント化
#bind-address  = 127.0.0.1
...
「Connector/Net 6.0.3」をソースからビルドした場合、ソース資源内の「Connection.cs」でエラーが発生します。原因は、継承元(System.Data.Common.DbConnection)にDbProviderFactoryプロパティが実装されていないためですが(Mono 2.4.2以降では実装済)、次の一時的な処置でとりあえずの動作確認は可能です。

[Connection.cs の一時的な修正]
...
//protected override DbProviderFactory DbProviderFactory
protected DbProviderFactory DbProviderFactory
...
NHibernateコンフィグファイル

[MySQL.cfg.xml(MySQL用)]
<?xml version="1.0" encoding="utf-8"?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
  <session-factory name="NHibernateExample.Test">
    <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
    <property name="connection.connection_string">
      Server=192.168.1.5;
      Database=TestData;
      Uid=sta;
      Pwd=password;
      CharSet=utf8
    </property>
    <property name="show_sql">false</property>
    <property name="dialect">NHibernate.Dialect.MySQLDialect</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
    <mapping file="Product.hbm.xml" />
  </session-factory>
</hibernate-configuration>
データプロバイダアセンブリをMONO_PATH等で設定されている検索可能な場所に置く必要があります。

$ cd ~/lib
$ ln -s /opt/mono/2.4/lib/mono/2.0/MySql.Data.dll .

SQL Server

セットアップ上の変更点
「SQL Server 2008 Express Edition SP1」はダウンロードセンターからダウンロード可能です。

 データベース権限の付与の際、「ON データベース名」の指定が不要でした。

[ユーザーに権限(例:CONTROL)の付与]
> sqlcmd -S localhost\SQLEXPRESS
1> USE TestData;
2> GRANT CONTROL TO sta
3> GO

 Windows 7のファイアウォールが有効な場合、リモート接続のためのポートの登録が必要になります。

 [コントロールパネル]-[システムとセキュリティ]-[Windows ファイアウォール]-[詳細設定]-[受信の規則]-[新しい規則...]を選択し、

  • 規則の種類: ポート
  • プロトコル: TCP
  • ローカルポート: 49174
  • 名前: SQL Server 2008 Express

を設定します。
NHibernateコンフィグファイル

[SQLServer.cfg.xml(SQL Server用)]
<?xml version="1.0" encoding="utf-8"?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
  <session-factory name="NHibernateExample.Test">
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">
      Data Source=192.168.1.6,49174;
      Initial Catalog=TestData;
      User ID=sta;
      Password=passw0rd;
      Trusted_Connection=False
    </property>
    <property name="adonet.batch_size">0</property>
    <property name="show_sql">false</property>
    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
    <property name="use_outer_join">true</property>
    <property name="command_timeout">60</property>
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
    <mapping file="Product.hbm.xml" />
  </session-factory>
</hibernate-configuration>

Oracle

セットアップ上の変更点
「Oracle Database 10g Express」をUbuntuにインストールする場合、APTのソースリストにリポジトリを追加することで、APTから導入可能になります。

[/etc/apt/sources.list へ追加]
...
deb http://oss.oracle.com/debian unstable main non-free
...

[導入例]
$ wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install oracle-xe-universal # ゲストOS側で
$ sudo apt-get install oracle-xe-client # ホストOS側で

 導入時にスワップ領域の不足からインストールに失敗することがあります。その場合、スワップ領域を増やす必要があるので、次を参考に対応して下さい。


 Mono 2.4で提供されている「System.Data.OracleClient」に以前の記事の様な修正対応は必要ありません。
NHibernateコンフィグファイル

[Oracle.cfg.xml(Oracle用)]
<?xml version="1.0" encoding="utf-8"?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
  <session-factory name="NHibernateExample.Test">
    <property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
    <property name="connection.connection_string">
      Server=192.168.1.5;
      User ID=TESTDATA;
      Password=password;
    </property>
    <property name="show_sql">false</property>
    <property name="dialect">NHibernate.Dialect.OracleDialect</property>
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
    <mapping file="Product.hbm.xml" />
  </session-factory>
</hibernate-configuration>

Firebird

セットアップ上の変更点
変更点はなく、「Firebird編」の環境をそのまま使用しました。
NHibernateコンフィグファイル

[Firebird.cfg.xml(Firebird用)]
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
  <session-factory name="NHibernateExample.Test">
    <property name="connection.driver_class">NHibernate.Driver.FirebirdClientDriver</property>
    <property name="connection.connection_string">
      Server=192.168.1.5;
      Database=/home/sta/data/firebird/TestData.fdb;
      User=sta;
      Password=password;
      Dialect=3;
    </property>
    <property name="show_sql">false</property>
    <property name="dialect">NHibernate.Dialect.FirebirdDialect</property>
    <property name="command_timeout">60</property>
    <property name="query.substitutions">true 1, false 0, yes 1, no 0</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
    <mapping file="Product.hbm.xml" />
  </session-factory>
</hibernate-configuration>
データプロバイダアセンブリをMONO_PATH等で設定されている検索可能な場所に置く必要があります。

$ cd ~/lib
$ ln -s /opt/mono/2.4/lib/mono/2.0/FirebirdSql.Data.FirebirdClient.dll .

DB2

セットアップ上の変更点
変更点はなく、「DB2編」の環境をそのまま使用しました。
NHibernateコンフィグファイル

[DB2.cfg.xml(DB2用)]
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory name="NHibernateExample.Test">
    <property name="connection.driver_class">NHibernate.Driver.OdbcDriver</property>
    <property name="connection.connection_string">
      DSN=TestData_DB2;
      UID=sta;
      PWD=password
    </property>
    <property name="show_sql">false</property>
    <property name="dialect">NHibernate.Dialect.DB2Dialect</property>
    <property name="command_timeout">60</property>
    <property name="query.substitutions">true 1, false 0, yes 1, no 0</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
    <mapping file="Product.hbm.xml" />
  </session-factory>
</hibernate-configuration>

9.まとめ

Mono環境上でのFirebird、DB2、db4o、NHibernateを使用したDBアクセスについて解説を行いました。

「Monoで他のDBも使ってみたよ!」シリーズでは、次のことが確認できました。

DBMSデータプロバイダプロバイダファクトリ(ADO.NET 2.0)対応NHibernate(2.1.0)対応
SQLiteMono.Data.Sqlite◯:NHibernate SQLiteドライバの変更が必要
PostgreSQLNpgsql◯:Npgsql から提供されているデータプロバイダを使用◯:同左
MySQLMySql.Data◯:Connector/Net から提供されているデータプロバイダを使用◯:同左
SQL ServerSystem.Data.SqlClient
OracleSystem.Data.OracleClient◯:Mono 1.9.1 では実装対応が必要(Mono 2.4 ではその必要はない)
FirebirdFirebirdSql.Data.FirebirdClient◯:Firebird から提供されているデータプロバイダを使用◯:同左
DB2System.Data.Odbc◯:プロバイダファクトリ対応とは別だが、「動作確認」で解説した System.Data.Odbc の DB2 CLI/ODBC ドライバ対応が必要になる場合がある◯:System.Data.OdbcのDB2 CLI/ODBCドライバ対応が必要

 基本的なCRUD操作レベルですが、プロバイダファクトリ、NHibernateを使用した汎用的なDB操作を試すことができました。

 db4oでは、.NETの汎用的なクエリ機能であるLINQを試すことができました。db4oは、Javaおよび.NETで使用可能ですが、Linux上のMono環境でも問題なく使用できました。

 本稿で「Monoで他のDBも使ってみたよ!」シリーズは終了です。読んでいただいた方のなんらかの役に立ったなら幸いです。では、また。

参考資料


 おしまい。

0 件のコメント:

コメントを投稿