【问题标题】:Java connection pooling (JNDI) not work after half a day半天后Java连接池(JNDI)不起作用
【发布时间】:2016-04-30 11:04:02
【问题描述】:

我有一个使用 JNDI 进行连接轮询的网络应用程序(数据库服务器是 MySql),

对 Web 应用程序有很多请求,并且它有一个 Web 服务被另一个 Web 应用程序使用。

它工作正常,但一段时间后不起作用,并且在 Web 服务中的一些未处理的命令之后,出现以下错误:

java.sql.SQLException:无法获得连接,一般错误 javax.naming.NameNotFoundException:名称 [java:/comp/env] 未绑定在此上下文中。找不到 [java:]。

我将应用程序复制到下面。

请注意我强制应用打印“+++++=====>>>> 连接数 X”

何时进行新连接(如果是新连接 X 增加)

并在关闭连接后“-----=====>>>>连接数X”

注意 2:每当调用 web 服务时,都会在输出中打印“%%%%>>>>> web Service request for”字符串,然后会运行“SELECT”命令并在输出中打印,但是当系统崩溃时,收到的对 Web 服务的请求,却没有继续。

所以查找“+++++=====>>>>”和“+++++=====>>>>”并注意“%%%”之间的差异%>>>>> web Service request for”的开头和结尾。

输出如下:

java out put file

public void close() throws SQLException {
    connection.close();
    counter--;
    ServerLog.Print("------=====>>>> number of connection " + counter);
    ServerLog.Print("Database connection is closed ...");
}

以下是一些方法:

public jjDatabaseWeb() throws SQLException, NamingException {
    ctx = new InitialContext();
    Context initCtx = (Context) ctx.lookup("java:/comp/env");
    DataSource ds = (DataSource) initCtx.lookup("jdbc/MyDB");
    connection = ds.getConnection();
    counter++;
    ServerLog.Print("+++++=====>>>> number of connection " + counter);
}

下面是在局域网中调用其他服务的网络服务方法:

/**
 * this Method returns a string result; if(result =="" OR result==null){ do
 * your work }else{ show user result as message (result is HTML ) }
 *
 * @param stdNubmer
 * @param nationalId Is not important
 * @return String result (as HTML )
 * @throws javax.naming.NamingException
 */
@WebMethod(operationName = "studentCheck")
public String studentCheck(@WebParam(name = "stdNubmer") String stdNubmer, @WebParam(name = "nationalId") String nationalId) {

    try {
        ServerLog.Print("%%%%>>>>> web Service request for :" + stdNubmer);
        try {
            jjDatabaseWeb db = new jjDatabaseWeb();
            DefaultTableModel dtm = db.Select(StdInfo.tableName, StdInfo._step + "," + StdInfo._alerts + "," + StdInfo._lastAertDate + "," + StdInfo._name + "," + StdInfo._family, StdInfo._stdNumber + "=" + stdNubmer);
            List<Map<String, Object>> row = jjDatabaseWeb.separateRow(dtm);
            db.close();//
            if (row.size() == 1) {
                if (!row.get(0).get(StdInfo._step).toString().equalsIgnoreCase("5")) {
                    int date = new jjCalendar_IR().getDBFormat_8length();
                    int lastAlertDate = Integer.parseInt(row.get(0).get(StdInfo._lastAertDate).toString());
                    int alerts = Integer.parseInt(row.get(0).get(StdInfo._alerts).toString());
                    if ((date - 5) <= lastAlertDate) {
                        return "";
                    }
                    StringBuilder html = new StringBuilder("");
                    html.append("<HTML>...</HTML>");
                    return html.toString();
                }
            }
            return "";
        } catch (NamingException ex) {
            Logger.getLogger(csaWebService.class.getName()).log(Level.SEVERE, null, ex);
        }
    } catch (SQLException ex) {
        Logger.getLogger(csaWebService.class.getName()).log(Level.SEVERE, null, ex);
        ServerLog.Print(ex);
        Server.ErrorHandler(ex);
        return "";
    }
    return "";
}

}

【问题讨论】:

  • 使用jndi有什么特殊原因吗?
  • 这是一个非常繁忙的系统,所以我认为如果我使用 jndi 来池连接会更好。所以现在我不能改变它。我必须解决这个问题。
  • 过早优化的经典例子。您现在必须调试 JNDI 池。 :( 我想您必须在此处添加一些代码才能获得适当的帮助。
  • 我已经编辑了我的帖子并添加了一些代码。如果有关于mysql配置的任何解决方案,请发布,谢谢。

标签: java mysql web-services jndi connection-pooling


【解决方案1】:

有太多的连接,女巫打开而不关闭。

小心 close() 连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    相关资源
    最近更新 更多