Web サービスでの MySQL 接続に行き詰まっています。
public class DBAccessLayer
{
private Connection connection = null;
private Statement statement = null;
private String DBFormatter = "'";
private String key;
private static DataSource datasource = null;
private static boolean _isInitiated = false;
private static boolean _isInitializing = false;
public DBAccessLayer()
{
key = ConstantValues.getKey();
SetPoolSettings();
}
private void SetPoolSettings()
{
try
{
if (!_isInitiated && !_isInitializing)
{
_isInitializing = true;
PoolProperties p = new PoolProperties();
p.setUrl("jdbc:mysql://localhost:3306/DBName?autoReconnect=true");
p.setDriverClassName("com.mysql.jdbc.Driver");
p.setUsername("root");
p.setPassword("password");
p.setJmxEnabled(true);
p.setTestWhileIdle(false);
p.setTestOnBorrow(true);
p.setValidationQuery("SELECT 1");
p.setTestOnReturn(false);
p.setValidationInterval(30000);
p.setTimeBetweenEvictionRunsMillis(30000);
p.setMaxActive(100);
p.setInitialSize(10);
p.setMaxWait(10000);
p.setRemoveAbandonedTimeout(60);
p.setMinEvictableIdleTimeMillis(30000);
p.setMinIdle(10);
p.setLogAbandoned(true);
p.setRemoveAbandoned(true);
p.setFairQueue(true);
p
.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
datasource = new DataSource();
datasource.setPoolProperties(p);
_isInitiated = true;
}
}
finally
{
_isInitializing = false;
}
}
public void OpenConnection() throws SQLException
{
if (connection == null || connection.isClosed())
connection = datasource.getConnection();
if (statement == null || statement.isClosed())
statement = connection.createStatement();
}
public Statement getStatement() throws Exception
{
if (connection == null || connection.isClosed())
connection = datasource.getConnection();
statement = connection.createStatement();
return statement;
}
public void CloseConnection()
{
try
{
if (statement != null)
statement.close();
}
catch (Exception ignore)
{
ignore.printStackTrace();
}
try
{
if (connection != null)
connection.close();
}
catch (Exception ignore)
{
ignore.printStackTrace();
}
}
}
これは、Web サービスでデータベースに接続するために使用しているクラスです。同じ Web サービスで実行されているクォーツのスケジュールされたジョブがいくつかあります。
各 Web サービス メソッド呼び出し、各ジョブ開始時、および最後にブロック CloseConnection() で OpenConnection() メソッドを呼び出します。
しかし、試行中に一度だけ接続を閉じている間、定期的にこのエラーが発生しています-最後にブロックします。
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: ステートメントを閉じた後、操作は許可されません。
私のWebサービスメソッドは次のようになります
private DBAccessLayer _DBAccessLayer = null;
private DBAccessLayer getDBAccessLayer()
{
if (_DBAccessLayer == null)
_DBAccessLayer = new DBAccessLayer();
rerurn _DBAccessLayer;
}
public void dummyCall()
{
try
{
getDBAccessLayer.getStatement().executeQuery("Some query");
}
finally
{
getDBAccessLayer.CloseConnection();
}
}