gpt4 book ai didi

java - 如何在不使用事务的情况下使用 JDBC/jTDS 执行存储过程?

转载 作者:行者123 更新时间:2023-12-02 08:31:12 24 4
gpt4 key购买 nike

我们运行一个用 Java 编写的网站,该网站使用 JDBC 和 jTDS 来访问 SQL Server 数据库。

我们的数据库包含一个复杂的存储过程,通常需要 10 分钟才能运行。如果我们直接执行(例如从 SQL Server Management Studio),存储过程可以正常工作,因为它不在事务中运行。但如果我们使用 jTDS 执行它,则会将整个网站锁定 10 分钟。发生这种情况是因为 jTDS 在事务中运行它,因此所有网站请求都处于搁置状态,等待事务完成。

例如,以下内容因交易而锁定网站:

Connection connection = DriverManager.getConnection("jdbc:jtds:sqlserver://example/example");
CallableStatement callableStatement = connection.prepareCall("exec dbo.procTest");
callableStatement.execute();

有没有什么方法可以让我们使用 JDBC/jTDS 运行存储过程而不需要在事务中运行?

请注意,在 jTDS 连接上调用此方法无效:

connection.setTransactionIsolation(Connection.TRANSACTION_NONE);

这会引发异常,表明 jTDS 不支持 Connection.TRANSACTION_NONE 参数。

<小时/>

编辑:我可能可以更好地提出这个问题:核心问题不是事务本身,问题是事务导致数据库锁被持有 10 分钟。我要么需要摆脱事务,要么需要在事务期间释放锁

最佳答案

在我们的例子中,必须调用 StoredProcedure,从 jtds 调用时抛出异常:

Cannot perform a backup or restore operation within a transaction.

我发现了什么@ https://communities.bmc.com/docs/DOC-66239exec 调用是否需要在前面加上“SET IMPLICIT_TRANSACTIONS OFF;”

这是基于 spring 的代码片段:

try {
jdbcTemplate.getJdbcOperations.execute("SET IMPLICIT_TRANSACTIONS OFF;")
//noinspection ConvertExpressionToSAM // we have 1.6 code version
jdbcTemplate.getJdbcOperations.call(new CallableStatementCreator {
override def createCallableStatement(con: Connection): CallableStatement = {
val callableStatement = con.prepareCall(
s""" EXEC dbo.RestoreLatestCopy
| @ID = ?
|""".stripMargin)
callableStatement.setInt(1, getMappedRestoreId(fromDbName))
callableStatement
}
}, parameters ++ rsParams)
} catch {

关于java - 如何在不使用事务的情况下使用 JDBC/jTDS 执行存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3333322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com