Frage

Kann mir jemand erklären, wie genau vorbereitet Connection Pooling dbcp verwenden, können verwendet werden? (Mit einigem Beispiel-Code, wenn möglich). Ich habe herausgefunden, wie es einzuschalten - ein KeyedObjectPoolFactory zum PoolableConnectionFactory vorbei. Aber wie sollten die spezifischen Prepared Statements danach definiert werden? Im Moment benutze ich nur eine PoolingDataSource zu bekommen Verbindungen aus dem Pool. Wie kann ich die vorbereiteten Anweisungen aus dem Pool verwenden?

War es hilfreich?

Lösung

spricht gut über Verbindung aus dem Pool „nicht-gepoolten“ Verbindung vs bekommen, Sie haben keine Änderung im Code :)? Ich wette, Sie nicht. Gleiche Art und Weise mit vorbereiteten Anweisungen. Der Code sollte nicht geändert werden. So gibt es kein nützliches Codebeispiel dafür.

Sie sollten Dokumente für Ihre JDBC-Datenquelle Implementierung lesen und sehen, was Entwickler über Pooling zu sagen hat. Es gibt keine andere Quelle für zuverlässige Informationen zu diesem Thema.

hier : Diese Komponente hat auch die Fähigkeit PreparedStatements zu bündeln. Wenn diese Funktion aktiviert wird eine Erklärung Pool für jede Verbindung und PreparedStatements durch eine der folgenden Methoden erstellt wird erstellt werden gepoolt:

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

Also, halten Sie nur prepareStatement () -Aufruf verwenden und Ihre dbcp in der Theorie werden die Bündelung kümmern (dh, wenn Sie versuchen, „select * von den Benutzern u wo u.name mögen: id“ zu erstellen, wird es versuchen, finde diese Aussage im Pool zuerst)

Andere Tipps

Hier grundlegender Code verwende ich.

    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);

Die Sache ist, wenn Sie ein einzelnes Connection verwenden, wird es PreparedStatements zwischenzuspeichern, ob Sie das wollen oder nicht, die einzige Möglichkeit, auf diese beeinflussen ist DataSource Eigenschaften zu verwenden oder herstellerspezifische API zu verwenden. Aber diese Aussagen sind nicht sichtbar von anderen Verbindungen und wenn Sie die gleiche Anweisung eine andere Verbindung herzustellen, wird es wieder neu erstellen. So Verbindungspools wie DBCP unter der Haube ermöglichen Wiederverwendung von PreparedStatements zwischen verschiedenen Verbindungen (es PooledConnection Schnittstelle statt einfacher Connection verwendet), sie behalten den Überblick über alle Aussagen von allen Verbindungen hergestellt.

UPDATE: es scheint, war ich auf diesen Informationen falsch, zumindest konnte ich nicht diese Funktionalität in C3P0 finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top