2016-06-24 4 views
1

私の構成は以下のとおりです。 アプリケーションサーバ:Weblogicの10gリリース3 データベース:Oracle 10gの IDE:Netbeansの のJava:バージョン7ます。java.sql.SQLException:接続はすでに最初のデータベースクエリの後に閉じられた

私は例外に直面していますプールからの接続を取得しています。私は接続やステートメントを間違って閉じることの負担を避けるためにリソースを試してみました。

ここにスタックトレースがあります。

[INFO] 2016-06-24 19:01:08,304 org.nmdc.incentivepackage.databaseFiles.DepositMDao checkData 184 - Executing query SELECT count(*) count FROM dep_m 
[INFO] 2016-06-24 19:01:08,304 org.nmdc.incentivepackage.databaseFiles.DepositMDao checkData 188 - Executing query SELECT count(*) count FROM dep_m 
[INFO] 2016-06-24 19:01:08,320 org.nmdc.incentivepackage.databaseFiles.DepositMDao checkData 194 - Relinquish Database connection ... 
[INFO] 2016-06-24 19:01:08,320 org.nmdc.incentivepackage.databaseFiles.DepositMDao checkData 206 - return 1###success### 
[INFO] 2016-06-24 19:01:08,320 org.nmdc.incentivepackage.controllerFiles.CheckDepositMDataController processRequest 35 - result 1###success### .........save 
[INFO] 2016-06-24 19:01:08,320 org.nmdc.incentivepackage.controllerFiles.CheckDepositMDataController processRequest 46 - update deposit master table 
[INFO] 2016-06-24 19:01:08,320 org.nmdc.incentivepackage.controllerFiles.GetDepositMDataController processRequest 33 - Fetching deposit master data 
[ERROR] 2016-06-24 19:01:08,320 org.nmdc.incentivepackage.databaseFiles.DepositMDao getDepositMData 239 - Exception 
java.sql.SQLException: Connection has already been closed. 
at weblogic.jdbc.wrapper.PoolConnection.checkConnection(PoolConnection.java:55) 
at weblogic.jdbc.wrapper.Connection.preInvocationHandler(Connection.java:92) 
at weblogic.jdbc.wrapper.Connection.createStatement(Connection.java:441) 
at org.nmdc.incentivepackage.databaseFiles.DepositMDao.getDepositMData(DepositMDao.java:219) 
at org.nmdc.incentivepackage.controllerFiles.GetDepositMDataController.processRequest(GetDepositMDataController.java:35) 
at org.nmdc.incentivepackage.controllerFiles.GetDepositMDataController.doPost(GetDepositMDataController.java:74) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) 
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) 
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292) 
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175) 
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3498) 
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
at weblogic.security.service.SecurityManager.runAs(Unknown Source) 
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180) 
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086) 
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406) 
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201) 
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173) 

接続オブジェクトを与えるDBUtilityクラスは

public class DBUtility { 
    private static Connection conn; 
    private static Context ctx ; 
    final static Logger logger = LoggerFactory.getLogger(DBUtility.class); 

    public DBUtility() { 
    ctx = null;    
    conn = null;   
    } 

    public static Connection getConnection() throws Exception { 
    if (conn != null) 
     return conn; 
    else {    
      //Hashtable ht = new Hashtable(); 
      // ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory"); 
     // ht.put(Context.PROVIDER_URL,"t3://localhost:7001"); //weblogic server   
      try {     
      ctx = new InitialContext(); 
      javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup ("incentivepool"); 
      conn = ds.getConnection();     
      } 
      catch(Exception e) { 
      logger.error("Error in establishing connection...",e); 
      } 
    } 

    return conn; 
    } 
} 

例外がスローされたクラスは、サーバ上の設定をプール

ublic class DepositMDao extends HttpServlet { 

private Connection connection = null; 
final static Logger log = LoggerFactory.getLogger(DepositMDao.class); 
private String deposit,category,period,query; 
private float amount; 
private String errors,status; 
private int errorCount; 
private Statement statement; 
private ResultSet rs; 
JSONObject jobject; 

public DepositMDao() throws Exception { 
    // connection = DBUtility.getConnection(); 
    if(connection != null) { 
     log.info("Received Database connection ..."); 
    } 
    errors =""; 
    status = "success"; 
    errorCount =0; 
    statement = null; 
} 
public String checkData() throws SQLException { 
    int count=0; 
    query = "SELECT count(*) count FROM dep_m" ; 
    log.info("Executing query "+query); 
    try (Connection connection = DBUtility.getConnection(); 
     Statement statement = connection.createStatement(); 
     ) {   
     log.info("Executing query "+query); 
     try (ResultSet rs = statement.executeQuery(query)) {      
      if(rs.next()) { 
       count = rs.getInt("count"); 
      }    
     } 
     log.info("Relinquish Database connection ..."); 
    } catch(Exception ex) { 
     errorCount++; 
     errors = errors + " "+ex.getMessage(); 
     log.error("Exception ",ex);   
    }  

    if(errorCount == 0) { 
     status = "success";   
    } else { 
     status = "failure";   
    } 
    log.info("return "+count+"###"+status + "###"+errors); 
    return count+"###"+status + "###"+errors; 
} 

public List<DepositMBean> getDepositMData() throws SQLException { 

List<DepositMBean> depositList = new ArrayList(); 
DepositMBean depositBean; 
String dep14,dep11C,dep11B; 
depositBean = null; 
depositList = null; 
query = "SELECT c_dep14,c_dep11C,c_dep11B FROM dep_m ";  
try (Connection connection1 = DBUtility.getConnection(); 
     Statement statement1 = connection1.createStatement(); 
     ) 
    {   
     log.info("Executing query "+query); 
     try (ResultSet rs1 = statement1.executeQuery(query)) { 
      while (rs1.next()) { 
       depositBean = new DepositMBean(); 
       dep14 = rs1.getString("c_dep14"); 
       dep11C = rs1.getString("c_dep11C"); 
       dep11B = rs1.getString("c_dep11B"); 

       depositBean.setcDep14(dep14); 
       depositBean.setcDep11B(dep11B); 
       depositBean.setcDep11C(dep11C);    
       depositList.add(depositBean);    
      }  
      depositBean.display(); 
      log.info("Relinquish Database connection ..."); 
     } 
    } catch(Exception ex) { 
     log.error("Exception ",ex);   
    } 
return depositList;  
} 

がある:

​​

config2

+0

を閉じた場合は、接続を再作成する必要があり

が間違って何知らないが、あなたは一度だけDataSourceを初期化/ルックアップすることをお勧めします...私はゲッターの中に、いくつかの初期化子に入れていないと思います方法。チェックの横にあるのは接続であり、データソースではありません – Zeromus

+0

サーブレットのフィールドまたは 'DBUtility'クラスとして' Connection'を格納しないでください。接続はWebコンテナによって再要求され、Web要求が完了したときに接続プールに戻されます。コンテナは、それがダングリング/孤立した接続とコーディングエラーであるとみなします。 – Andreas

答えて

2

接続が静的オブジェクトであるということは、1つの接続インスタンスしか存在しないことを意味します。

private static Connection conn 

したがって、初めて接続したときには動作していますが、接続が既に閉じられているため、2回目は接続できません。それは

if (conn != null && !conn.isClosed()) 
    return conn; 
+0

ありがとう!これは、1つの接続のみを取得する最も可能性の高い原因です。私は静的な接続が閉じても1つを再作成するとは思わない。 –

+0

これを回答としてマークします。 Connectionが動作させる前にstaticキーワードを削除するだけです。 –

関連する問題