【发布时间】:2012-11-03 15:27:38
【问题描述】:
对于我们的 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
- MS 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'
【问题讨论】:
-
你如何使用普通的 JDBC 来完成这个?
-
见上面描述的例子
-
嗯.. 我不了解 MS SQL 日志,但您在 JDBC 示例中使用 autoCommit 模式,它为每个查询执行创建事务。所以我怀疑它是否像你描述的那样有效。
-
听起来不错!如何禁用自动提交...而不看到消息“No Hibernate Session bound to thread”??
标签: sql-server spring hibernate transactions jtds