Lesson Learned #168: Connection is not available error message using Hikari connection pooling

Published Mar 26 2021 03:59 AM 1,687 Views

Today, I worked on a very interesting case that our customer is facing the following error message connecting to Azure SQL DB and/or Azure Managed Instance "Connection is not available, request timed out after ..". 

 

Following, I would like to share with you my lessons learned about why and how this error message is fired in two different situations:

 

  • All the connections in the Hikari pooling are in use. 
  • The session limit for the database has been reached. 

 

In order to review these two things, I included the Hikari connection pooling based on this article: Improve Java application reliability with Azure SQL Database using JDBC and connection pooling. - Mi... and modifying the current Java code that you could find in this GitHub

 

My database is a standard 1 database that we have a session limit in 900. The first thing to probe my theory about the connection pooling is to configure setmaxiumpoolsize parameter to 50 and setCloseConnection to false to open this number of connections without closing any of them. In this situation, once I reached the connection number 51 I got the error message "Connection is not available"

 

 

    public static void main(String[] args) throws Exception{
        System.out.println("Testing connection JAVA! (Hikari)");
        ErrorClientHikari oErrorClient = new ErrorClientHikari();
                    oErrorClient.setCloseConnection(false);
                    oErrorClient.setReadingSQLData(false);
                    oErrorClient.setTotalIteractions(30000);
                    oErrorClient.setSQLReadToExecute("SELECT count(*) Id FROM PerformanceVarcharNVarchar where TextToSearch =N'Value'");
                    oErrorClient.setSQLCommandTimeout(30000);
                    oErrorClient.setServerName("servername.database.windows.net");
                    oErrorClient.setDatabaseName("dbname");
                    oErrorClient.setUserName("username");
                    oErrorClient.setPassword("password");
                    oErrorClient.setMaximumPoolSize(50);
                    oErrorClient.setConnectionTimeout(5000);
                    oErrorClient.LoadData();

 

 

In this similar situation, I'm going to modify the setmaxiumpoolsize parameter to 1000 to know what happen when I reached more connections that the session limit of my Azure SQL Database Standard 1. At this time, I got the same error message: "Connection is not available, request timed out after.." so, that means, that both situations will report the same error message.

 

 

    public static void main(String[] args) throws Exception{
        System.out.println("Testing connection JAVA! (Hikari)");
        ErrorClientHikari oErrorClient = new ErrorClientHikari();
                    oErrorClient.setCloseConnection(false);
                    oErrorClient.setReadingSQLData(false);
                    oErrorClient.setTotalIteractions(30000);
                    oErrorClient.setSQLReadToExecute("SELECT count(*) Id FROM PerformanceVarcharNVarchar where TextToSearch =N'Value'");
                    oErrorClient.setSQLCommandTimeout(30000);
                    oErrorClient.setServerName("servername.database.windows.net");
                    oErrorClient.setDatabaseName("dbname");
                    oErrorClient.setUserName("username");
                    oErrorClient.setPassword("password");
                    oErrorClient.setMaximumPoolSize(1000);
                    oErrorClient.setConnectionTimeout(5000);
                    oErrorClient.LoadData();
    }

 

 

Enjoy!

 

 

%3CLINGO-SUB%20id%3D%22lingo-sub-2236278%22%20slang%3D%22en-US%22%3ELesson%20Learned%20%23168%3A%20Connection%20is%20not%20available%20error%20message%20using%20Hikari%20connection%20pooling%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2236278%22%20slang%3D%22en-US%22%3E%3CP%3EToday%2C%20I%20worked%20on%20a%20very%20interesting%20case%20that%20our%20customer%20is%20facing%20the%20following%20error%20message%20connecting%20to%20Azure%20SQL%20DB%20and%2For%20Azure%20Managed%20Instance%20%22Connection%20is%20not%20available%2C%20request%20timed%20out%20after%20..%22.%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EFollowing%2C%20I%20would%20like%20to%20share%20with%20you%20my%20lessons%20learned%20about%20why%20and%20how%20this%20error%20message%20is%20fired%20in%20two%20different%20situations%3A%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CUL%3E%0A%3CLI%3EAll%20the%20connections%20in%20the%20Hikari%20pooling%20are%20in%20use.%26nbsp%3B%3C%2FLI%3E%0A%3CLI%3EThe%20session%20limit%20for%20the%20database%20has%20been%20reached.%26nbsp%3B%3C%2FLI%3E%0A%3C%2FUL%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EIn%20order%20to%20review%20these%20two%20things%2C%20I%20included%20the%20Hikari%20connection%20pooling%20based%20on%20this%20article%3A%26nbsp%3B%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fazure-sql%2Fimprove-java-application-reliability-with-azure-sql-database%2Fba-p%2F781018%22%20target%3D%22_blank%22%3EImprove%20Java%20application%20reliability%20with%20Azure%20SQL%20Database%20using%20JDBC%20and%20connection%20pooling.%20-%20Microsoft%20Tech%20Community%2C%26nbsp%3B%3C%2FA%3E%20and%20modifying%20the%20current%20Java%20code%20that%20you%20could%20find%20in%20this%20%3CA%20href%3D%22https%3A%2F%2Fgithub.com%2FJMNetwalker%2FAzureSQLConnectivityChecker%2Ftree%2Fmaster%2FJAVA%22%20target%3D%22_self%22%20rel%3D%22noopener%20noreferrer%22%3EGitHub%3C%2FA%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EMy%20database%20is%20a%20standard%201%20database%20that%20we%20have%20a%20session%20limit%20in%20900.%20The%20first%20thing%20to%20probe%20my%20theory%20about%20the%20connection%20pooling%20is%20to%20configure%20setmaxiumpoolsize%20parameter%20to%2050%20and%20setCloseConnection%20to%20false%20to%20open%20this%20number%20of%20connections%20without%20closing%20any%20of%20them.%20In%20this%20situation%2C%20once%20I%20reached%20the%20connection%20number%2051%20I%20got%20the%20error%20message%20%22Connection%20is%20not%20available%22%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CPRE%20class%3D%22lia-code-sample%20language-java%22%3E%3CCODE%3E%20%20%20%20public%20static%20void%20main(String%5B%5D%20args)%20throws%20Exception%7B%0A%20%20%20%20%20%20%20%20System.out.println(%22Testing%20connection%20JAVA!%20(Hikari)%22)%3B%0A%20%20%20%20%20%20%20%20ErrorClientHikari%20oErrorClient%20%3D%20new%20ErrorClientHikari()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setCloseConnection(false)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setReadingSQLData(false)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setTotalIteractions(30000)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setSQLReadToExecute(%22SELECT%20count(*)%20Id%20FROM%20PerformanceVarcharNVarchar%20where%20TextToSearch%20%3DN'Value'%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setSQLCommandTimeout(30000)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setServerName(%22servername.database.windows.net%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setDatabaseName(%22dbname%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setUserName(%22username%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setPassword(%22password%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setMaximumPoolSize(50)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setConnectionTimeout(5000)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.LoadData()%3B%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EIn%20this%20similar%20situation%2C%20I'm%20going%20to%20modify%20the%20setmaxiumpoolsize%20parameter%20to%201000%20to%20know%20what%20happen%20when%20I%20reached%20more%20connections%20that%20the%20session%20limit%20of%20my%20Azure%20SQL%20Database%20Standard%201.%20At%20this%20time%2C%20I%20got%20the%20same%20error%20message%3A%20%22Connection%20is%20not%20available%2C%20request%20timed%20out%20after..%22%20so%2C%20that%20means%2C%20that%20both%20situations%20will%20report%20the%20same%20error%20message.%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CPRE%20class%3D%22lia-code-sample%20language-java%22%3E%3CCODE%3E%20%20%20%20public%20static%20void%20main(String%5B%5D%20args)%20throws%20Exception%7B%0A%20%20%20%20%20%20%20%20System.out.println(%22Testing%20connection%20JAVA!%20(Hikari)%22)%3B%0A%20%20%20%20%20%20%20%20ErrorClientHikari%20oErrorClient%20%3D%20new%20ErrorClientHikari()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setCloseConnection(false)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setReadingSQLData(false)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setTotalIteractions(30000)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setSQLReadToExecute(%22SELECT%20count(*)%20Id%20FROM%20PerformanceVarcharNVarchar%20where%20TextToSearch%20%3DN'Value'%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setSQLCommandTimeout(30000)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setServerName(%22servername.database.windows.net%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setDatabaseName(%22dbname%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setUserName(%22username%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setPassword(%22password%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setMaximumPoolSize(1000)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.setConnectionTimeout(5000)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oErrorClient.LoadData()%3B%0A%20%20%20%20%7D%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EEnjoy!%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-TEASER%20id%3D%22lingo-teaser-2236278%22%20slang%3D%22en-US%22%3E%3CP%3EToday%2C%20I%20worked%20on%20a%20very%20interesting%20case%20that%20our%20customer%20is%20facing%20the%20following%20error%20message%20connecting%20to%20Azure%20SQL%20DB%20and%2For%20Azure%20Managed%20Instance%20%22Connection%20is%20not%20available%2C%20request%20timed%20out%20after%20..%22.%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-TEASER%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2237486%22%20slang%3D%22en-US%22%3ERe%3A%20Lesson%20Learned%20%23168%3A%20Connection%20is%20not%20available%20error%20message%20using%20Hikari%20connection%20pooling%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2237486%22%20slang%3D%22en-US%22%3E%3CP%3Eaaaa%3C%2FP%3E%3C%2FLINGO-BODY%3E
Version history
Last update:
‎Mar 26 2021 03:59 AM
Updated by: