9

SimpleJdbcCall複数のプロシージャを呼び出すことはできません

これは私のテストコードです:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;


public class TestCall {

    public static void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "spring/applicationContext.xml",
                        "spring/applicationDb.xml" });

        SimpleJdbcCall call = context.getBean("simpleJdbcCall",
                SimpleJdbcCall.class);

        call.withProcedureName("proc1").execute("p1", "p2");

        System.out.println("CallString: " + call.getCallString());

        call.withProcedureName("proc2").execute("p1");

        System.out.println("CallString: " + call.getCallString());

    }
}

コードで、私は定義しましたsimpleJdbcCall

<bean id="simpleJdbcCall" class="org.springframework.jdbc.core.simple.SimpleJdbcCall" >
    <constructor-arg ref="dataSource" />
</bean>

プロシージャproc1は2つのパラメータを受け取り、adnプロシージャproc2は1つのパラメータを受け取ります。

実行すると例外が発生しました。

それから私はデバッグし、それがまだCallString:であることがわかり ましAbstractJdbcCall.callStringた。{call proc1(?, ?)}proc2

それで、それは春のバグですか?

そして、作者のトーマス・リスバーグに連絡する方法を教えてくれる人はいますか?

4

2 に答える 2

21

それで、それはSpringのバグですか?

いいえ、使い方が間違っているだけです。のドキュメントSimpleJdbcCallおそらくもっと明示的かもしれませんが、次のように述べています。

Aはストアド プロシージャまたはストアド関数SimpleJdbcCallの呼び出しを表すマルチスレッドの再利用可能なオブジェクトです。

つまり、 の各インスタンスはSimpleJdbcCall、特定のストアド プロシージャを呼び出すように構成されます。一度構成したら、変更しないでください。

複数のストアド プロシージャを呼び出す必要がある場合は、複数のSimpleJdbcCallオブジェクトが必要です。

于 2011-07-06T08:14:09.037 に答える
0

春のリファレンスドキュメントでは、この概念はあまり明確ではないようです。そこにあるすべての例には、1つのサンプルプロシージャに対して使用されるSimpleJdbcCallのインスタンスが1つしかないためです。

一意のストアドプロシージャごとに1つのSimpleJdbcCallインスタンスが必要であり、SimpleJdbcCallインスタンスは1回だけ初期化する必要があります。初期化されると、スレッドセーフになります。

于 2013-03-22T21:12:50.030 に答える