サーバ・データベース操作(MySQL、Oracle)

Curlではデータベースサーバに接続し、RecordSetを生成することができる機能を持っています。これは、CDBC(Curl DataBase Connectivity)と呼ばれており、下図のようにJDBC経由でCurlからOracleやMySQLなどのサーバサイドデータベースに接続することができます。

cdbc01.jpg

 

この機能の操作方法を説明していきます。

事前準備

これを利用するには、以下のものが必要となります。

  • Javaサーブレットエンジン:Tomcat or JBoss
  • データベースサーバ:MySQL or Oracle
  • JDBCドライバ

これらのセットアップ及びserver.xml等のセッティング方法は、以下のページを参照してください。

サーブレットエンジンの構成

RecordSetの作成

まずは、CDBCを利用するために2つのパッケージをインポートします。 

{import * from CURL.DATA-ACCESS.BASE}
{import * from CURL.DATA-ACCESS.CONNECTED}

次にデータベースに接続するために、Connectionクラスを継承したBasicConnectionクラスのインスタンスを生成します。この際、BasicConnectionのコンストラクタの引数にCDBCサーバのURLを渡します。 

def conn:BasicConnection =
    {BasicConnection {url http://localhost:8080/cdbc-servlet/CdbcServlet}}

単純にRecordSet(ここではConnectedRecordSetを継承したCDBC用クラスのBasicCeoonectedRecordSet)を生成するには、BasicConnectionのcreate-record-setメソッドを実行します。この引数には、データベース名とテーブル名(もしくはSQL文)を指定します。以下の例では、RecordGridに表示させています。

{RecordGrid
    record-source = {conn.create-record-set “example”,”employee”}
}

SQL文の実行

SQL文を実行する際、create-record-setを用いて、select文よりRecordSetを取得できます。

{RecordGrid
    record-source = {conn.create-record-set “example”,”select * from employee“}
}

それ以外に、insert、update、delete、create、drop等のSQLを実行する際は、BasicConnection.executeメソッドを実行します。このメソッドは一度に複数のSQL文も実行することができます。

{conn.create-record-set “example”, “delete from employee“}

直接SQL文を実行しなくても、BasicConnectedRecordSetのappend等のメソッドを用いたり、RecordGridの操作で、自動的にSQLを生成し、データの追加・更新・削除等を行いことができます。

データベースメタ情報の取得

いくつかのデータベース・メタ情報を取得するConnectionクラスのメソッドを以下に記載します。

メソッド名 説明
get-database-names 操作できるデータベースの一覧を取得できます。
get-tables 操作できるテーブル一覧を取得できます。
get-fields 対象テーブルのカラム情報を取得できます。(カラム名、サイズ、キー、タイプ等)
get-keys キーの一覧を取得できます。

 

その他機能

Curl6.0からいくつかの機能(圧縮、非同期通信、認証、独自バイナリフォーマット通信など)が追加されました。それらの一部を紹介します。

大量データを扱う場合に、パフォーマンスを向上させるための方法として、2つサポートしています。1つはHTTP圧縮機能です。これを用いますとサーバとの通信時に自動的に圧縮・解凍され、トラフィックが低減されます。利用するには、BasicConnectionのインスタンス生成時にcompress?キーワード引数にtrueをセットします。 

def conn:BasicConnection =
    {BasicConnection
        {url http://localhost:8080/cdbc-servlet/CdbcServlet},
        compress? = true
    }

もう一つのパフォーマンス向上機能として、通信フォーマットのシリアル化があります。通常CDBCはXMLで通信を行いますが、通信及びパースの高速化を行うため、Curl独自バイナリフォーマットのシリアル化・デシリアル化を自動的に行うという機能がサポートされました。これは通常のXMLと比べ5分の1から10分の1程度のスピードアップします。(ただし、データ量やデータ内容などによりスピードアップ率が変わる可能性があります。)これを利用するには、BasicConnectionのインスタンス生成時にserialize?キーワード引数にtrueをセットします。下位互換のためデフォルトはfalseとなっていますが、基本的にはこのパラメータをtrueにすることをお勧めします。

def conn:BasicConnection =
    {BasicConnection
        {url http://localhost:8080/cdbc-servlet/CdbcServlet},
        serialize? = true
    }

その他の機能として、非同期通信及びrealmを利用した認証があります。どちらもBasicConnectionのインスタンス生成時にキーワード引数として指定します。非同期通信の場合には、async?、realm認証の場合にはusernameとpasswordを指定することにより、この機能を利用することができます。

また、JDBCで扱われるデータタイプのほとんどが、Curlのデータタイプに自動的にマッピングされますので、開発者は簡単にアプリケーションの開発を行うことができます。例えば、Curl6.0からサポートされた機能ですと、OracleのBLOBタイプをCurlのByteArrayにマッピングしてくれます。

関連ドキュメント

データベースからレコードデータを取得

クライアントデータベース(SQLite)