0

これはばかげた質問かもしれませんが、Java を使用したデータベースに関する知識がほとんどないので、教えてください。auto-commit を false に設定できるように、ユーザーにオプションを提供したいコンポーネントを開発しています。これはパフォーマンス向上のためです。JDK7u25 で Sybase ASE に接続しています。

java.sql.Connection で setAutoCommit(false) メソッドを呼び出すことができます。ただし、これを実行して、テーブルにレコードを挿入する単純なストアド プロシージャを呼び出すと、次のエラーが発生します。ストアド プロシージャからテーブルを作成していません。

com.sybase.jdbc3.jdbc.SybSQLException: The 'CREATE TABLE' command is not allowed within a multi-statement transaction in the 'tempdb' database.

Sybase のドキュメント ページを読んで、これがエラー コード 2762 の既知の問題であることを知りました。これは、データベースで次のコマンドを発行することで修正できます。

sp_dboption dbName, "ddl in tran", true.

ただし、Interactive SQL でこのコマンドを実行してプログラムを実行しようとすると、まだこのエラーが発生します。このコマンドを Java プログラムから明示的に実行する必要がありますか?

他の注意事項:以下の問題もありました:

Space available in the log segment has fallen critically low in database 'myDB'.  All future modifications to this database will be %S_MSG until the log is successfully dumped and space becomes available.
The transaction log in database myDB is almost full. Your transaction is being suspended until space is made available in the log.

Interactive SQL で次のコマンドを発行して、これを修正しました。

sp_dboption myDB, "trunc log", true

Java プログラムでこのコマンドを明示的に実行する必要がなく、それが機能した場合、Java プログラムで「ddl in tran」を true にして sp_dboption を実行する必要があるのはなぜですか? Java プログラムによって作成されたセッションが、Interactive SQL で使用されているセッションと異なるためでしょうか?

4

2 に答える 2