Symfoware

Symfowareについての考察blog

Ubuntu + Javaから、Symfoware V12(Openインターフェース)に接続する

Windows Server 2012 R2にSymfoware V12(Openインターフェース)をインストール。
外部接続を許可しました。

Windows Server 2012 R2にSymfoware V12(Openインターフェース)をインストールする
Symfoware V12(Openインターフェース)の外部接続を許可する

Ubuntu 14.04 + JavaからPostgreSQLのJDBCドライバを使用して
接続をテストしてみます。



JDBCドライバの入手



FreeBSD + PostgreSQL 9.3.2 にJavaで接続する
こちらの手順と同様です。

http://jdbc.postgresql.org/download.html
ここからJDBCドライバをダウンロードしておきました。




サンプルソース



サンプルは、PostgreSQLに接続する場合と全く同じです。
ただし、ポート番号はSymfowareのインスタンス作成時指定した
「26500」を指定します。


  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.Statement;
  5. public class MainProcess {
  6.     
  7.     public static void main(String... args) {
  8.         String master_url = "jdbc:postgresql://192.168.1.104:26500/sample";
  9.         try (Connection con = DriverManager.getConnection(master_url, "Administrator", "P@ssw0rd")) {
  10.             
  11.             Statement stmt = con.createStatement();
  12.             ResultSet rs = stmt.executeQuery("select * from test");
  13.             
  14.             while(rs.next()) {
  15.                 System.out.println(rs.getInt("id"));
  16.                 System.out.println(rs.getString("name"));
  17.             }
  18.         } catch (Exception e) {
  19.             e.printStackTrace();
  20.         }
  21.     }
  22.     
  23. }




実行してみると、あっさり動いてくれました。


1
日本語テスト






内臓のPostgreSQLのバージョン



PostgreSQLのバージョンを確認するクエリを実行してみます。


select version()



表示は「9.2.4」になりました。

411_01.png


PostgreSQLのhstore型や、JSON型も使えると思います。

テーマ:データベース - ジャンル:コンピュータ

  1. 2014/04/20(日) 22:46:50|
  2. 開発
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Symfowareのアクセスプランを取得するツール Symfoware-Plan-Analyzer

以前、rdbexecsqlで取得したアクセスプランを表示するツールを作成しました。

Symfowareのアクセスプランをグラフィカルに表示するツール
http://symfoware.blog68.fc2.com/blog-entry-988.html

いちいちSQLを実行してファイルを開くのが面倒だったので、
直接SQL文を実行できるように修正してみました。



必要条件



Java製のツールです。Javaの実行環境(1.6以上)が必要です。
また、JDBCドライバ経由でSQLを実行しますので、Symfowareクライアントが必要です。
環境変数CLASSPATHに、JDBCドライバのjarファイルが登録されている必要があります。
※インストーラーが自動で設定してくれるはず。





ツール本体



需要はあんまりないと思いますが、以下のURLでダウンロードできます。
https://bitbucket.org/symfo/symfoware-plan-analyzer/downloads






使い方



解凍したフォルダにあるsymfotool-20130416.jarをダブルクリックするか
コマンドプロンプトで


java -jar symfotool-20130416.jar



を実行すると起動します。


今までどおり、メニューの[ファイル] - [開く]から解析結果をテキストを表示することが可能です。

194_01.png



データベースサーバー上でツールを起動すると、自動的に右側の接続設定で
「ローカル接続」が選択された状態となります。

・ユーザーID
・パスワード
・データベース名

の3つの項目を入力します。

左側のテキストにSQL文を記載し、「クエリーを実行」をクリックすると
解析結果が表示されます。

194_02.png

194_03.png



下にあるタブを「解析結果」から「実行結果」に切り替えると、実行したSQLの
結果が表示されます。

194_04.png



別のデータベースサーバーにクエリを実行するときには、事前に共有フォルダを
作成しておく必要があります。

・サーバー名
・ユーザーID
・パスワード
・データベース名
・ポート番号
・サーバー上の出力パス
・上記の共有フォルダ

を指定します。

「サーバー上の出力パス」に指定したフォルダにSQLトレースの結果が出力されます。
そのフォルダをクライアントから取得するときのパスを「上記の共有フォルダ」に
指定してください。

また、トレースは「trace.txt」という名前で作成します。
毎回SQL実行前に削除するので注意。


194_05.png

194_06.png



