2007/6/25 月曜日

ibatisでクラスをシリアライズ化してDBに格納

このエントリをはてなブックマークに追加ibatisс鴻激≪ゃ阪DB主のはてなブックマーク被リンク数
Filed under: mysql, ibatis — akky @ 17:00:04

javaのクラスをシリアライズ化してMySQLのDBへ読み書きする方法

やり方

 ・DBにBLOB列を追加
 ・DTOにByte[]なシリアライズ化したオブジェクトを入れるフィールドを追加
 ・DTOにシリアライズ、デシリアライズのメソッドを追加

環境

 MySQL 5.0.41
java 1.5.03
ibatis ibatis-2.3.0677.jar,ibatis-dao-2.jar

テーブルの定義

mysql> desc WORD;
+-------------------+------------------+------+-----+---------+----------------+
| Field             | Type             | Null | Key | Default | Extra          |
+-------------------+------------------+------+-----+---------+----------------+
| WORD_ID           | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| WORD              | varchar(128)     | NO   |     |         |                |
| SERIALIZED_OBJECT | blob             | YES  |     | NULL    |                |
+-------------------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql>

DTO

ByteArray(Output|Input)Streamを使ってシリアライズ化(する|した)オブジェクトを読み書きする関係する部分だけを抜粋

    private byte[] serializedObject;
    /**
     * 指定されたインスタンスをシリアライズ化してINSERTorUPDATEを行なう準備をする
     * @param o シリアライズ化するクラスのインスタンス
     * @throws IOException 基本となる OutputStream が例外をスローした場合
     */
    public void setToSerialize(hogeClass o ) throws IOException{
      ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
      ObjectOutputStream objectOut = new ObjectOutputStream(byteStream);
      objectOut.writeObject(o);
      objectOut.close();
      this.serializedObject = byteStream.toByteArray();
    }
    /**
     * シリアライズ化されたオブジェクトをインスタンスに戻す。
     * @return デシリアライズしたオブジェクト
     * @throws IOException 基本となる OutputStream が例外をスローした場合
     * @throws ClassNotFoundException 基本となる OutputStream が例外をスローした場合
     */
    public hogeClass getDeSerialize() throws IOException, ClassNotFoundException{
      ObjectInputStream objectIn = new ObjectInputStream(new ByteArrayInputStream(this.serializedObject));
      hogeClass result = (hogeClass)objectIn.readObject();
      objectIn.close();
      return result;
    }

アプリ側

import java.io.IOException;
import java.io.Reader;
import java.io.Serializable;
import java.util.Iterator;
import com.ibatis.common.resources.Resources;
import com.ibatis.dao.client.DaoManager;
import com.ibatis.dao.client.DaoManagerBuilder;
public class SerialyzeTest  {
  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO 自動生成されたメソッド・スタブ
        Reader reader;
    try {
      classHoge t = new classHoge;
      t.addStartPosition(15);
      reader = Resources.getResourceAsReader("dao.xml");
          DaoManager daoManager =  DaoManagerBuilder.buildDaoManager(reader);
          Word out = new Word();
          WordDAO dao = (WordDAO) daoManager.getDao(WordDAO.class);
          dao.deleteByPrimaryKey(1);
          out.setWordId(1);
          out.setWord(t.getWord());
          out.setToSerialize(t);
          // 挿入実行
          dao.insert(out);
          // 挿入したレコードを検索してみる
          Word in = dao.selectByPrimaryKey(1);
          classHoge t2 = in.getDeSerialize();
          t2.methodFuga();
    } catch (Exception e) {
      // TODO 自動生成された catch ブロック
      e.printStackTrace();
    }
  }
}

2007/5/6 日曜日

my.cnfのファイル名を勘違い

このエントリをはてなブックマークに追加my.cnf<ゃのはてなブックマーク被リンク数
Filed under: mysql — akky @ 0:00:00

テスト用の環境をセットアップしたら

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

とエラーが出てしまう。環境はRHEL4。

開発用の環境はCentOS4なのだけど、こちらでは同じ事象を発生させられない。my.cnfにあるソケットの指定だということは判るのだが、いくら編集してみても編集内容が反映されない。[mysqld]でsoket=/tmp/mysql.sockを/tmp/mysql.sock.testに名前を変更してmysqldを再起動しても/tmp/mysql.sock.testになっていない。my.cnfを/usr/local/etcにおいても駄目。

色々と悩んだ挙句に「my.confではなくmy.cnf」である。という記述に辿りつく。my.cnfにしたら一発OK。orz。

ああ、半日を返せ。

2007/4/22 日曜日

fromとform

このエントリをはてなブックマークに追加fromformのはてなブックマーク被リンク数
Filed under: mysql — akky @ 0:00:00

Webの仕事に限らず、SQLを作りながら画面を作っていると打ち間違えてハマる。

formとfrom。oとrを打つ順番が違うだけ。文法チェックがされる言語ではエラーを出してくれるだけマシ。javascriptだと、エラーも出さす通り過ぎるので値が取得できねぇ!!と小一時間悩むこともある。

2007/2/24 土曜日

MySQLでJOINで結合してインデックスを使わせる

このエントリをはてなブックマークに追加MySQLJOINхゃ潟鴻篏帥のはてなブックマーク被リンク数
Filed under: mysql — akky @ 0:00:00

はてなで質問したら

http://q.hatena.ne.jp/1172231903

JOINを使えば良いと教えてくれる。

そういえば、JOINを使って書くのは初めてだな。昔Access97を使っていた頃にウィザードが生成した

SQL文にJOINが使われていて当時は構文を理解できずずっと毛嫌いしていたものですよ。

示された書き換えの構文を試してみると・・・

なんという事でしょう。意図した通りインデックスがつかられているではありませんか〜。これまで、0.4秒だったのが0.1秒未満になったのです。

処理全体では1/14の時間で終るようになり劇的な改善。結合としてJOINを使うとよろしく判断してくれるのか。

2007/2/23 金曜日

mysqlで動いているSQLのチューニング

このエントリをはてなブックマークに追加mysqlуSQLャ若潟阿里呂討淵屮奪マーク被リンク数
Filed under: mysql — akky @ 0:00:00

社内で別の人が担当しているweb系のアプリで、サーバでの処理が遅くブラウザがタイムアウトする場合がある。オンラインバッチな機能なので排他制御が足りなく、ブラウザを一度終了させると処理中にも関わらず再実行できてしまう。

今は排他制御の強化とオンラインバッチをコンカレント処理にして対応する予定。でも、topで見ていると処理中はmysqldにCPUが張り付きっぱなし。まずは、これが先なんじゃないか。とも思う。

テストをするにもだらだらと待つので退屈。なのでSQLの性能改善にチャレンジ。Oracleではそれなりに場数を踏んでいるものの、MySQLは初めて。アプリの中は理解していないので、MySQLから遅いSQL文を探す方法を探す事から開始。

とっかかりとしてはMySQLが遅いSQL文を報告してくれるのでそれを解析することから。

http://dev.mysql.com/doc/refman/4.1/ja/slow-query-log.html

次のページ »