Domanda

Qualcuno può spiegare come utilizzare esattamente il pool di connessioni preparato usando dbcp? (con qualche codice di esempio se possibile). Ho capito come accenderlo - passando un KeyedObjectPoolFactory a PoolableConnectionFactory. Ma come dovrebbero essere definite in seguito le specifiche dichiarazioni preparate? In questo momento sto solo usando un PoolingDataSource per ottenere connessioni dal pool. Come posso usare le dichiarazioni preparate dal pool?

È stato utile?

Soluzione

Beh, parlando di come ottenere una connessione dal pool rispetto a ottenere " non-pool " connessione, hai qualche modifica nel tuo codice :)? Scommetto che non lo fai. Allo stesso modo con le dichiarazioni preparate. Il tuo codice non dovrebbe cambiare. Quindi, non esiste un esempio di codice utile a questo.

Dovresti leggere i documenti per l'implementazione dell'origine dati JDBC e vedere cosa hanno da dire gli sviluppatori sul pool. Non ci sono altre fonti di informazioni affidabili su questo.

Da qui : Questo componente ha anche la capacità di mettere in comune PreparedStatements. Se abilitato, verrà creato un pool di istruzioni per ogni connessione e verranno preparati i pool creati da uno dei seguenti metodi:

* public PreparedStatement prepareStatement(String sql)
* public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)

Quindi, continui a usare la chiamata preparStatement () e il tuo dbcp in teoria si occuperà del pooling (cioè se stai provando a creare " select * dagli utenti dove u.name come: id " ;, proverà per trovare prima questa affermazione nel pool)

Altri suggerimenti

Ecco il codice di base che uso.

    GenericObjectPool connectionPool = new GenericObjectPool(null);
    connectionPool.setMinEvictableIdleTimeMillis(1000 * 60 * 30);
    connectionPool.setTimeBetweenEvictionRunsMillis(1000 * 60 * 30);
    connectionPool.setNumTestsPerEvictionRun(3);
    connectionPool.setTestOnBorrow(true);
    connectionPool.setTestWhileIdle(false);
    connectionPool.setTestOnReturn(false);

    props = new Properties();
    props.put("user", username);
    props.put("password", password);
    ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(url, props);

    PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, connectionPool, null, "SELECT 1", false, true);
    PoolingDataSource dataSource = new PoolingDataSource(connectionPool);

Il fatto è che se si utilizza una singola connessione , memorizzerà nella cache PreparedStatement se lo vuoi o no, l'unico modo possibile per influire su questo è usare DataSource o per utilizzare l'API specifica del fornitore. Ma queste istruzioni non sono visibili da altre connessioni e se si prepara la stessa istruzione utilizzando un'altra connessione, la ricrea nuovamente. Quindi i pool di connessioni come DBCP sotto il cofano consentono il riutilizzo delle PreparedStatement tra diverse connessioni (utilizza l'interfaccia PooledConnection invece della semplice Connection ), mantengono traccia di tutte le dichiarazioni preparate da tutte le connessioni.

AGGIORNAMENTO: sembra che mi sia sbagliato su queste informazioni, almeno non ho trovato questa funzionalità in C3P0.

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