由于某种原因,我的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;
}
答案 0 :(得分:0)
我不想承认这一点,但是@Scary Wombat是正确的。它最终(不完全是)是那些“哦,我忘了告诉你”的场景之一。
问题是由于无法保证用户ID的唯一性而导致的用户ID检索方式中的一个设计缺陷(对我而言是相当严重的缺陷)。它正在从另一个用户提取数据。
非常感谢您提供的所有帮助,虽然它不能直接解决问题,但您可以让我深入了解一些我在SQL和存储方面通常做错的事情。我会确保记住这一点,再次感谢!
答案 1 :(得分:0)
线索:4294967295 = 2 ^ 32-1
闻起来像是某些产品(甚至可能是操作系统)的32位版本。
或者您在需要INT UNSIGNED
时使用BIGINT
。您说“该行是一个签名的BIGINT,长度为20” –请提供SHOW CREATE TABLE
。
怎样使Object o = rs.getObject(tag);
限制为32位?