次のようにSpringでデータソースを構成することで知ることができます:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/dev"/>
<property name="lookupOnStartup" value="false"/>
<property name="cache" value="true"/>
<property name="proxyInterface" value="javax.sql.DataSource"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
...
</bean>
そして、Spring で BOC および DAO オブジェクトを次のように構成します。
<bean id="Dao" class="com.dao.impl.DaoImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="Bo" class="com.bo.impl.BoImpl">
<property name="theDao">
<ref local="Dao"/>
</property>
</bean>
現在、3 人のユーザーでテストしています。1 人は DB にデータを正常に挿入し、1 人はハングし、1 人は動作していません。つまり、応答がなく、ログが Websphere Application Server にキャプチャされませんでした。アプリを同時に使用している 3 人のユーザーがテスト ケースに失敗しました。アプリを同時に使用しているユーザーが 1000 人いる状況になったときに、これらすべてがスレッド セーフであることを確認するにはどうすればよいでしょうか?
アップデート
@Adrian Shum クエリへの応答:
BOの件ですが、これが何のパターンなのかわかりません。しかし、私は BOC は Business Object Controller の略です。このユニット クラスを持つ目的は、ビジネス ロジックを DAO オブジェクトから分離することです。最終的には、XHTML/JSP がフロントエンド、BO がビジネス コントローラー、DAO が休止状態とクエリの構築に関係することになります。
セッション ファクトリを取得するには、すべての DAO オブジェクトが HibernateDaoSupport を拡張する必要があります。これが、このチュートリアルに従って Spring-Hibernate Integration が機能する方法です。コード スニペットを次に示します。
class DAO extends HibernateDaoSupport implements IDao {
public void save( Pojo pojo ) {
getHibernateTemplate().save(pojo);
}
public void update( Pojo pojo ) {
getHibernateTemplate().update(pojo);
}
public void delete( Pojo pojo ) {
getHibernateTemplate().delete(pojo);
}
}
Spring オブジェクトはデフォルトでシングルトンであることを知っています。これは、各スレッドが 1 つのオブジェクトしか持たないということですか、それとも JVM インスタンス全体が 1 つのオブジェクトしか持たないということですか? これらの BO および DAO オブジェクトを次のようにセッション スコープとして宣言するとどうなりますか。
<bean id="Dao" class="com.dao.impl.DaoImpl" scope="session">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="Bo" class="com.bo.impl.BoImpl" scope="session">
<property name="theDao">
<ref local="Dao"/>
</property>
</bean>
データの更新または取得に関しては、テストしている 3 人のユーザーが実際には同じレコードをターゲットにしているため、これが発生する可能性があります。このコードを実行する関数があることに気付いたので、ロックがある可能性があります。
Query queryA = session.createQuery("Delete From TableA where fieldA = :theID");
queryA.setParameter("theID", "XX");
queryA.executeUpdate();
Query queryB = session.createQuery("Delete From TableB where fieldB = :theID");
queryB.setParameter("theID", "YY");
queryB.executeUpdate();
// update tableB object
session.save(tableBObj);
// update each tableA object
for(TableAObj obj : TableAObjList) {
session.save(obj);
session.flush();
session.evict(obj);
}
TableA(スレーブ)とTableB(マスター)は互いに関係があります。TableA と TableB の間にデータベース設計があることは知っていますが、これはこの問題の範囲を超えています。このクラスをシングルトンとして作成したにもかかわらず、この関数が同時実行の問題を引き起こす可能性があるかどうかに興味がありますか?