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