0

私のwebappコントローラーでは、dbから結果を取得しています。これはタイプjava.sql.SQLXMLです。それをビューに渡して、逐語的に(XMLとして)返されるようにします。

問題は、JdbcTemplate呼び出しを終了するとすぐに、SQLXMLに関連付けられたデータが解放されることです。次に、モデルを使用してデータをビューに渡すにはどうすればよいですか?

4

1 に答える 1

0

最も簡単な解決策はSQLXML、呼び出しを終了する前にオブジェクトからデータを読み取り、データを、、DOM などJdbcTemplateとして返すことです。byte[]String

それが実用的でない場合 (データが大きすぎるなど)、呼び出しの範囲を超えて接続を開いたままにしておく必要がありますJdbcTemplate。これは、トランザクションを使用することを意味します。を呼び出す前にトランザクションを開くとJdbcTemplate、接続はそのトランザクションにバインドされ、トランザクションを閉じるまで開いたままになります。残念ながら、ビューがレンダリングされるのに十分な時間開いたままにしておくには、多少の体操が必要です。

トランザクションがまだセットアップされていないと仮定するとDataSourceTransactionManager、コンテキストに Bean が必要になります。次に、トランザクションを管理する を記述しHandlerInterceptorて、ビューがレンダリングされるまでトランザクションを開いたままにすることができます。Spring は、JPA/Hibernate/etc のように、このすぐに使える便利なインターセプターを提供していないため、次のHandlerInterceptorような独自の を作成する必要があります。

public class TransactionInterceptor extends HandlerInterceptorAdapter {

    private PlatformTransactionManager txManager;

    public void setTxManager(PlatformTransactionManager txManager) {
        this.txManager = txManager;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        TransactionStatus tx = txManager.getTransaction(new DefaultTransactionDefinition());
        request.setAttribute("tx", tx);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        TransactionStatus tx = (TransactionStatus) request.getAttribute("tx");
        txManager.commit(tx);
    }
}

次に、リクエストがコントローラーとビューを呼び出すときに、このインターセプターが呼び出されるように構成します。

于 2010-04-03T17:22:01.827 に答える