Ich benutze JDBC-Pool für meine Tomcat-Web-Anwendungen.JDBC Pool - Wie man richtig verwendet
Wie ich in Dokumenten lesen, brauche ich Verbindung, führen Abfrage und schließen. Nach dem Schließen kehrt die Verbindung zum Pool zurück.
Ich denke Weg 1 besser, wenn Abfrage DB von externen Ereignissen abhängen und für die Aufgabe, die alle 5 sec Way 2 mehr korrekt.
Kann jemand erklären, welche Art der Verwendung für Aufgaben, die alle 5 Sekunden wiederholen?
PS: Ich überspringe zusätzliche Checks in Code, um Code lesbar zu machen.
Way # 1 Ruft Verbindung von Pool und in der Nähe Looping
Connection c = null;
Statement s = null;
ResultSet rs = null;
DataSource ds = ... Get DataSource ...
c = ds.getConnection();
while(running) {
try {
s = c.createStatement();
rs = s.executeQuery('SELECT data FROM my_table');
... do something with result ...
} catch (SQLException sec) {
... print exception ...
... if connection lost, try reconnect and execute query again ...
} finally {
try {
rs.close();
s.close();
} catch (SQLException sec) {
... print exception ...
}
... Thread sleep 5 seconds and repeat ...
}
}
c.close();
Pool Config alle 5 Sekunden
Connection c = null;
Statement s = null;
ResultSet rs = null;
DataSource ds = ... Get DataSource ...
while(running) {
try {
c = ds.getConnection();
s = c.createStatement();
rs = s.executeQuery('SELECT data FROM my_table');
... do something with result ...
} catch (SQLException sec) {
... print exception ...
} finally {
try {
rs.close();
s.close();
c.close();
} catch (SQLException sec) { ... print exception ... }
... Thread sleep 5 seconds and repeat ...
}
}
Way # 2 Get Verbindung vor Schleife und schließen danach wieder
<Resource name="jdbc/pg_mega" auth="Container"
type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://127.0.0.1:6432/db"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
username="***" password="****"
defaultAutoCommit="true"
initialSize="1"
maxActive="300"
maxTotal="300"
maxIdle="20"
minIdle="5"
maxWait="10000"
validationQuery="select 1"
validationInterval="30000"
testWhileIdle="false"
testOnBorrow="true"
testOnReturn="false"
timeBetweenEvictionRunsMillis="30000"
minEvictableIdleTimeMillis="30000"
/>
Ich verstehe nicht, warum Sie Thread-Schlaf auf Web-App haben, es sei denn, Sie verarbeiten große Daten oder Async-Prozess? Der zweite Ansatz sieht gut aus. Sie müssen keine Verbindung bei jeder Iteration der Schleife erhalten. – notionquest
Dieser Code von Bean, die Statistik, Teil der Web-App aggregieren – Dmitry
Nun, die zweite Option reserviert eine Verbindung vollständig für diesen Zweck. Der erste ermöglicht anderen Threads, die Verbindung zu verwenden, während der Thread sie nicht verwendet. Es macht wahrscheinlich keinen großen Unterschied. Sie sollten jedoch einen richtigen Scheduler anstelle eines While/Sleep-Systems verwenden. – Kayaman