Ich habe diese Java-Webapp, die zu viel mit einer SQL Server-Datenbank kommunizieren. Ich möchte entscheiden, wie die Verbindungen zu dieser Datenbank auf effiziente Weise verwaltet werden. Die erste Option, die Ihnen in den Sinn kommt, ist die Verwendung von Drittanbietern, die Verbindungen aufbauen. Ich wählte C3P0 und DBCP und einige Testfälle vorbereitet, diese Ansätze zu vergleichen, wie folgt:JDBC Verbindungspooling für SQL Server: DBCP vs C3P0 vs keine Pooling
Nein Pooling:
public static void main(String[] args) {
long startTime=System.currentTimeMillis();
try {
for (int i = 0; i < 100; i++) {
Connection conn = ConnectionManager_SQL.getInstance().getConnection();
String query = "SELECT * FROM MyTable;";
PreparedStatement prest = conn.prepareStatement(query);
ResultSet rs = prest.executeQuery();
if (rs.next()) {
System.out.println(i + ": " + rs.getString("CorpName"));
}
conn.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Finished in: "+(System.currentTimeMillis()-startTime)+" milli secs");
}
DBCP:
public static void main(String[] args) {
long startTime=System.currentTimeMillis();
try {
for (int i = 0; i < 100; i++) {
Connection conn = ConnectionManager_SQL_DBCP.getInstance().getConnection();
String query = "SELECT * FROM MyTable;";
PreparedStatement prest = conn.prepareStatement(query);
ResultSet rs = prest.executeQuery();
if (rs.next()) {
System.out.println(i + ": " + rs.getString("CorpName"));
}
conn.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Finished in: "+(System.currentTimeMillis()-startTime)+" milli secs");
}
C3P0:
public static void main(String[] args) {
long startTime=System.currentTimeMillis();
try {
for (int i = 0; i < 100; i++) {
Connection conn = ConnectionManager_SQL_C3P0.getInstance().getConnection();
String query = "SELECT * FROM MyTable;";
PreparedStatement prest = conn.prepareStatement(query);
ResultSet rs = prest.executeQuery();
if (rs.next()) {
System.out.println(i + ": " + rs.getString("CorpName"));
}
conn.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Finished in: "+(System.currentTimeMillis()-startTime)+" milli secs");
}
Und Hier sind die Ergebnisse:
Max Pool size for c3p0 and dbcp=10
c3p0: 5534 milli secs
dbcp: 4807 milli secs
No Pooling: 2660 milli secs
__
Max Pool size for c3p0 and dbcp=100
c3p0: 4937 milli secs
dbcp: 4798 milli secs
No Pooling: 2660 milli secs
Man könnte sagen, die Initialisierung und Startzeitbibliotheken zu bündeln könnten die Ergebnisse dieser Testfälle betreffen. Ich habe sie mit größeren Zahlen in der Schleife wiederholt und die Ergebnisse sind fast gleich.
Überraschenderweise ist der Ansatz ohne Pooling viel schneller als die Verbindungs-Pooling-Methoden. Während ich annehme, wenn wir eine Verbindung physisch schließen, muss ein neuer zeitaufwendiger sein.
Also, was ist hier los?
EDIT_01: c3p0 und dbcp Konfigurationen
c3p0:
cpds.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(100);
cpds.setMaxStatements(1000);
dbcp:
basicDataSource.setMinIdle(5);
basicDataSource.setMaxIdle(30);
basicDataSource.setMaxTotal(100);
basicDataSource.setMaxOpenPreparedStatements(180);
Die übrigen Konfigurationen als Standard bleiben. Erwähnenswert ist, dass alle Verbindungen für eine DB auf localhost aufgebaut sind.
Sie verwenden nur jeweils eine Verbindung, wodurch sich der Nutzen eines Verbindungspools verringert. Sie haben auch nicht die Konfiguration Ihres Verbindungspools angezeigt (zB Timeouts, Min/Max-Größe, ist Ihre Verbindung zu localhost, oder ein Remote-Server, etc.). –
@MarkRotteveel Überprüfen Sie die Edit_01. –