当前位置: 代码迷 >> java >> 服务器重发后,Java Servlet跳过了一个数据库读取
  详细解决方案

服务器重发后,Java Servlet跳过了一个数据库读取

热度:100   发布时间:2023-07-25 19:56:58.0

因此,我才刚刚开始学习Java EE,并且我制作了一个简单的servlet,该访问者用数据库统计访问者。 最好的选择是每次访客打开站点时都添加条目,并简单地读取最后一个条目的自动增量字段(主键),这样我还可以保存访问的日期和时间等。 但是由于我正在学习,所以我选择做一些愚蠢的事情来进行实验,并且我有这个数据库:

id = 1,访问次数= 21。

对于每个访客servlet,将visits变量更新为新的数字。 只要我不重新启动服务器,它就可以工作。 当我执行servlet时,跳过读取,仅开始计数形式,将值变量访问设置为(数据库本身不会重置)。
问题是我有旧笔记本电脑,所以我不想在本地服务器上进行测试,需要花费数小时,相反,我使用openshift tomcat7,而且我不知道如何检查错误日志。

它只是一个简单的httpServlet,这是我的get方法中的逻辑:

String sqlRead = "SELECT *my_cell* FROM *my_table* WHERE id = 1";
String sqlUpdate = "UPDATE *my_table* SET *my_cell*=? WHERE id = 1";
int visits = 0;


try {
    Class.forName("com.mysql.jdbc.Driver");
    ResultSet qResult = DriverManager.getConnection
            ("jdbc:mysql://IPI.P.IPI.P:PORT/dbname", "user", "pass")
            .createStatement().executeQuery(sqlRead);

        //i know this reader starts at index-1
        qResult.next();
        this.visits = qResult.getInt("visits");
} catch (Exception e) {
    System.out.print(e);
}

visits++;

try {
    Class.forName("com.mysql.jdbc.Driver");
    Connection writeConnection = DriverManager.getConnection
            ("jdbc:mysql://IPI.P.IPI.P:PORT/dbname", "user", "pass");

        PreparedStatement preparedStmt = writeConnection.prepareStatement(sqlUpdate);
        preparedStmt.setInt(1, this.visits);
        preparedStmt.executeUpdate();

    writeConnection.close();
} catch (Exception ex) {System.out.println(ex);
}
String visitsString = ""+visits;
response.setContentType("application/json");
response.getWriter().write(visitsString);

好的,所以我得到了一个有效的版本,并把它弄断了,以便可以在新的类中进行数据库处理。 我没有读完并发性文章,但是到目前为止,我知道servlet是由tomcat处理的,所以我只是同步了函数,希望我做对了。 请更正任何错误。 这是新版本:

private int localVisits = -1;

String sqlRead = "SELECT visits FROM visitsTable WHERE id = 1;";
String sqlUpdate = "UPDATE visitsTable SET visits=visits+1 WHERE id = 1;";
Connection con;

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection
        ("jdbc:mysql://XXX.XXX.XXX.XXX:PPPP/dbName", "user", "pass");
    } catch (Exception e) {}

//calling write new visitor to db function
    writeDBCounter();

//reading from db to send to frontend
    String report = "-2";
    try {
        report = "" + readDBCounter();
    } catch (SQLException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    response.setContentType("application/json");
    response.getWriter().write(report);
//closing connection
try {
    con.close();
} catch (SQLException e) {
    e.printStackTrace();
}

}

// read
private synchronized int readDBCounter() throws SQLException {
    int newVisits = -1;
    ResultSet rs = null;
    try {
        java.sql.Statement s =con.createStatement();
        s.executeQuery(sqlRead);
         rs = s.getResultSet();
        rs.next();
        newVisits = rs.getInt("visits");


    } catch (Exception ex) {
        System.out.print(ex);
    }
    rs.close();
    return newVisits;
}

// write
private synchronized void writeDBCounter() {
    try {
        PreparedStatement preparedStmt = con.prepareStatement(sqlUpdate);
        preparedStmt.executeUpdate();
    } catch (Exception ex) {
    }
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
}
  相关解决方案