1

テストを実行すると、method()の呼び出しでハングします。私は何か間違ったことをしていますか?ヘルプ!

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"beans.xml"})
@Transactional(rollbackFor = Exception.class)
public class Test {
    @Test
    public void test() {
        itemUnderTestDao.method();
        // ...
    }
}

public class ItemUnderTestDao {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void method() {
        // ...
    }
}

上記のコードを忘れてください。Eclipseプロジェクト(springなどの依存関係を除く)をhttp://www44.zippyshare.com/v/46865082/file.htmlにアップロードしました。テストに合格する方法に関するすべての入力は本当にありがたいです!2つのsqliteデータベースと2つのdataSourcesがある場合のテストパス...

4

2 に答える 2

0

データベースへの2番目の接続を開こうとしています。最初のものは@Transactional、クラスのために開かれTest、別の接続REQUIRES_NEWmethod()強制します。

おそらく、接続プールは1つの同時接続のみを許可します。サイズとデータベース構成を確認してください。

また、質問に目を通し、選択した回答に承認済みのマークを付けます(回答の本文の横にあるチェックマークの形)。

于 2012-01-30T11:54:18.310 に答える
0

mrembisz が言ったように、同時に 2 つの接続/スレッドを取得しようとしています。

  1. テスト期間中に存在するテスト自体の場合
  2. 呼び出しの期間中存在するメソッド呼び出しの場合。

私は少し異なる状況で同じことに遭遇しました。

これを修正する2つの方法:

  1. 伝播をREQUIREDに変更します。このようにして、最初にテストで取得した Connection を再利用します。
  2. プール サイズを増やしますが、同時更新の最大数を大まかに考慮する必要があることに注意してくださいmaxThreadPoolSize >= (maxSimultaniousUpdates + 1) + (min size for other activities)(リスト 1 の保留中の接続がある場合、最終的にすべての保留中の操作が完了します)。そうしないと、これが本番環境で再現されます。

もちろん、それがあなたのロジックに害を及ぼさないのであれば、最初の解決策は私にとってより良いものに思えます:)

于 2012-12-09T17:34:57.583 に答える