Bluemix,在几次成功连接后连接被拒绝

Bluemix, Connection refused after few succeeded connections

我在 Bluemix 中开发了一个 RESTful 应用程序。当我启动我的应用程序并将@GET 请求发送到 JAX-RS 服务时,它在第一次请求时工作正常,但过了一会儿它开始返回错误。看到日志后,我发现了这个错误:

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;

什么会导致这种行为?谢谢。

更新 问题是我从其他方法打开连接但没有关闭它们。感谢 Jeeva T 对他的帮助。

您使用的是哪个套餐?我没有在代码片段中看到紧密联系。顺便说一句,您知道您可以从您的 vcap 中获取整个连接字符串(无需构造它)吗?

一般来说,您应该尝试重用您的连接。您应该使用 ConnectionPool 来共享连接。要调试打开的连接,请保留一个静态计数器,当您获取连接时该计数器递增,并在您关闭时递减。每当请求连接时,您都可以输出一个 dumpStack。请记住,如果您的应用程序有多个实例,您将 运行 更快地失去连接。