おきらくmanholeの日記

id:manhole
 | 

2004-07-27

ちょっとした検証 - マルチスレッドセーフ 00:19

※これもメモ書きでっす。


どの単位でDaoやSelectHandlerのインスタンスを生成したら良いのか調べるため、Dao 1インスタンスをマルチスレッドで回してみました。

※SelectHandlerをnewするのは...

  • アクセスの度にnewする?
  • 1スレッドで1つnewする?
  • 複数スレッドで1インスタンスを共有可能? ←★結果はこれ。

S2DaoとJ2JDBCとを試してみて、どちらも MT Safe でした。

----

S2Daoの自動生成SQLだと、Handler (BasicSelectHandlerなど) は、SQL実行の度 (dao.getEmployeeの度) に生成された。

じゃあ BasicSelectHandler は Safe じゃないのかなと思ったけど、そんなことはなかった。

  • 複数スレッドで1つの BasicSelectHandler を共有するけれど、MT Safe に動いている。
    • BasicSelectHandlerの場合は、dicon ファイルで与える情報はフィールドに保持・複数スレッドで共有されるけれど、リードオンリーなので平気。
    • BeanResultSetHandler も同様にできている。

なので、SelectHandler や ResultSetHandler の亜種を自作する場合は、MT Safe になるようにすべし。少なくとも、フィールドを更新するように作る場合はマルチスレッドを考慮すること。

----

補足: あー、書き方が悪かったです。BasicSelectHandler のセッタを呼ばなければ MT Safe です。つまり、SelectHandler として使うぶんには Safe。ダウンキャストして、BasicHandler#setSql なんてやり出すとアウトです。(ふつーに使うぶんにはそんなことしませんケド。)


----

S2JDBCの場合のコード

  • EmployeeDao
package test.mt.s2jdbc;
import examples.dao.manhole.Employee;
public interface EmployeeDao {
    public Employee getEmployee(int empno);
}
  • EmployeeDaoImpl
package test.mt.s2jdbc;
import org.seasar.extension.jdbc.SelectHandler;
import examples.dao.manhole.Employee;
public class EmployeeDaoImpl implements EmployeeDao {
    private SelectHandler getEmployeeHandler_;
    public void setGetEmployeeHandler(SelectHandler getEmployeeHandler) {
        getEmployeeHandler_ = getEmployeeHandler;
    }
    public Employee getEmployee(int empno) {
        return (Employee)getEmployeeHandler_.execute(new Object[]{new Integer(empno)});
    }
}
  • dicon
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components>
  <include path="j2ee.dicon"/>
  <component class="test.mt.s2jdbc.EmployeeDaoImpl">
    <property name="GetEmployeeHandler">
      <component class="org.seasar.extension.jdbc.impl.BasicSelectHandler">
        <property name="sql">
"SELECT EMP.ename, EMP.empno, EMP.deptno FROM EMP EMP WHERE EMP.empno = ?"
        </property>
        <property name="resultSetHandler">
          <component class="org.seasar.extension.jdbc.impl.BeanResultSetHandler">
            <arg>@examples.dao.manhole.Employee@class</arg>
          </component>
        </property>
      </component>
    </property>
  </component>
</components>
  • テストコード
public void testMultiThread() {
    final EmployeeDao dao = dao_;
    final int times = 1000;
    Thread martinThread = new Thread() {
        public void run() {
            for (int i = 0; i < times; i++) {
                Employee emp = dao.getEmployee(7654);
                assertEquals("MARTIN", emp.getEname());
            }
        }
    };
    Thread scottThread = new Thread() {
        public void run() {
            for (int i = 0; i < times; i++) {
                Employee emp = dao.getEmployee(7788);
                assertEquals("SCOTT", emp.getEname());
            }
        }
    };
    Thread jamesThread = new Thread() {
        public void run() {
            for (int i = 0; i < times; i++) {
                Employee emp = dao.getEmployee(7900);
                assertEquals("JAMES", emp.getEname());
            }
        }
    };
    martinThread.start();
    scottThread.start();
    jamesThread.start();
    try {
        martinThread.join();
        scottThread.join();
        jamesThread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

udagawaudagawa2004/10/14 17:58junit.extensions.ActiveTestSuite を調べるべし

FermelindaFermelinda2012/02/16 22:07Yeah, that's the tieckt, sir or ma'am

ygfcavayygfcavay2012/02/17 03:24YVU4Ks <a href="http://sifcegwoyjem.com/">sifcegwoyjem</a>

ioonuoexkioonuoexk2012/02/17 23:54cUrXAS , [url=http://qdbiiizmscxa.com/]qdbiiizmscxa[/url], [link=http://wrswniqhzqeq.com/]wrswniqhzqeq[/link], http://tlmzuwylpdsy.com/

qfqpcxtbqfqpcxtb2012/02/22 03:314g81UC <a href="http://xvihrpllbkvs.com/">xvihrpllbkvs</a>

 | 
2004 | 05 | 06 | 07 | 08 | 09 |