我尝试连接到Oracle数据库(检查连接状态)。我使用以下代码,效果很好。
public String getDatabaseStatus() {
Connection conn;
try {
conn = DriverManager.getConnection( "jdbc:oracle:thin:@192.168.0.70:1521:XE", "foo","bar");
conn.close();
} catch (Exception e) {
return "ERR - " + e.getMessage();
}
return "Connection succesful";
}
但是,使用Websphere数据源时,10(连接限制)刷新页面后会挂起。代码:
public String getDatabaseStatus() {
Connection conn;
try {
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("jdbc/xe");
conn = WSCallHelper.getNativeConnection(ds.getConnection());
} catch (Exception e) {
return "ERR - " + e.getMessage();
}
return "Connection succesful";
}
我尝试关闭提供的连接,但它给了我错误:
J2CA0206W - 发生连接错误。要帮助确定问题,请启用“连接工厂”或“数据源”上的“诊断连接使用情况”选项。这是多线程访问检测选项。或者,检查数据库或MessageProvider是否可用。
任何帮助将不胜感激。
答案 0 :(得分:2)
您必须关闭从DataSource收到的连接:
public String getDatabaseStatus() {
Connection conn;
try {
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("jdbc/xe");
java.sql.Connection connection = ds.getConnection();
try {
conn = WSCallHelper.getNativeConnection(connection);
} finally {
safeClose(connection);
}
} catch (Exception e) {
return "ERR - " + e.getMessage();
}
return "Connection succesful";
}
private void safeClose(java.sql.Connection connection) {
try {
connection.close();
} catch (SQLException e) {
log.warn("Failed to close database connection", e);
}
}
如果您使用的是Java 7或更高版本,则可以将其简化为:
public String getDatabaseStatus() {
Connection conn;
try {
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("jdbc/xe");
try (java.sql.Connection connection = ds.getConnection()) {
conn = WSCallHelper.getNativeConnection(connection);
}
} catch (Exception e) {
return "ERR - " + e.getMessage();
}
return "Connection succesful";
}
如果您没有这样做,您的连接将不会返回到池中,并且您的连接将用尽。