Domanda

Dopo essere stanchi di bloccaggio costante di c3p0 io mi rivolgo a BoneCP per un pool di collegamento alternativo per il mio database. Ho un'applicazione server che i processi di circa 7.000 pezzi al minuto e le esigenze di log tali elementi nel nostro database MySQL. Al momento ho 100 thread di lavoro ed ho impostato la mia piscina come ad esempio:

BoneCPConfig config = new BoneCPConfig();
      config.setJdbcUrl("jdbc:mysql://"+Settings.MYSQL_HOSTNAME+"/"+Settings.MYSQL_DATABASE+"?autoReconnectForPools=true" ); 
      config.setUsername(Settings.MYSQL_USERNAME); 
      config.setPassword(Settings.MYSQL_PASSWORD);
      config.setMinConnectionsPerPartition(5);
      config.setMaxConnectionsPerPartition(10);
      config.setPartitionCount(5);
      config.setAcquireIncrement(5);
      connectionPool = new BoneCP(config); // setup the connection pool

Sono quelle impostazioni accettabili per tale app? Mi sto chiedendo perché dopo un minuto o due in corsa mi è stato sempre eccezioni BoneCP quando si cerca di chiamare getConnection sulla piscina. Grazie per l'aiuto.

Ecco il codice che stavo usando per le chiamate db nei miei thread di lavoro, che non può non sulla linea dbConn = this.dbPool.getConnection(). Sto non chiude le connessioni correttamente?

private void insertIntoDb() {
    try {  
        Connection dbConn = this.dbPool.getConnection();

        try {
            PreparedStatement ps3 = dbConn.prepareStatement("INSERT IGNORE INTO test_table1 SET test1=?, test2=?, test3=?");
            ps3.setString(1, "some string");
            ps3.setString(2, "some other string");
            ps3.setString(3, "more strings");
            ps3.execute();
            ps3.close();

            PreparedStatement ps4 = dbConn.prepareStatement("INSERT IGNORE INTO test_table2 SET test1=?, test2=?, test3=?");
            ps4.setString(1, "some string");
            ps4.setString(2, "some other string");
            ps4.setString(3, "more strings");
            ps4.execute();
            ps4.close();

        } catch(SQLException e) {
            logger.error(e.getMessage());
        } finally {
            try {
                dbConn.close();
            } catch (SQLException e) {
                logger.error(e.getMessage());
            }
        }
    } catch(SQLException e) {
        logger.error(e.getMessage());
    }
}

Questo è l'errore che stavo vedendo:

 [java]  WARN [com.google.common.base.internal.Finalizer] (ConnectionPartition.java:141) - BoneCP detected an unclosed connection and will now attempt to close it for you. You should be closing this connection in your application - enable connectionWatch for additional debugging assistance.
 [java]  WARN [com.google.common.base.internal.Finalizer] (ConnectionPartition.java:141) - BoneCP detected an unclosed connection and will now attempt to close it for you. You should be closing this connection in your application - enable connectionWatch for additional debugging assistance.
 [java]  WARN [com.google.common.base.internal.Finalizer] (ConnectionPartition.java:141) - BoneCP detected an unclosed connection and will now attempt to close it for you. You should be closing this connection in your application - enable connectionWatch for additional debugging assistance.
 [java]  WARN [com.google.common.base.internal.Finalizer] (ConnectionPartition.java:141) - BoneCP detected an unclosed connection and will now attempt to close it for you. You should be closing this connection in your application - enable connectionWatch for additional debugging assistance.
 [java]  WARN [com.google.common.base.internal.Finalizer] (ConnectionPartition.java:141) - BoneCP detected an unclosed connection and will now attempt to close it for you. You should be closing this connection in your application - enable connectionWatch for additional debugging assistance.
 [java]  WARN [com.google.common.base.internal.Finalizer] (ConnectionPartition.java:141) - BoneCP detected an unclosed connection and will now attempt to close it for you. You should be closing this connection in your application - enable connectionWatch for additional debugging assistance.
 [java]  WARN [com.google.common.base.internal.Finalizer] (ConnectionPartition.java:141) - BoneCP detected an unclosed connection and will now attempt to close it for you. You should be closing this connection in your application - enable connectionWatch for additional debugging assistance.

ERROR pool-2-thread-39 2010-09-04 13:36:19,798 com.test.testpackage.MyTask - null
java.sql.SQLException
    at com.jolbox.bonecp.BoneCP.getConnection(BoneCP.java:381)
È stato utile?

Soluzione

  

Sono quelle impostazioni accettabili per tale app? Mi sto chiedendo perché dopo un minuto o due in corsa mi è stato sempre eccezioni boneCP quando si cerca di richiamare getConnection sulla piscina. grazie per l'aiuto.

Se si dispone di 100 lavoratori, perché si limita la piscina a 50 connessioni (numero di partizioni x numero massimo di connessioni per partizione vale a dire 5 x 10 nel tuo caso)?

  

Non sono io di chiudere le connessioni correttamente?

sembra ok (ma forse abilitare connectionWatch come suggerito di vedere ciò che l'avviso è di circa esattamente). Personalmente, vicino tutte le risorse che uso, tra cui istruzione e di risultato set. Solo nel caso, qui è l'uso dell'idioma I:

Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

try {
    conn = pool.getConnection();
    pstmt = conn.prepareStatement(SOME_SQL);
    pstmt.setFoo(1, foo);
    ...
    rs = pstmt.executeQuery();
    ...
} finally {
    if (rs != null) try { rs.close(); } catch (SQLException quiet) {}
    if (pstmt != null) try { pstmt.close(); } catch (SQLException quiet) {}
    if (conn != null) try { conn.close(); } catch (SQLException quiet) {}
}

È possibile raggruppare le chiamate di cui sopra in un metodo statico di una classe di utilità.

In alternativa è possibile utilizzare DbUnit.closeQuietly(Connection, Statement, ResultSet) da Commons DbUtils che già fa questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top