对于我们的 Web 应用程序,所有数据库访问都是通过存储过程执行的。这个设计决定是一成不变的,我无法改变它。
此外,所有事务处理都在存储过程中完成。Java 层不得使用事务。
我可以使用普通的 JDBC 轻松完成此操作。但我更喜欢使用 Hibernate 的 ORM 和缓存功能。
使用 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();
但是当我运行数据库配置文件时,我看到以下内容。
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
- 微软 SQL 服务器 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'