druid接続プールを使用してpostgreデータベースに接続すると、autoCommitが有効になっているとコミットできないという例外が発生します。調査の結果、Druidバグが発生します。

問題の説明

一部のインターフェースは異常で、一部のデータインターフェースは正常です。例外がスローされます:autoCommitが有効な場合はコミットできません。特定の例外はこれより長くなりますが、主な理由はデータベースの自動コミット構成に関連しています。

問題のある環境

springmvcプロジェクトは、データベース接続プールとしてAliのdruidを使用します

 

調査プロセス

ソースコードを通じて、spring-txトランザクションのDataSourceTransactionManagerが毎回次のコードを実行することがわかります。

if(con.getAutoCommit()){     txObject.setMustRestoreAutoCommit(true);     if(logger.isDebugEnabled()){         logger.debug( "Switching JDBC Connection [" + con + "] to manual commit");     }     con.setAutoCommit(false); }





つまり、Springは接続を取得するたびにAutoCommit = falseを設定しますが、ここでは明らかに効果がありません。なぜそれが有効にならなかったのか、疑わしいターゲットがデータソースに転送され、データソースがAliのドルイド接続プールを使用しているため、ドルイドバグであることが疑われます。以下は、ドルイド接続プールの同等の置き換えです。

接続プールを置き換える

接続プールをHikariCPに置き換えた後、HikariCPはautoCommit = falseの設定をサポートします。もう一度テストしたところ問題は見つかりませんでした。Ali のdruid接続プールの問題であることが判明しました

 

解決

1.データベースプロパティautocommit = falseを構成して解決する

データベースを設定しない場合は、次の方法を参照してください

2.接続プールを置き換えます。Aliのdruid接続プールは使用しないでください

 

おすすめ

転載: blog.csdn.net/eguid/article/details/108636179