时间:2010-07-26 08:35:57

标签: java sql-server jdbc jtds

3 个答案:

答案 0 :(得分:1)

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

  

无法在事务内执行备份或还原操作。

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

这是基于春季的代码段的样子:

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 {

答案 1 :(得分:0)

答案 2 :(得分:0)

我最终使用了以下丑陋的解决方法。如果有人能解释我如何正确地做到这一点,我仍然感兴趣;但解决方法目前会做。

数据库在Web服务器上的同一台机器上运行,因此我可以使用标准的SQL Server命令行工具来运行存储过程。触发它的Java代码是:

    try {
        Process process = Runtime.getRuntime().exec("sqlcmd -E -d \"example\" -Q \"EXEC dbo.procTest;\"");
        process.waitFor();
    } catch (IOException e) {
        // Handler here
    } catch (InterruptedException e) {
        // Handler here
    }

因此运行完全相同的存储过程 - 区别在于Web服务器没有锁定,因为 sqlcmd 没有在单个事务中运行它。是的,这很难看......但这是我所知道的唯一可行的选择!