2011-07-06 21 views
7

SimpleJdbcCall không thể gọi nhiều hơn một thủ tụcSimpleJdbcCall không thể gọi nhiều hơn một thủ tục

này là mã thử nghiệm của tôi:

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()); 

    } 
} 

trong các mã, tôi đã xác định simpleJdbcCall

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

và thủ tục proc1 nhận 2 paramaters, thủ tục adn proc2 nhận 1 paramater.

Khi tôi chạy nó, ngoại lệ đã xảy ra.

Sau đó, tôi gỡ lỗi và phát hiện ra rằng AbstractJdbcCall.callString vẫn là CallString: {call proc1(?, ?)} khi gọi proc2.

Vì vậy, đó có phải là lỗi của Spring không?

Và có ai cho tôi biết cách liên hệ với tác giả Thomas Risberg không?

Trả lời

14

Vì vậy, đó có phải là lỗi của Spring không?

Không, bạn chỉ đang sử dụng không chính xác. Các documentation cho SimpleJdbcCall có lẽ có thể rõ ràng hơn, nhưng nó nói:

Một SimpleJdbcCall là một, tái sử dụng đối tượng đa luồng đại diện cho một cuộc gọi đến một stored procedure hoặc một chức năng lưu trữ.

Nói cách khác, mỗi trường hợp SimpleJdbcCall được định cấu hình để gọi thủ tục được lưu trữ cụ thể. Sau khi cấu hình, nó không nên thay đổi.

Nếu bạn cần gọi nhiều thủ tục được lưu trữ, bạn cần có nhiều đối tượng SimpleJdbcCall.

+0

Cảm ơn bạn đã trả lời, tôi phải tạo một cá thể SimpleJdbcCall mới khi tôi gọi thủ tục được lưu trữ khác. – jiucai

0

Khái niệm này dường như không rõ ràng trong tài liệu tham khảo mùa xuân vì tất cả các ví dụ trong đó chỉ có một cá thể SimpleJdbcCall được sử dụng trong một quy trình mẫu.

Một cá thể SimpleJdbcCall cho mỗi thủ tục được lưu trữ duy nhất là những gì cần thiết và các cá thể SimpleJdbcCall chỉ cần được khởi tạo một lần. Họ là chủ đề an toàn khi được khởi tạo.

Các vấn đề liên quan