Tomcat で実行している Web アプリケーションが次の例外をドロップすることが多いという問題があります。
java.sql.SQLException: Connection already closed
したがって、次の構成でプールから接続を取得する前に、接続を検証したいと思います。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost/database" />
<property name="username" value="user" />
<property name="password" value="pass" />
<property name="validationQuery" value="SELECT 1"/>
<property name="testOnReturn" value="false"/>
<property name="testOnBorrow" value="true"/>
<property name="testWhileIdle" value="false"/>
<property name="maxActive" value="30" />
<property name="maxIdle" value="15" />
<property name="minIdle" value="5"/>
<property name="poolPreparedStatements" value="true"/>
<property name="connectionProperties"
value="useUnicode=true;characterEncoding=UTF-8;profileSQL=true;logger=custom.MysqlLogger;" />
</bean>
spring jdbcTemplate で次の 2 つのクエリを送信する場合:
SELECT SQL_CALC_FOUND_ROWS col1, col2, col3 AS foo FROM table HAVING foo = 'bar' LIMIT 0, 10;
SELECT FOUND_ROWS();
「SELECT FOUND_ROWS()」クエリは、検証クエリが間に実行されるため (「SELECT 1」)、常に 1 を返します。
誰かが 2 番目のクエリで COUNT を使用せずにこの問題を解決する方法を知っていますか?