SSL connection pool

0

Cześć,
tworzę desktopową apkę, która łączy się z bazą danych po SSL'u. Nie rozumiem dlaczego wykonywanie operacji, które zwykle są prostymi selectami/updatami na bazie zajmuje tyle czasu (sekunda lub dwie) skoro odpowiednio wcześniej przygotowuje connection poola. Wiem, że nie ma co porównywać tego do połączeń z localhostem, no ale to raczej nienormalne a przede wszystkim niewygodne kiedy widok aplikacji czeka na result seta. Może to kwestia defaultowego timeouta połączenia? Proszę o wskazówki.

0

Dlaczego uważasz, że to kwestia "SSL connection poola" (temat posta)?

Uważasz, że czas obsługi jest zbyt długi, ok.
a) Jaki wg Ciebie jest akceptowalny czas?
b) Co się dzieje od momentu zainicjowania akcji po stronie aplikacji do otrzymania danych i ile czasu zajmują poszczególne etapy przetwarzania? (to możesz sobie przeanalizować jakimś dedykowanym narzędziem klikalnym albo toporne logowanie timestampów/czasu trwania poszczególnych etapów przetwarzania).

Powyższe ma na celu określenie do czego dążysz i gdzie aktualnie się znajdujesz ;-)

0

Zamiast zgadywac sugerowałbym użyć profilera/metryk. Bo przypuszczam ze błąd jest w zupełnie innym miejscu niż ci się wydaje.

0

Na początku pomyślałem, że to z powodu handshak'a, który ma miejsce za każdym razem kiedy apka łączy się do bazy (dla pewności sprawdzę to sobie wiresharkiem).
Kolejną wątpliwością był fakt, że może błędem jest zamykanie statement'ów, result setów i zwalnianie połączeń i może przez tworzenie tych obiektów apka zwalnia.
Zastanawiałem się też czy sam UI nie jest może przyczyną długiego oczekiwania na odpowiedź, bo niektóre widgety są klepnięte po "studencku".
Może jakaś metoda asynchroniczna by się tu przydała?
Oczywiście pochylę się nad profilerem/metryką, dzięki.

0
esy_floresy napisał(a):

...

Może to, może nie to, może tamto. Takie szukanie na ślepo, może się uda, może nie. Dla tego typu problemów potrzebne jest usystematyzowane podejście.
Zmierz na co idzie najwięcej czasu i tę część optymalizuj (bo da największy zysk).

0

screenshot-20191218143456.png

Pierwsze trzy wartości bardzo szybko zwiększają swoją objętość. Pochodzą z cyklicznych odpytań bazy (co 1s) , które w aplikacji pełnią funkcje monitorującą. SQL'e każdej z tych wartości są wykonywane w oddzielnych wątkach, a wyniki są zapisywane i zbindowane do odpowiednio String/Double Property, z których korzysta Chart żeby wyrysować wykres z ostatnich 30 sekund.
Czy da się wyrzucać z pamięci poprzednio nadpisane wartości, tak żeby to jak najlepiej przypominało real time chart?

0

Pokazujesz zużycie pamięci, a nie co ile czasu zajmuje. Czy problemem jest brak pamięci? Weź jakiegoś JVisualVM, podepnij się pod proces JVM i zobacz hotspoty.

0

Pamięć nie jest problemem. Pomyślałem, że skoro te zbędne dane w szybkim tempie zapychają pamięć to mogą wpływać na performence reszty aplikacji.

Poniżej zamieszczam kod connection poola. Wyniki timestampów (zostały umieszczone przed i po pętli for) są tragiczne tylko właśnie dla połączenia SSL (chociaż to tworzenie połączeń).

TIMESTAMP (started creating connections): 1576791837996
TIMESTAMPS(done. returned pool): 1576791840835

różnica to jakieś 2,8 s.

	private static String url;
	private static boolean sslFlag = false;
	private String ip, port, db, user, pass; 
	private static List<Connection> connectionPool;
    private static List<Connection> usedConnections = new ArrayList<>();
    private static final int MAX_POOL_SIZE = 15;
    private static int INITIAL_POOL_SIZE = 10;
    
    private BasicConnectionPool(String url, String ip, String port, String db, String user, String pass, List<Connection> connectionPool) {
    	this.url = url;
    	this.ip = ip;
    	this.port = port;
    	this.db = db;
    	this.user = user;
    	this.pass = pass;
    	this.connectionPool = connectionPool;
    }
    
    public static Boolean getSslFlag() {
		return sslFlag;
	}
	public static void setSslFlag(Boolean sslFlag) {
		BasicConnectionPool.sslFlag = sslFlag;
	}
    
    public static BasicConnectionPool create(String ip, String port, String db, String user, String pass) throws SQLException {
    	String url = "jdbc:db2://" + ip+ ":"+ port + "/" + db + ":" +"user=" + user + ";password=" + pass + ";";
    	String urlSSL =  "jdbc:db2://" + ip+ ":"+ port + "/" + db + ":" +"user=" + user + ";password=" + pass + ";sslConnection=true;";
	
		List<Connection> pool = new ArrayList<>(INITIAL_POOL_SIZE);
		for (int i = 0; i < INITIAL_POOL_SIZE; i++) {
			if(sslFlag) {
				pool.add(createConnection(urlSSL));
			} else {
				pool.add(createConnection(url));
			}
		}
    	return new BasicConnectionPool(url, ip, port, db, user, pass, pool);
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1