テーマ:プログラミング - ジャンル:コンピュータ

  1. 2013/04/16(火) 23:57:40|
  2. 開発
  3. | トラックバック:0
  4. | コメント:5
  5. | 編集

SymfowareへのJDBC接続で、アクセスプランを取得する

Symfoware データベースのアクセスプランを取得する
http://symfoware.blog68.fc2.com/blog-entry-979.html

ここで、rdbexecsqlコマンドを使用したアクセスプランの取得方法を調べました。


どうやら、JDBCドライバ経由で実行するクエリのアクセスプランも
取得できるようなので試してみます。





接続文字列



こちらを参考にしました。

Symfoware Server アプリケーション開発ガイド(JDBCドライバ編)
http://software.fujitsu.com/jp/manual/manualfiles/M060053/J2X13800/03Z200/

接続文字列にオプションを指定することで、アクセスプランが出力されるようになります。



アクセスプランを取得するには、「CLI_ACCESS_PLAN」を
オプションで指定します。

書式はこのような感じです。


CLI_ACCESS_PLAN = ({ON | OFF},ファイル名[,出力レベル][,SQLアドバイザ出力レベル])





性能情報を取得するには、「CLI_SQL_TRACE」を
オプションで指定します。

書式はこのような感じです。


CLI_SQL_TRACE = ({ON | OFF},性能情報ファイル名[,出力レベル])





注意するポイントとして、ファイルはデータベースサーバーに作成されます。
指定するファイル名のフルパスは、データベースサーバーで有効な
パスにしてやる必要があります。





具体例



接続文字列に続いて、


;ctuneparam='[パラメーター名称1]=(ON);[パラメーター名称2]=(OFF)'



というオプションを追加します。

サンプルソースは以下のとおり。


  1. package sample;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. public class Sample {
  7.     public static void main(String args[]) {
  8.         try {
  9.             Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver");
  10.             String url = "jdbc:symford://localhost:2050/GIRLS_PANZER";
  11.             // アクセスプランをplan.txt、トレースをtrace.txtに出力するオプションを
  12.             // 接続文字列に追加
  13.             url += ";ctuneparam='CLI_ACCESS_PLAN=(ON,C:\\share\\plan.txt);CLI_SQL_TRACE=(ON,C:\\share\\trace.txt)'";
  14.             Connection con = DriverManager.getConnection(url, "Administrator", "Password");
  15.             Statement stmt = con.createStatement();
  16.             StringBuffer sql = new StringBuffer();
  17.             sql.append("SELECT");
  18.             sql.append(" *");
  19.             sql.append(" FROM");
  20.             sql.append(" SC_MAIN.STUDENT_TABLE");
  21.             sql.append(" ,SC_MAIN.TEAM_MASTER");
  22.             sql.append(" ,SC_MAIN.TANK_MASTER");
  23.             sql.append(" WHERE");
  24.             sql.append(" (STUDENT_TABLE.チーム名称コード = TEAM_MASTER.チーム名称コード)");
  25.             sql.append(" AND (TEAM_MASTER.戦車名称コード = TANK_MASTER.戦車名称コード)");
  26.             ResultSet rs = stmt.executeQuery(sql.toString());
  27.             while (rs.next()) {
  28.                 System.out.println(rs.getString("名前"));
  29.             }
  30.             rs.close();
  31.             stmt.close();
  32.             con.close();
  33.         } catch (Exception e) {
  34.             e.printStackTrace();
  35.         }
  36.     }
  37. }





