0
Oracleデータベースに接続する次のコードを記述しました。これはREST APIに使用されています。接続先のデータベースにIDLE_TIMEパラメータが30分に設定されています(これは変更できません)。データベース接続が30分以上アイドル状態の場合、「java.sql.SQLRecoverableException:Closed Connection」というエラーがスローされます。このエラーがスローされた後、APIは機能しなくなります。これをどうやって回避するのですか?Oracle DBへのJDBC接続を終了する方法(SQLRecoverableException Closed Connection)?
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.Properties;
import java.util.Queue;
import java.util.ResourceBundle;
import java.sql.SQLRecoverableException;
import oracle.jdbc.driver.*;
import oracle.jdbc.pool.*;
public class OrcConnector {
private Queue<Connection> connections;
private int maxConnections;
private static final int MAX_CONNECTIONS_DEFAULT = 10;
public OrcConnector() {
connections = new LinkedList<Connection>();
maxConnections = MAX_CONNECTIONS_DEFAULT ;
}
public synchronized int getMaxConnections(){
return maxConnections;
}
public synchronized void setMaxConnection (int maxConnections) {
this.maxConnections = maxConnections;
}
public synchronized ConnWrapper getConnection() throws SQLException, BusyConnections {
Connection availConn;
System.out.println("I am in OrcConnection");
if (connections.size() > 0) {
availConn = connections.poll();
} else if (connections.size() < maxConnections) {
Properties prop = new Properties();
ResourceBundle resource = ResourceBundle.getBundle("database");
String url = resource.getString("db.url");
String user = resource.getString("db.user");
String pass = resource.getString("db.password");
prop.put("user", user);
prop.put("password", pass);
prop.put("autoReconnect", "true");
prop.put("characterEncoding", "UTF-8");
prop.put("useUnicode", "true");
availConn = DriverManager.getConnection(url,user,pass);
System.out.println("I am in OrcConnection");
} else {
throw new BusyConnections();
}
return new ConnWrapper(availConn, this);
}
public synchronized void putConnection(Connection conn) {
if (conn != null) {
if (connections.size() < maxConnections) {
connections.add(conn);
} else {
try {
conn.close();
} catch (SQLException e) {
System.out.println("connection could not be closed" + e.getMessage());
}
}
}
}
}
SQLRecoverableExceptionを捕捉して接続を再確立しようとしましたが動作しませんでした。 – user3357381
いくつかのオプション:1. Webコンテナを使用して接続(および接続プール)を管理します。2.接続を再利用しようとしないでください。必要なときのみ開き、完了したら閉じます。オプション:タイマーを使用してデータベースを定期的にpingしてタイムアウトを回避する – copeg
独自の接続プールを作成しないでください。既存のものを使用してください。あなたが考えるように単純ではありません。 – EJP