こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

setAutoCommit(false)で例外発生してしまいます

はじめまして。fswmiyajimaと申します。
現在JavaでDBを使用した簡単なスタンドアロンアプリケーションを作成しています。
DBにはMicrosoft Access(ojdbc14 + Microsoft Access Driver 4.00.6305.00)を利用しています。
開発環境では問題無くテストまで終わっていたのですが、
別のPCに持っていった時、例外が発生していまいました(末尾に記載)。
問題は、トランザクション開始時(setAutoCommit(false))に発生します。
尚、DBとなるmdbファイルはNASに存在し、そのファイルを見るように各PCのODBCマネージャーで設定しています。
少し調べを入れてみましたが、プロバイダがトランザクションをサポートしていないのが原因である、という記述を見つけました。
しかし、開発環境では問題なく動作しているので、どこに原因があるのか突き止められず、困っています。
どうかご教示いただければと思います。よろしくお願いします。

例外全文
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]属性を設定できません。
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLSetConnectOption(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcConnection.setAutoCommit(Unknown Source)
at dbcommon.MSAccessCon.transactionBegin(MSAccessCon.java:30)
at view.Main.exec(Main.java:315)
at view.Main.access$0(Main.java:309)
at view.Main$1.actionPerformed(Main.java:112)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

※Main.java:315: con.setAutoCommit(false);
※このconはConnectionオブジェクトで、このコネクションを用いてのselect句の発行はどの環境でも正常に行えています。

投稿日時 - 2010-04-12 11:35:09

QNo.5820455

すぐに回答ほしいです

質問者が選んだベストアンサー

参考的な意見しか言えないのですが、何か環境の差異はありませんか?。
単純なエラーほど単純な見落としが良くあります(経験上)。

ODBCの設定、Java、OS、JDBC-ODBCブリッジのバージョン等、比べられることが良いと思います。
awtを使われているようですが、古いJavaで使われているのでしょうか?。
であれば、その世代の最新のJavaVMでやってみるのも良いかもしれません。
または、MSのODBCの日付のちょっと後のJava辺りが良いかもしれません。

投稿日時 - 2010-04-15 14:00:02

お礼

ご回答ありがとうございます!
>参考的な意見しか言えないのですが、何か環境の差異はありませんか?。
これが原因でした!
端末A(問題無い)と端末B(問題発生)のマシン環境は同一で、jdkも1.6.0_18(安定最新は1.6.0_19みたいですね)なのですが、
端末Aのユーザーと端末Bのユーザーの権限の違いが問題になっていました。
具体的には、Bのユーザーは権限の関係で更新用コネクション取得後に、
一度あるテーブルを読みにいってから、トランザクションを開始します。
一方、Aのユーザー(私)は権限が無いのですぐにトランザクションを開始します。
そのような違いがありました。この場合ですと、トランザクション開始前にデータを読んでいるか読んでいないかの違いとなります。
それが問題なのかと思い、トランザクション開始前に行っていた処理をトランザクションの中に入れ込むと、
無事例外発生する事無くどの端末からでも動作するようになりました!
>awtを使われているようですが、古いJavaで使われているのでしょうか?。
GUIにswingを使用しているので、内部的にはawtが呼ばれているはずです。

尚、本文中で接続にojdbc14を使用していると書いていましたが、
誤解を招いたかもしれません。申し訳ありません。
oracleの更新をaccessにプッシュする様なプログラムの為、必要ではありますが、
今回の問題・質問には関係の無い部分でした。

おかげさまで問題の解決に至りました。ありがとうございました!

投稿日時 - 2010-04-16 09:10:32

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問