Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java servlet在服务器重新启动后跳过一次数据库读取_Java_Mysql_Servlets - Fatal编程技术网

Java servlet在服务器重新启动后跳过一次数据库读取

Java servlet在服务器重新启动后跳过一次数据库读取,java,mysql,servlets,Java,Mysql,Servlets,所以我刚开始学习JavaEE,我制作了一个简单的servlet,用数据库统计访问者。最好的选择是在访问者每次打开站点时添加条目,并简单地读取最后一个条目的自动递增字段(主键),这样我还可以保存访问的日期和时间等。 但由于我在学习,我选择做一些愚蠢的事情来做实验,我有一个数据库: id=1,访问次数=21 对于每个访问者,servlet将访问变量更新为新的数字。只要我不重新启动服务器,它就可以工作。当我这样做时,servlet跳过读取,只是开始计算变量访问设置为什么值(数据库本身不会重置)。 问题

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

id=1,访问次数=21

对于每个访问者,servlet将访问变量更新为新的数字。只要我不重新启动服务器,它就可以工作。当我这样做时,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);
}

好的,我得到了一个工作版本,我中断了它,这样数据库处理就可以进入新的类。我并没有读完并发性方面的书,但到目前为止,我知道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);
}

1) ; 2) 不要打开更多的数据库连接,只使用一个-打开一个连接需要花费大量资源;3) 从并发性的角度来看,您的代码是一场灾难:读取和更新应该在事务或
同步的
块中处理;为什么tomcat从不开始,你想从头开始数数吗?泰·乔杰夫,我在跳这些东西!Gopal,我不想从0开始计数,这是一个我想纠正的问题:PI将把读取计数器部分放在一个静态块中。。。然后Jozef说。。。注意并发性问题为什么表名周围有星号;2) 不要打开更多的数据库连接,只使用一个-打开一个连接需要花费大量资源;3) 从并发性的角度来看,您的代码是一场灾难:读取和更新应该在事务或
同步的
块中处理;为什么tomcat从不开始,你想从头开始数数吗?泰·乔杰夫,我在跳这些东西!Gopal,我不想从0开始计数,这是一个我想纠正的问题:PI将把读取计数器部分放在一个静态块中。。。然后Jozef说。。。注意并发性问题为什么表名周围有星号?