0

最近、休止状態 4 に移行しました。私たちのアプリケーションには、非推奨の session.connection () を持つ多くのファイルがあります。次のように呼び出して、 session.doWork() に置き換えました。

session.doWork(new Work() {

    @Override
    public void execute(Connection conn) throws SQLException {
        wasAuto = conn.getAutoCommit();
        if(!wasAuto) {
            conn.rollback(); // in case there is existing transaction
            conn.setAutoCommit(true);
        }

    }
});
try {
    return mainCallback.doInHibernate(session);
} finally {
    session.doWork(new Work() {

        @Override
        public void execute(Connection conn) throws SQLException {
            if(!wasAuto)
                conn.setAutoCommit(wasAuto);
        }
    });

}

しかし、私が言ったように、同じエラーを持つ多くのファイルがあります。上記のように書くのがベストプラクティスですか?

理解を深めるために、エラーのあるファイルを 1 つ追加します。誰かがエラーをクリアするのを手伝ってくれますか?

Session session = repo.getSessionFactory().openSession();
    Connection connection = null;
    PreparedStatement ps = null;
    int recordCount = 0;
    try {
        connection = session.connection();
        ps = connection.prepareStatement(masterSql);
        ps.setDate(1,acctPeriod);
        ps.setLong(2,geoScheme.getId());

        recordCount = ps.executeUpdate();

        long millis = System.currentTimeMillis() - start;
        logger.info("END --> Generating/Running Dynamic SQL for Aggregation took "+(millis / 60000.0)+" min" );
        run.addRollupMessage("Generating/Running Dynamic SQL for Aggregation took "+(millis / 60000.0)+" min" );

        run.setEndDate(DateUtils.currentTimestamp());
        logger.info("No of Loan groups inserted = " +  recordCount);
        run.addRollupMessage("No of Loan groups inserted = " +  recordCount);

    } catch (Exception err) {
        throw new RuntimeException(" **ERROR** DURING AGGREGATION: " + err.getMessage(),err);
    }
    finally
    {
        if (ps != null) ps.close();
        if (connection != null) connection.close();
        if (session != null) session.close();
    }
4

3 に答える 3

0

session.getCurrentSession()Spring FrameworkとそのsessionFactoryコンポーネントを使用しないのはなぜですか。ファクトリ全体を初期化すると、既存のセッションを自動的に検出したり、新しいセッションを作成したりできることを覚えています。

手動のjdbcコードはもう必要ありません。楽しんでください。

于 2012-10-11T18:48:50.610 に答える
0

このアプローチを使用できない理由

SQLQuery query = session.createSQLQuery(sql);
query.setDate(1, acctPeriod);
query.setDate(2, geoScheme.getId());
recordCount = query.executeUpdate();

匿名クラスなどよりもはるかに単純です。これは、セッションで使用するトランザクション境界/自動コミットに従います (毎回明示的に新しいセッションを開くか、Spring を使用して管理するかなど)。

于 2012-10-11T23:05:51.860 に答える
0

プレーンな JDBC を介してレポートを作成しているように見えますが、コードを Work インターフェイスに移植するだけでは問題はありません。実際、Work インターフェースの方が優れています。接続を閉じて、SQL 例外がスローされた場合に適切な処理を行うように見えるため、コードがより単純になるはずです。

于 2012-10-11T16:28:26.723 に答える