0

JDBC と jTDS を使用して SQL Server データベースにアクセスする Java で記述された Web サイトを運営しています。

私たちのデータベースには、実行に通常 10 分かかる複雑なストアド プロシージャが含まれています。ストアド プロシージャは、トランザクションで実行されないため、(SQL Server Management Studio などから) 直接実行すると問題なく動作します。しかし、jTDS を使用して実行すると、Web サイト全体が 10 分間ロックされます。これは、jTDS がトランザクションでそれを実行し、すべての Web サイト リクエストがトランザクションの完了を待っているために発生します。

たとえば、次の場合、トランザクションが原因で Web サイトがロックされます。

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);

これにより、Connection.TRANSACTION_NONE パラメータが jTDS でサポートされていないことを示す例外がスローされます。


編集:私はおそらくより良い質問をすることができたでしょう:コアの問題はトランザクション自体ではありません.問題は、トランザクションがデータベースロックを10分間保持することです. トランザクションを取り除く必要があるか、トランザクション中にロックを解除する必要があります。

4

3 に答える 3

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
    }

したがって、まったく同じストアド プロシージャが実行されます。違いは、sqlcmdが 1 つのトランザクションで Web サーバーを実行していないため、Web サーバーがロックアップしないことです。はい、それは醜いです...しかし、それは私が知っている唯一のオプションです!

于 2010-07-28T03:44:52.573 に答える
0

呼び出すConnection#close()Connection#commit()、トランザクションを送信して終了する必要があります。ブロックConnectionのようにDBリソースを閉じますか?finally

于 2010-07-26T12:53:18.287 に答える