または、このようにPropertiesを使用して指定してもOK。


  1. package sample;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. import java.util.Properties;
  7. public class Sample {
  8.     public static void main(String args[]) {
  9.         try {
  10.             Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver");
  11.             String url = "jdbc:symford://localhost:2050/GIRLS_PANZER";
  12.             // アクセスプランをplan.txt、トレースをtrace.txtに出力するオプションを
  13.             // 接続文字列に追加
  14.             //url += ";ctuneparam='CLI_ACCESS_PLAN=(ON,C:\\share\\plan.txt);CLI_SQL_TRACE=(ON,C:\\share\\trace.txt)'";
  15.             //Connection con = DriverManager.getConnection(url, "Administrator", "Password");
  16.             
  17.             
  18.             Properties info = new Properties();
  19.             info.setProperty("user", "Administrator");
  20.             info.setProperty("password", "Password");
  21.             info.setProperty("ctuneparam", "CLI_ACCESS_PLAN=(ON,C:\\share\\plan.txt);CLI_SQL_TRACE=(ON,C:\\share\\trace.txt)");
  22.             
  23.             Connection con = DriverManager.getConnection(url, info);
  24.             Statement stmt = con.createStatement();
  25.             StringBuffer sql = new StringBuffer();
  26.             sql.append("SELECT");
  27.             sql.append(" *");
  28.             sql.append(" FROM");
  29.             sql.append(" SC_MAIN.STUDENT_TABLE");
  30.             sql.append(" ,SC_MAIN.TEAM_MASTER");
  31.             sql.append(" ,SC_MAIN.TANK_MASTER");
  32.             sql.append(" WHERE");
  33.             sql.append(" (STUDENT_TABLE.チーム名称コード = TEAM_MASTER.チーム名称コード)");
  34.             sql.append(" AND (TEAM_MASTER.戦車名称コード = TANK_MASTER.戦車名称コード)");
  35.             ResultSet rs = stmt.executeQuery(sql.toString());
  36.             while (rs.next()) {
  37.                 System.out.println(rs.getString("名前"));
  38.             }
  39.             rs.close();
  40.             stmt.close();
  41.             con.close();
  42.         } catch (Exception e) {
  43.             e.printStackTrace();
  44.         }
  45.     }
  46. }




実行してみると、データベースサーバーの指定したパスにアクセスプランとトレースが出力されました。

193_01.png


193_02.png


テーマ:プログラミング - ジャンル:コンピュータ

  1. 2013/04/04(木) 22:13:05|
  2. 開発
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

JavaでSymfowareサーバーが起動しているか確認する

Javaのプログラムから、
・Symfowareサーバーでプログラムが実行されているか
・Symfowareが起動されているか
をチェックする必要があったので、どう実現するか考えてみました。



rdbchksanity



Symfowareサーバーがインストールされているかは、
「rdbchksanityコマンドが実行できるか」で、

Symfowareサーバーが起動しているかは、
「rdbchksanityコマンドの戻り値」で
それぞれ判断することにしました。


rdbchksanityについてはこちら。
Symfowareが起動しているか確認する(rdbchksanity)


Javaで外部プロセスを起動する方法はこちらを参考にさせて頂きました。
外部プロセス起動




サンプルプログラム



後は要素を組み合わせるだけです。
こんなプログラムで、Symfoware Serverのインストールと、起動を確認出来ました。


  1. package sample;
  2. import java.io.IOException;
  3. public class Sample {
  4.     
  5.     public static void main(String args[]) {
  6.         
  7.         try {
  8.             ProcessBuilder pb = new ProcessBuilder("rdbchksanity");
  9.             Process p = pb.start();
  10.             
  11.             int ret = p.waitFor();
  12.             String status = null;
  13.             
  14.             switch(ret) {
  15.             case 0:
  16.                 status = "Symfoware/RDBが正常に動作しています";
  17.                 break;
  18.                 
  19.             case 1:
  20.                 status = "rdbchksanityコマンドのパラメタが間違っています。";
  21.                 break;
  22.                 
  23.             case 2:
  24.                 status = "一時的な資源の枯渇により本コマンドが実行できません";
  25.                 break;
  26.                 
  27.             case 3:
  28.                 status = "Symfoware/RDBが未起動です";
  29.                 break;
  30.                 
  31.             case 4:
  32.                 status = "待ち時間を経過しても応答がありません";
  33.                 break;
  34.                 
  35.             default:
  36.                 status = "不明なエラー";
  37.                 break;
  38.             }
  39.             
  40.             System.out.println(status);
  41.             
  42.             
  43.         // rdbchksanityコマンドが見つからない
  44.         } catch (IOException e) {
  45.             e.printStackTrace();
  46.             
  47.             System.out.println("Symfoware Serverがインストールされていません。");
  48.             
  49.         } catch (Exception e){
  50.             e.printStackTrace();
  51.         }
  52.     }
  53. }


テーマ:プログラミング - ジャンル:コンピュータ

  1. 2013/04/04(木) 00:14:27|
  2. 開発
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

ASP.NET aspxページでSymfoware Serverに接続する

ASP.NET aspxページでMySQLに接続する

aspxでMySQLに接続できたんだから、Symfowareにも接続できるだろうという事で
試してみます。




使用するデータベース



データベースのインストールはこちら。

