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 の修正例]
  1. ...  
  2. # 修正  
  3. #listen_addresses = 'localhost'  
  4. listen_addresses = '*'  
  5. ...  

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

[実行例]
$ 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用)]
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >  
  3.   <session-factory name="NHibernateExample.Test">  
  4.     <property name="connection.driver_class">NHibernate.Driver.NpgsqlDriver</property>  
  5.     <property name="connection.connection_string">  
  6.       Server=192.168.1.5;  
  7.       Port=5432;  
  8.       User Id=sta;  
  9.       Password=password;  
  10.       Database=TestData;  
  11.     </property>  
  12.     <property name="show_sql">false</property>  
  13.     <property name="dialect">NHibernate.Dialect.PostgreSQLDialect</property>  
  14.     <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>  
  15.     <mapping file="Product.hbm.xml" />  
  16.   </session-factory>  
  17. </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 の設定例]
  1. ...  
  2. [client]  
  3. # 追加  
  4. default-character-set=utf8  
  5.   
  6. [mysqld]  
  7. # 追加  
  8. default-character-set=utf8  
  9. default-storage-engine=INNODB  
  10.   
  11. # コメント化  
  12. #bind-address  = 127.0.0.1  
  13. ...  
「Connector/Net 6.0.3」をソースからビルドした場合、ソース資源内の「Connection.cs」でエラーが発生します。原因は、継承元(System.Data.Common.DbConnection)にDbProviderFactoryプロパティが実装されていないためですが(Mono 2.4.2以降では実装済)、次の一時的な処置でとりあえずの動作確認は可能です。

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

[MySQL.cfg.xml(MySQL用)]
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >  
  3.   <session-factory name="NHibernateExample.Test">  
  4.     <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>  
  5.     <property name="connection.connection_string">  
  6.       Server=192.168.1.5;  
  7.       Database=TestData;  
  8.       Uid=sta;  
  9.       Pwd=password;  
  10.       CharSet=utf8  
  11.     </property>  
  12.     <property name="show_sql">false</property>  
  13.     <property name="dialect">NHibernate.Dialect.MySQLDialect</property>  
  14.     <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>  
  15.     <mapping file="Product.hbm.xml" />  
  16.   </session-factory>  
  17. </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用)]
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >  
  3.   <session-factory name="NHibernateExample.Test">  
  4.     <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>  
  5.     <property name="connection.connection_string">  
  6.       Data Source=192.168.1.6,49174;  
  7.       Initial Catalog=TestData;  
  8.       User ID=sta;  
  9.       Password=passw0rd;  
  10.       Trusted_Connection=False  
  11.     </property>  
  12.     <property name="adonet.batch_size">0</property>  
  13.     <property name="show_sql">false</property>  
  14.     <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>  
  15.     <property name="use_outer_join">true</property>  
  16.     <property name="command_timeout">60</property>  
  17.     <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>  
  18.     <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>  
  19.     <mapping file="Product.hbm.xml" />  
  20.   </session-factory>  
  21. </hibernate-configuration>  

Oracle

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

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

[導入例]
$ 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用)]
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >  
  3.   <session-factory name="NHibernateExample.Test">  
  4.     <property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>  
  5.     <property name="connection.connection_string">  
  6.       Server=192.168.1.5;  
  7.       User ID=TESTDATA;  
  8.       Password=password;  
  9.     </property>  
  10.     <property name="show_sql">false</property>  
  11.     <property name="dialect">NHibernate.Dialect.OracleDialect</property>  
  12.     <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>  
  13.     <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>  
  14.     <mapping file="Product.hbm.xml" />  
  15.   </session-factory>  
  16. </hibernate-configuration>  

Firebird

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

[Firebird.cfg.xml(Firebird用)]
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >  
  3.   <session-factory name="NHibernateExample.Test">  
  4.     <property name="connection.driver_class">NHibernate.Driver.FirebirdClientDriver</property>  
  5.     <property name="connection.connection_string">  
  6.       Server=192.168.1.5;  
  7.       Database=/home/sta/data/firebird/TestData.fdb;  
  8.       User=sta;  
  9.       Password=password;  
  10.       Dialect=3;  
  11.     </property>  
  12.     <property name="show_sql">false</property>  
  13.     <property name="dialect">NHibernate.Dialect.FirebirdDialect</property>  
  14.     <property name="command_timeout">60</property>  
  15.     <property name="query.substitutions">true 1, false 0, yes 1, no 0</property>  
  16.     <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>  
  17.     <mapping file="Product.hbm.xml" />  
  18.   </session-factory>  
  19. </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用)]
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">  
  3.   <session-factory name="NHibernateExample.Test">  
  4.     <property name="connection.driver_class">NHibernate.Driver.OdbcDriver</property>  
  5.     <property name="connection.connection_string">  
  6.       DSN=TestData_DB2;  
  7.       UID=sta;  
  8.       PWD=password  
  9.     </property>  
  10.     <property name="show_sql">false</property>  
  11.     <property name="dialect">NHibernate.Dialect.DB2Dialect</property>  
  12.     <property name="command_timeout">60</property>  
  13.     <property name="query.substitutions">true 1, false 0, yes 1, no 0</property>  
  14.     <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>  
  15.     <mapping file="Product.hbm.xml" />  
  16.   </session-factory>  
  17. </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 件のコメント:

コメントを投稿