У меня есть Java Webapp, который слишком много общается с базой данных SQL Server. Я хочу решить, как эффективно управлять соединениями с этой БД. Первый вариант, который появляется на ум, - это объединение пулов сторонних поставщиков. Я выбрал C3P0 и ГСБД и подготовили несколько тестов, чтобы сравнить эти подходы следующим образом:Пул соединений JDBC для SQL Server: DBCP vs C3P0 vs No 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");
}
ДБХП:
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");
}
И Вот результаты:
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
Можно сказать, инициализации и запуска время объединения библиотек могут повлиять на результаты этих тестов. Я повторил их с большими числами в цикле, и результаты почти одинаковы.
Удивительно, что метод объединения не намного быстрее, чем методы объединения пулов. Хотя я предполагаю, что когда мы физически закрываем соединение, получение нового должно быть более трудоемким.
Итак, что здесь происходит?
EDIT_01: C3P0 и ГСБД конфигурации
c3p0:
cpds.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(100);
cpds.setMaxStatements(1000);
ДБХП:
basicDataSource.setMinIdle(5);
basicDataSource.setMaxIdle(30);
basicDataSource.setMaxTotal(100);
basicDataSource.setMaxOpenPreparedStatements(180);
Остальные конфигурации оставлены по умолчанию. Стоит упомянуть, что все соединения установлены для БД на локальном хосте.
Вы используете только одно соединение за раз, что снижает полезность пула соединений. Вы также не указали конфигурацию пула соединений (например, тайм-ауты, минимальный/максимальный размер, ваше соединение с локальным хостом или удаленный сервер и т. Д.). –
@MarkRotteveel Проверьте Edit_01. –