- PR -

DataSourceコネクションのAutoCommit設定について

投稿者投稿内容
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-06-24 23:22
ukさん、おつきあいいただいて恐縮です。

やろうとしている処理は1本のセッションビーン内で閉じていますが、SQLの実行処理は内部で振り分けており、実際にはprivateメソッドに委譲しています。その際にメインのメソッド内で
conn = ds.getConnection();で得たコネクションを引数で渡し、close処理はあくまで
メインのfainally句で行っています。

DBの業務処理なんですが、CSVで元ねたを複数件もらいうけ、PKで存在してればUPDATE
新規ならINSERTのような処理を施しています。
そこで、Aテーブル用のCSVデータをロードした後、Bテーブル用のCSVデータをロードし
最後に問題のなかったときだけコミットかけたいのです。

Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-06-24 23:42
Anthyhimeさん、貴重な情報ありがとうございます。
そこで、試してはいるのですが、結果が変わらず、まだ何がおかしいのか不明なところです。

ejb-jar.xml に、みなさんに教えていただいたやり方で

<container-transaction>
<method>
<ejb-name>FmjAddApn</ejb-name>
<method-intf>Remote</method-intf>
<method-name>*</method-name>
</method>
<trans-attribute>RequiresNew</trans-attribute>
</container-transaction>
</assembly-descriptor>

を追加して走らせてみると、やはり、

conn = ds.getConnection();
// autocommit の設定
conn.setAutoCommit(false);

のところで例外
23:34:08,705 INFO [APNMsg] [RMI TCP Connection(16)-172.31.50.95]■□□データソースの取得:2:org.jboss.resource.adapter.jdbc.WrapperDataSource@6ca1a6
23:34:08,705 INFO [STDOUT] java.sql.SQLException: You cannot set autocommit during a managed transaction!
23:34:08,715 INFO [STDOUT] at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.setJdbcAutoCommit(BaseWrapperManagedConnection.java:468)
23:34:08,715 INFO [STDOUT] at org.jboss.resource.adapter.jdbc.WrappedConnection.setAutoCommit(WrappedConnection.java:443)
23:34:08,715 INFO [STDOUT] at fec.sb.maintenance.addapn.FmjAddApnBean.insertDB(FmjAddApnBean.java:563)

が発生してしまいます。

<trans-attribute>RequiresNew</trans-attribute>
をいろいろためしているところです。。。

ちなみに、UserTransactionはまだJNDIうまくいってません。

近況報告でした。。。






Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-06-25 00:00
Anthyhimeさん、こんばんわ。

引用:
EntityBeanではないのでCMPやBMPとは関係がありません。
メソッドのトランザクション属性を変更してJTAオフの状態でDataSourceからConnectionを取得してくださいといっているだけです。
おそらくそれでautocommitをfalseに設定できるはずです。


CMTのトランザクション属性は、

Required なければ作る。普通。
RequiredNew 新たに作る。
Mandatory ないとエラー。
Supports あれば使う。
NotSupported あっても使わない。
Never あったらエラー。

だそうですが、Supports を設定すると。。。いけました!!!
本当にありがとうございます!
ワンダフルです。。。これでいってしまおうかと思ってもいます。。。

ただ、依然としてUserTransactionの設定の仕方が分からず、悔しいです。
それがだめならTransactionManagerでもいいのです。
どなたか、やり方伝授していただけないでしょうか。。。

制御できないのなら制御できないことを知っておきたいのです。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-06-27 12:08

引用:

やろうとしている処理は1本のセッションビーン内で閉じていますが、SQLの実行処理は内部で振り分けており、実際にはprivateメソッドに委譲しています。その際にメインのメソッド内で
conn = ds.getConnection();で得たコネクションを引数で渡し、close処理はあくまで
メインのfainally句で行っています。

DBの業務処理なんですが、CSVで元ねたを複数件もらいうけ、PKで存在してればUPDATE
新規ならINSERTのような処理を施しています。
そこで、Aテーブル用のCSVデータをロードした後、Bテーブル用のCSVデータをロードし
最後に問題のなかったときだけコミットかけたいのです。


これらの処理がセッションBeanの中で閉じているのであれば、問題がある場合にセッション
Beanのメソッドから例外を投げれば自動的にトランザクションがロールバックされます。

トランザクション属性をいろいろいじることを考えているようですが、今までの書き込みを
読む限りでは、そのようなことが必要とは思えません。EJBに関する理解が浅いまま、場当たり
的な対応はすべきでないと思います。

スキルアップ/キャリアアップ(JOB@IT)