我在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 为他提供帮助。
答案 0 :(得分:3)
您使用的是哪种计划?我没有看到代码片段中的紧密连接。顺便说一下,你知道你可以从你的vcap获取你的整个连接字符串(不需要构建它)吗?
答案 1 :(得分:1)
通常,您应该尝试重用您的连接。您应该使用ConnectionPool来共享连接。要调试打开的连接,请保留一个静态计数器,当您获取连接时,该计数器会递增,并在关闭时递减。每当请求连接时,您都可以输出dumpStack。请记住,如果您有多个应用程序实例,则会更快地耗尽连接。