以下是我的servlet的doPost方法,理论上它在db中添加数据
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
Date d=(Date) request.getAttribute("data");
DatiAnagrificiImpl dai=new DatiAnagrificiImpl();
dai.addDatiAnagrafici(new DatiAnagraficiBean(request.getParameter("username"),request.getParameter("cap"),request.getParameter("nome")
,request.getParameter("cognome"),request.getParameter("telefono"),d));
}在这里,将在db中插入数据的方法
enter public void addDatiAnagrafici(DatiAnagraficiBean dab) {
// TODO Auto-generated method stub
try {
Statement s=c.createStatement();
s.executeUpdate("insert into Dati_anagrafici values('"+dab.getIdUtente()+"','"+dab.getIdCittà()+"',"
+ "'"+dab.getNome()+"','"+dab.getCognome()+"','"+dab.getTelefono()+"','"+dab.getDataNascita()+"')");
}catch(SQLException e) {
}finally {
al.add(dab);
}
}但是,当我尝试用servlet来做这件事时,我会出现以下错误
错误1205 (HY000):超过锁定等待超时;
有人知道怎么解决吗?如果我用一个普通的java类做同样的事情,那就没问题了。
发布于 2022-05-28 16:18:10
看来您有一项尚未完成的事务。在MySQL中,尝试运行这些代码来查看正在发生的事情:
SHOW ENGINE INNODB STATUS;
SHOW FULL PROCESSLIST;其中一个或两者都应该提供一些线索。
有几个问题在您的代码中很突出。我要指出的第一件事是,Statement从未关闭过(但应该关闭)。您可以在几个地方关闭该语句,但作为最简单的示例,您可以在调用executeUpdate()之后立即关闭它,如下所示:
Statement s = c.createStatement();
s.executeUpdate("...");
s.close();另一个简单的改变是:当捕获异常时,用它做一些事情(而不是“默默地”吞咽异常)。可能会抛出异常,但上面的代码将隐藏该异常。例如,而不是这样:
catch (SQLException e) {
}试试这个:
catch (SQLException e) {
e.printStackTrace();
}最后一个改进是对代码稍加修改以使用“试着用资源” --为您自动关闭资源(在本例中是Statement)提供了很好的方便。可能是这样的:
Connection connection = getConnection();
try (Statement statement = connection.createStatement()) {
statement.executeUpdate("...");
} catch (SQLException e) {
e.printStackTrace();
}编辑:还有一件事。connection可以(而且应该)通过调用commit() (如果出问题时调用rollback() )来提交。下面是最后一个要尝试的编辑,它显示主try块中的try,而在catch块中有一个rollback(),用于在抛出异常时撤消事务:
Connection connection = getConnection();
try (Statement statement = connection.createStatement()) {
statement.executeUpdate("...");
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}https://stackoverflow.com/questions/72416672
复制相似问题