###同時アクセス数が増えるとコネクションが切断されてしまう。
Spring MVCで作成しているWEBシステムで、
同時アクセスができていることの確認はできているのですが、
同時アクセス数が増えると、コネクションが切断されてしまいます。
そこで、コネクションプールの設定を行う為に
データソースマッピング設定に以下の設定を記載しましたが、
設定が反映されませんでした。
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"> <property name="driverClassName" value="org.postgresql.Driver"/> <property name="url" value="jdbc:postgresql://xxxxxxxxxxxxxx"/> <property name="username" value="xxxx" /> <property name="password" value="xxxx" /> <property name="validationQuery" value="SELECT 1" /> <property name="testOnBorrow" value="true" /> <property name="testWhileIdle" value="true" /> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <property name="initialSize" value="100" /> <property name="maxActive" value="100" /> <property name="maxIdle" value="100" /> <property name="minIdle" value="10" />
以下にpom.xmlを抜粋します
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.8.RELEASE</version> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.4-1200-jdbc41</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.8.RELEASE</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> <version>8.5.23</version> </dependency>
###コネクション接続時に発生したエラーメッセージ
[ERROR] DBException! 000.0.0.0jp.co.xxx.exception.DBException: java.sql.SQLException: PooledConnection has already been closed. jp.co.xxxx.exception.DBException: jp.co.xxxx.exception.DBException: java.sql.SQLException: PooledConnection has already been closed.
何かアドバイスをいただけるとうれしいです。
よろしくお願い致します。
###追記
ご質問ありがとうございます。
返答が遅くなり、申し訳ございません。
A)PostgreSQL側で、max_connectionsの設定は?
⇒"100"になっております。
B)PostgreSQL側で、全てのSQLをログ出力できるようにして、validationQuery" value="SELECT 1 " が発行されているかどうか
⇒確認しましたところ、validationQuery" value="SELECT 1 "の発行はされておりました。
C) OS側のtcp timeoutが短すぎることはないか?
⇒他アプリケーション動作時は、問題なく動作するため、
tcp timeoutの設定は問題ないと思っております。
また、今回の同時アクセス検証につきましては、
10秒間に100アクセスが可能かの検証を行っており
現状、100アクセス中の数件のコネクションが切断されてしまう状態です。
###追記(使用データソース変更(2017/11/16))
データソースを
org.apache.commons.dbcp.BasicDataSourceに変更したところ、
性能が多少改善致しましたので追記致します。
(以前、[dbcp2]を試した時は、性能の改善が見られなかったのですが…)
【以下、データソースマッピング設定】
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="org.postgresql.Driver"/> <property name="url" value="jdbc:postgresql://xxxxxxxxxxxxxx" /> <property name="username" value="xxxxx"/> <property name="password" value="xxxxx"/> <property name="initialSize" value="300"/> <property name="testOnBorrow" value="true"/> <property name="maxActive" value="300"/> <property name="maxIdle" value="300" /> </bean>
上記データソースに変更後、
10秒間に100アクセスは、問題なく動作するようになりました。
ご協力ありがとうございます。
しかし、
・負荷を上げると、以前と同エラーが発生してしまう。
(※5秒間に400アクセスの検証で稀にエラーが発生)
・10秒間に100アクセスの検証をループして実施すると、
エラーが発生してしまう。
(※10秒間に100アクセスを2分間ループさせると、
1%未満の確立でエラーが発生)
・不具合原因の特定ができていない。
という状況の為、引き続き調査を行っていきたいと思っております。
皆様お忙しいとは思いますが、
引き続きお力添えいただければ幸いです。
