SimpleJdbcCall不能调用多个过程

时间:2011-07-06 07:15:12

标签: java spring jdbc spring-jdbc

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个参数,并且程序proc2收到1个参数。

当我运行它时,发生了异常。

然后我调试并发现AbstractJdbcCall.callString仍然存在 CallString:{call proc1(?, ?)} 致电proc2

那么,这是一个Spring的错误吗?

有没有人告诉我如何联系作者Thomas Risberg?

2 个答案:

答案 0 :(得分:14)

  

那么,这是一个Spring的错误吗?

不,你只是错误地使用它。 SimpleJdbcCall的{​​{3}}可能更明确,但确实说:

  

SimpleJdbcCall是一个多线程,可重复使用的对象,表示对 a 存储过程或存储函数的调用。

换句话说,SimpleJdbcCall的每个实例都配置为调用特定的存储过程。配置完成后,不应更改。

如果需要调用多个存储过程,则需要有多个SimpleJdbcCall个对象。

答案 1 :(得分:0)

这个概念在spring参考文档中似乎并不十分清楚,因为那里的所有示例只有一个SimpleJdbcCall实例,它用于一个示例过程。

每个唯一存储过程的一个SimpleJdbcCall实例是需要的,而SimpleJdbcCall实例只需要初始化一次。一旦初始化,它们就是线程安全的。