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。请记住,如果您的应用程序有多个实例,您将 运行 更快地失去连接。
我在 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。请记住,如果您的应用程序有多个实例,您将 运行 更快地失去连接。