我在Java应用程序中有一个奇怪的行为。
它对远程MySQL数据库发出简单的查询和修改。我发现由executeQuery()
运行的查询工作正常,但通过executeUpdate()
运行的数据库的插入或删除将失败。
排除第一个想到的事情:应用程序连接的用户设置了正确的权限,因为从同一台机器运行相同的INSERT,但在DBeaver中,将产生所需的修改。
一些代码:
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(url, user, pass);
Statement parentIdStatement = connection.createStatement();
String parentQuery = String.format(ProcessDAO.GET_PARENT_ID, parentName);
if (DEBUG_SQL) {
plugin.getLogger().log(Level.INFO, parentQuery);
}
ResultSet result = parentIdStatement.executeQuery(parentQuery);
result.first();
parentId = result.getInt(1);
if (DEBUG_SQL) {
plugin.getLogger().log(Level.INFO, parentId.toString()); // works, expected value
}
Statement createContainerStatement = connection.createStatement();
String containerQuery = String.format(ContainerDAO.CREATE_CONTAINER, parentId, myName);
if (DEBUG_SQL) {
plugin.getLogger().log(Level.INFO, containerQuery); // works when issued through DBeaver
}
createContainerStatement.executeUpdate(containerQuery); // does nothing
ProcessDAO.GET_PARENT_ID = "SELECT id FROM mon_process WHERE proc_name = '%1$s'";
ContainerDAO.CREATE_CONTAINER = "INSERT INTO mon_container (cont_name, proc_id, cont_expiry, cont_size) VALUES ('%2$s', %1$d, CURRENT_TIMESTAMP(), NULL)";
我怀疑这可能与我对Statement
和Connection
的使用有关。
这是一个轻量级的轻量级应用程序,我去了简单,所以没有框架,也没有关于事务或提交的具体信息。
答案 0 :(得分:0)
所以,最后,这段代码很好。它今天奏效了。
回答这个问题:在类似情况下首先查看(SELECT工作但UPDATE / INSERT / DELETE不工作)
如果权限不是问题,那么您尝试修改的表可能存在锁定。在我的情况下,有人打开了一个非公开的交易。
正确的SQL异常日志记录(在我的情况下不是最理想的)将帮助您解决问题。