1

私はJDBCの初心者であり、私の研究では、すでにBoneCPを試したのでC3POに関する最高のレビューを見つけましたが、接続を閉じていないことがわかりました。

マルチスレッドソフトリアルタイムソフトウェア(トレーディングシステム)用の接続プール、おそらくステートメントプールも必要です

これは「SELECT」の例です。

  1. いいですか?
  2. getConn() を作成してからステートメントを作成し、クエリごとに両方を閉じる必要がありますか?
  3. 一般的なコメントや提案はありますか?

            Connection conn = null;
    ResultSet rs = null;
    Statement st = null;
    String query = null;
    try {
    
        query = " SELECT id " +
                  " FROM " + DBTables.PandaSources;
    
        //rs = DB.ConnPool.invoke(conn, query, rs);
        st = DB.ConnPool.getSt();
        rs = st.executeQuery(query);
    
        if (rs != null) {
            while (rs.next()) {
                .....
                                    ......
            }
        }
    } 
    catch (Exception e) { 
        e.printStackTrace(); 
        Util.logException(e);
    }
    finally {
        if (rs != null) try { rs.close(); } catch (SQLException e) { e.printStackTrace(); Util.logException(e); }
        if (st != null) try { st.close(); } catch (SQLException e) { e.printStackTrace(); Util.logException(e); }
        if (conn != null) try { conn.close(); } catch (SQLException e) { e.printStackTrace(); Util.logException(e); }
    }
    
    query = null;
    st = null;
    rs = null;
    conn = null;
    }
    
      public static synchronized Statement getSt() throws SQLException {
    return getConn().createStatement();
      }
    
     public static synchronized Connection getConn() throws SQLException {
       if (connectionPoolDatasource == null) {
          initPool();
       }
       return connectionPoolDatasource.getConnection();
    

    }

     public static synchronized void initPool() throws SQLException {
    
    DBLocation loc = null;
    try {
    
        loc = GTMain.DBConn.get(Util.DB_GURUSTRADE);
    
        // C3PO
        connectionPoolDatasource = new ComboPooledDataSource();
        connectionPoolDatasource.setDriverClass(loc.driver);
        connectionPoolDatasource.setJdbcUrl(loc.url);
        connectionPoolDatasource.setUser(loc.user);
        connectionPoolDatasource.setPassword(loc.password);
    
        // properties
        connectionPoolDatasource.setAcquireIncrement(5);
        connectionPoolDatasource.setMaxIdleTime(3600);
        connectionPoolDatasource.setMaxIdleTimeExcessConnections(300);
        connectionPoolDatasource.setMaxPoolSize(100);
        connectionPoolDatasource.setMinPoolSize(20);
        connectionPoolDatasource.setNumHelperThreads(6);
        connectionPoolDatasource.setUnreturnedConnectionTimeout(3600);
    
    }
    catch (Exception e) {
        e.printStackTrace(); 
    }
    

    }

4

0 に答える 0