मैं यहां से इसके ट्यूटोरियल के बाद apache dbcp2 कनेक्शन पूलिंग का उपयोग करके mysql डेटाबेस से कनेक्ट करने का प्रयास कर रहा हूं:

https://git-wip-us.apache.org/repos/asf?p=commons-dbcp.git;a=blob;f=doc/PoolingDataSourceExample.java;h=2a12c74898930b9623223db1597b8a8052a6f1df;hb=HEAD

मेरा डेटाबेस कनेक्शन वर्ग जो कनेक्शन लौटाता है वह कुछ इस तरह दिखता है:

public class DbConnection {

private static interface Singleton {

    final DbConnection INSTANCE = new DbConnection();
}

private final PoolingDataSource<PoolableConnection> dataSource;

private DbConnection() {
    // A ConnectionFactory that the pool will use to create Connections.
    DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory(url, user, pass);  //url,user,pass for db connnection

    //implement the pooling functionality.
    PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, null);
    GenericObjectPoolConfig config = new GenericObjectPoolConfig();
    config.setMaxWaitMillis(500);
    config.setMaxTotal(20);
    config.setMaxIdle(5);
    config.setMinIdle(5);
    //PoolingDataSource expect an ObjectPool
    ObjectPool<PoolableConnection> connectionPool = new GenericObjectPool<>(poolableConnectionFactory, config);
    // Set the poolableConnectionFactory's pool property to the owning pool
    poolableConnectionFactory.setPool(connectionPool);

    this.dataSource = new PoolingDataSource<>(connectionPool);
}

public static Connection getCon() throws SQLException {
    return Singleton.INSTANCE.dataSource.getConnection();
}
} 

मैं कनेक्शन का परीक्षण करने और अपने MySQL डेटाबेस से कुछ वापस करने के लिए apache jmeter का उपयोग कर रहा हूं। मैंने रैंप-अप अवधि (सेकंड में) 2 सेकंड के साथ 100 उपयोगकर्ता बनाए। मैंने एक Http request बनाया और जब मैंने view results tree में अपनी प्रतिक्रिया देखने की कोशिश की तो मुझे पहले 20 अनुरोध के लिए सफलतापूर्वक प्रतिक्रिया मिली। बाद के अनुरोधों (21 से 100) का जवाब खाली है। मैं इसमें शामिल कई मुद्दों से गुजरा हूं:

java.sql.SQLException: कनेक्शन नहीं मिल सकता, पूल त्रुटि निष्क्रिय वस्तु के लिए समयबाह्य प्रतीक्षा

मैं अपने कोड को इस प्रकार एक्सेस करता हूं:

try (PreparedStatement ps = DbConnection.getCon().prepareStatement("SELECT id FROM test WHERE id =?;")) {
        ps.setString(1, id);
        try (
                ResultSet rs = ps.executeQuery()) {
            return rs.next();
        }
    } catch (Exception ex) {

    }
1
Ujjwal Jung Thapa 2 जून 2019, 10:10

1 उत्तर

सबसे बढ़िया उत्तर

आप Connection ऑब्जेक्ट को बंद नहीं कर रहे हैं, आपको इस तरह के वैरिएबल को try-with-resource ब्लॉक में घोषित करना होगा:

try (Connection conn = DbConnection.getCon(); 
       PreparedStatement ps = conn.prepareStatement("SELECT id FROM test WHERE id =?;")) {

इसके अलावा आपको ResultSet को बंद करने की आवश्यकता है, या तो close विधि ResultSet को विधि में कॉल करें या इसे वापस करने वाली एक नई विधि का उपयोग करके संसाधनों के साथ प्रयास करें ब्लॉक में जोड़ें

1
user7294900 2 जून 2019, 10:09