Bluemix,Connection几次成功连接后拒绝

时间:2015-05-28 11:50:50

标签: db2 ibm-cloud

我在Bluemix中开发RESTful应用程序。当我启动我的应用程序并将@GET请求发送到JAX-RS服务时,它几乎没有第一次请求,但一段时间后它开始返回错误。看到日志后,我发现了这个错误:

  

com.ibm.db2.jcc.am.io:DB2 SQL错误:SQLCODE = -438,SQLSTATE = 42502,   SQLERRMC =连接被拒绝,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 为他提供帮助。

2 个答案:

答案 0 :(得分:3)

您使用的是哪种计划?我没有看到代码片段中的紧密连接。顺便说一下,你知道你可以从你的vcap获取你的整个连接字符串(不需要构建它)吗?

答案 1 :(得分:1)

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