この 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'