2015-05-28 4 views
1

Я разрабатываю приложение RESTful в Bluemix. Когда я запускаю свое приложение и отправляю запрос @GET в службу JAX-RS, он работает почти в несколько первых запросов, но через некоторое время он начинает возвращать ошибку. После того, как я увидел, журналы, я обнаружил эту ошибку:Bluemix, Connection отказался после нескольких удаленных соединений

com.ibm.db2.jcc.am.io: DB2 SQL Error: SQLCODE=-438, SQLSTATE=42502, SQLERRMC=Connection refused, DRIVER=3.57.82

Это код, который я использую, чтобы получить соединение, и я, конечно, закрыть его после того, как я сделал свою работу.

  Gson gson = new Gson(); 
      JsonObject vcap_services_obj = null; 
      Connection conn = null; 
      String driver = "com.ibm.db2.jcc.DB2Driver"; 
      try { 
       Class.forName(driver); 
      } catch (ClassNotFoundException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      String icap_services_string = System.getenv("VCAP_SERVICES"); 
      if(icap_services_string == null){ 
       icap_services_string = FileProvider.readFile("db.ini"); 
      } 
      if (null != icap_services_string && icap_services_string.length() > 0) { 
       vcap_services_obj = gson.fromJson(icap_services_string, JsonObject.class); 
      } 
      if (null != vcap_services_obj) { 
       JsonArray vcap_services_array = vcap_services_obj.getAsJsonArray("sqldb"); 

       JsonObject first_db2 = vcap_services_array.get(0).getAsJsonObject(); 
       JsonObject first_credential = first_db2.get("credentials").getAsJsonObject();  

       String host = first_credential.get("host").getAsString(); 
       String port = first_credential.get("port").getAsString(); 
       String uid = first_credential.get("username").getAsString(); 
       String pwd = first_credential.get("password").getAsString(); 
       String dbname = first_credential.get("db").getAsString(); 

       String dburl = "jdbc:db2:"+"//" + host + ":" + port + "/" + dbname; 
       try { 
        conn = DriverManager.getConnection(dburl, uid, pwd); 
       } catch (SQLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

      return conn; 

Что может быть причиной такого поведения? Спасибо.

UPDATE Проблема заключалась в том, что я открывал связи с другими методами и не закрывали их. Спасибо Jeeva T за помощь.

ответ

3

Какой план вы используете? Я не вижу тесную связь в фрагменте. Кстати, знаете ли вы, что вы можете получить всю строку соединения из своего vcap (не нужно ее конструировать)?

+0

Я использую бесплатный план. Мой рабочий процесс следующий, получите соединение, используя приведенный выше код. Выполните требуемые SQL-запросы и затем закройте соединение с методом, который запросил это соединение. Что касается строки подключения, да, я видел ее, но я получил этот код из примера и отлично поработал в другом проекте, и я не пытался его оптимизировать. – Anatoly

+0

Знаете ли вы, сколько соединений вы получаете за ошибку? Свободный план ограничен 10 соединениями. Если вы можете непрерывно воспроизводить его после сбоя X раз, возможно, что-то происходит с закрытием. Вы пробовали войти в систему? Стандартные функции открытия/закрытия являются асинхронными. Взгляните на https://www.npmjs.com/package/ibm_db. Вы можете попросить функции синхронизации. –

+0

Это гораздо меньше, чем 10 соединений, это как 2-3 соединения. – Anatoly

1

Как правило, вы должны попытаться повторно использовать свои соединения. Вы должны использовать ConnectionPool для совместного использования соединений. Чтобы отлаживать открытые подключения, держите статический счетчик, который вы увеличиваете, когда вы захватываете соединение, и уменьшаетесь при закрытии. Вы можете вывести dumpStack всякий раз, когда запрашивается соединение. Имейте в виду, что если у вас есть несколько экземпляров вашего приложения, вы будете работать еще быстрее.

Смежные вопросы