问题描述
因此,我才刚刚开始学习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);
1楼
好的,所以我得到了一个有效的版本,并把它弄断了,以便可以在新的类中进行数据库处理。 我没有读完并发性文章,但是到目前为止,我知道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);
}