3

この Web アプリケーションでは、すべての DB アクセスはストアド プロシージャを介して実行されます。この設計上の決定は確定しており、変更することはできません。

さらに、すべてのトランザクション処理はストアド プロシージャ内で行われます。Java 層はトランザクションを使用してはなりません。

これは、プレーンな JDBC を使用して簡単に実現できます。しかし、ORM とキャッシング機能には Hibernate を使用したいと思います。

Hibernate でストアド プロシージャを呼び出すのは簡単です。

final Session session = sessionFactory.getCurrentSession();
final Query query = session.createSQLQuery("EXEC dbo.SP_ProductSearch :searchStr").addEntity(Product.class).setString("searchStr", "ap");
return query.list();

しかし、DB プロファイルを実行すると、次のように表示されます。

SET IMPLICIT_TRANSACTIONS ON
EXEC dbo.SP_ProductSearch  N'ap'
IF @@TRANCOUNT > 0 COMMIT TRAN
IF @@TRANCOUNT > 0 COMMIT TRAN
SET IMPLICIT_TRANSACTIONS OFF

4x トランザクションステートメントを無効にできる方法はありますか?

私の技術スタックは以下の通りです。

  • 春 3.1.2
  • 休止状態 4.1.8
  • jTDS (JDBC ドライバー) 1.2.5
  • Microsoft SQL Server 10.x

前もって感謝します... アダム。


@ctapobep - これはプレーンな JDBC を使用して行う方法です。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;


public class PlainJdbcTest
{
    private static final String USERNAME = "sa";
    private static final String PASSWORD = "password";
    private static final String URL = "jdbc:jtds:sqlserver://myserver:1433;DatabaseName=testDatabase;prepareSQL=0";
    private static final String QUERY = " EXEC dbo.SP_ProductSearch ?";
    private static final String DRIVER = "net.sourceforge.jtds.jdbc.Driver";


    public static void main(String[] args) throws Exception
    {
        Class.forName(DRIVER).newInstance();

        final Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
        final PreparedStatement statement = connection.prepareStatement(QUERY);
        statement.setString(1, "ba");
        final ResultSet resultSet = statement.executeQuery();

        while(resultSet.next())
        {
            final int id = resultSet.getInt(1);
            final String desc = resultSet.getString(2);
            System.out.print(id + " / " + desc);
        }

        if(resultSet != null) resultSet.close();
        if(statement != null) statement.close();
        if(connection != null) connection.close();
    }
}

そして、これがプロファイルに表示されているものです-完全に機能します!

EXEC dbo.SP_ProductSearch  N'ba'
4

2 に答える 2

0

Hibernateコード(ストアドプロシージャの実行)をどのように呼び出していますか?@Transactionalアノテーションを持つSpringServiceクラスを介して呼び出されますか?

于 2012-11-15T02:30:59.483 に答える
0

Hibernate がトランザクションを使用するのを防ぐ方法を見つけられなかったので、回避策として完全に動作する MyBatis に切り替えました。

http://www.mybatis.org/spring/index.html

于 2012-11-19T20:45:41.473 に答える