Windows Server 2012にSymfoware V11をインストールする
http://symfoware.blog68.fc2.com/blog-entry-1072.html


使用するデータベースは、こちらの手順で作成したものにします。

Symfoware V11へデータベースの作成と黒猫 SQL Studio Nextからの接続
http://symfoware.blog68.fc2.com/blog-entry-1073.html

「SAMPLE」データベースの、「SC_POST」スキーマにある、「POST_CODE」テーブルへ
接続することになります。


また、通常のC#プログラムからの接続はこちら。

C#で.NET Data Providerを使用し、Symfowareへ接続する
http://symfoware.blog68.fc2.com/blog-entry-1076.html





サンプルプログラム



サンプルプログラムは、MySQLの例を参考にこんな感じになりました。


  1. <%@ Page Language="C#" %>
  2. <%@ Import Namespace="System.Data" %>
  3. <%@ Import Namespace="Fujitsu.Symfoware.Client" %>
  4. <script runat="server">
  5. protected void Page_Load(Object source, EventArgs e) {
  6.     if (IsPostBack) {
  7.         return;
  8.     }
  9.     
  10.     // 接続文字列を作成
  11.     string connectionString =
  12.         "DATA SOURCE=localhost;" +
  13.         "PORT=2050;" +
  14.         "INITIAL CATALOG=SAMPLE;" +
  15.         "User ID=Administrator;" +
  16.         "Password=P@ssw0rd";
  17.     
  18.     // 取得したデータ退避用
  19.     DataTable dt = new DataTable();
  20.     
  21.     using (SymfowareConnection con = new SymfowareConnection(connectionString))
  22.     using (SymfowareDataAdapter adapter = new SymfowareDataAdapter()) {
  23.         con.Open();
  24.         
  25.         // クエリを実行して、結果をDataTableに退避
  26.         string query = "SELECT * FROM SC_POST.POST_CODE";
  27.         adapter.SelectCommand = new SymfowareCommand(query, con);
  28.         adapter.Fill(dt);
  29.         
  30.     }
  31.     
  32.     // 画面上のDataGridとバインド
  33.     datagrid.DataSource = new DataView(dt);
  34.     DataBind();
  35. }
  36. </script>
  37. <html>
  38. <body>
  39. <asp:DataGrid id="datagrid" runat="server" />
  40. </body>
  41. </html>




これを、
Windows Server 2012 + IIS 8でaspxを有効にする
こちらで作成したアプリケーションフォルダ(例だとC:\inetpub\test)に、
「symfoware.aspx」という名前で保存しました。


ブラウザで、http://[サーバーIP]/test/symfoware.aspxを表示すると
MySQLの時と同じくエラーになります。


'/test' アプリケーションでサーバー エラーが発生しました。

コンパイル エラー

説明: この要求を送信するために必要なリソースをコンパイル中に、エラーが発生しました。
以下のエラーの詳細を確認して、ソース コードを修正してください。

コンパイル エラー メッセージ: CS0246: 型または名前空間名 'Fujitsu' が見つかりませんでした。
using ディレクティブまたはアセンブリ参照が不足しています。

ソース エラー:
行 1: <%@ Page Language="C#" %>
行 2: <%@ Import Namespace="System.Data" %>
行 3: <%@ Import Namespace="Fujitsu.Symfoware.Client" %>
行 4:
行 5: <script runat="server">

ソース ファイル: c:\inetpub\test\symfoware.aspx    行: 3

詳しいコンパイラ出力を表示:
バージョン情報: Microsoft .NET Framework バージョン:4.0.30319; ASP.NET バージョン:4.0.30319.18010




aspxファイルを置いているフォルダ、今回は「C:\inetpub\test」に「bin」という
フォルダを作成し、dllをコピーしてやります。

Symfowareの.NETクライアントは標準で、
「C:\SFWCLNT\SNDP\BIN\4.0」
にインストールされていると思います。

ここに
「Fujitsu.Symfoware.dll」
というdllがあるはずなので、これを「C:\inetpub\test\bin」にコピーします。

173_01.png


改めてブラウザで、http://[サーバーIP]/test/symfoware.aspxを
表示すると、こんな感じになるかと。

173_02.png


aspxからSymfowareへの接続が確認出来ました。

テーマ:データベース - ジャンル:コンピュータ

  1. 2013/01/14(月) 18:39:22|
  2. 開発
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