java - SQL 返回错误数据
问题描述
出于某种原因,我的 SQL 连接似乎返回了完全无效的响应。不知何故,在一次调用和下一次调用之间(经过一段短暂的时间,大约一秒钟),它返回一个完全不同的值。我应该注意,我有其他行以完全相同的方式设置,没有这个问题。
我应该注意,我将 apache dbcp2 用于 SQL 数据源,这是 getConnection() 调用的地方。我应该注意,其他一切都很好,但由于某种原因不是这样。
希望我提供了足够的信息。我不是要你为我做这项工作,我只是不知道这里可能出现什么问题。
//First call
//Note Global.TOKEN_TTL is a constant value of 300000
System.out.println((System.currentTimeMillis() + Global.TOKEN_TTL));
Start.getSQLConnection().setTTL(userID, (System.currentTimeMillis() + Global.TOKEN_TTL));
System.out.println(Start.getSQLConnection().getTTL(userID));
//Second Call
System.out.println(System.currentTimeMillis());
System.out.println(Start.getSQLConnection().getTTL(userID));
Output
----Call one
System call: 1529456964416
DB call: 1529456964416
DB Actual: 1529456964416
----Call two
System call: 1529456665144
DB call: 4294967295
DB Actual: 1529456964416
该数据库是使用 MariaDB 设置的。该行是一个有符号的 BIGINT,长度为 20。
恢复
下面的代码按从前到后调用的顺序排列:
第一次调用:
getLong("adbname", "TTL", "SELECT TTL FROM atablename WHERE ID=?;", userID);
第二次调用:
public long getLong(String database, String tag, String sql, Object... parameters) throws SQLException {
return (long) getObject(database, sql, tag, parameters);
}
第三次调用:
public Object getObject(String database, String sql, String tag, Object... parameters) throws SQLException {
Connection conn = getConnection(database);
conn.setAutoCommit(false);
PreparedStatement stmt = conn.prepareStatement(sql);
assert parameters != null && parameters.length > 0;
for (int i = 0; i < parameters.length; i++) {
stmt.setObject(i + 1, parameters[i]);
}
ResultSet rs = stmt.executeQuery();
if (!rs.next())
return null;
Object o = rs.getObject(tag);
conn.commit();
if (rs != null)
rs.close();
if (stmt != null)
stmt.close();
if (conn != null)
conn.close();
return o;
}
环境
public boolean setTTL(long userID, long TTL) throws SQLException {
return executeUpdate("adbname", "UPDATE atablename SET TTL=? WHERE ID=?;", TTL, userID);
}
//The actual work
public boolean executeUpdate(String database, String sql, Object... parameters) throws SQLException {
Connection conn = getConnection(database);
conn.setAutoCommit(false);
PreparedStatement stmt = conn.prepareStatement(sql);
for (int i = 0; i < parameters.length; i++) {
stmt.setObject(i + 1, parameters[i]);
}
boolean result = stmt.executeUpdate() > 0;
conn.commit();
if (stmt != null)
stmt.close();
if (conn != null)
conn.close();
return result;
}
解决方案
线索:4294967295 = 2^32-1
闻起来就像您拥有某些产品的 32 位版本,甚至可能是操作系统。
或者您INT UNSIGNED
在需要时使用BIGINT
。您说“该行是一个长度为 20 的已签名 BIGINT”——请提供SHOW CREATE TABLE
.
什么是Object o = rs.getObject(tag);
不被限制为 32 位?
推荐阅读
- llvm - LLVM Pass - 替换 GlobalVariable 的问题
- json - 在 React 中递归渲染嵌套数据,我想恢复这个文件 json 的“名称”
- redis - haproxy pod 保持 crashloopbackoff
- arrays - 将数组转换为哈希
- angular - Angular Reactive FormGroup 值更改不会在可观察到的情况下发出更改
- sapui5 - 我如何启动本地服务器(通过 gulp)并在 pom.xml 中在此服务器上运行自动测试
- javascript - curl to GitHub personal_access_token 仅从我的 mac 失败
- powerbi - 计算 Power BI 中过去 n 周的平均值
- javascript - 为什么这个输出未定义?
- java - Hibernate 配置文件:无法读取所需库 persistence.xml 的存档