Java 返回错误数据的SQL
出于某种原因,我的SQL连接似乎返回了一个完全无效的响应。不知何故,在一次调用和下一次调用之间(经过一段短时间,大约一秒钟),它返回一个完全不同的值。我应该注意到,其他行的设置方式与没有此问题的完全相同 我应该注意,我正在使用ApacheDBCP2作为SQL数据源,getConnection()正在调用该数据源。我应该注意到,其他一切都很好,但不是因为某些原因 希望我包含了足够的信息。我不是要求你为我做这项工作,我只是不知道这里会有什么问题Java 返回错误数据的SQL,java,sql,mariadb,Java,Sql,Mariadb,出于某种原因,我的SQL连接似乎返回了一个完全无效的响应。不知何故,在一次调用和下一次调用之间(经过一段短时间,大约一秒钟),它返回一个完全不同的值。我应该注意到,其他行的设置方式与没有此问题的完全相同 我应该注意,我正在使用ApacheDBCP2作为SQL数据源,getConnection()正在调用该数据源。我应该注意到,其他一切都很好,但不是因为某些原因 希望我包含了足够的信息。我不是要求你为我做这项工作,我只是不知道这里会有什么问题 //First call //Note Global.
//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建立的。该行是长度为20的有符号BIGINT
检索
下面的代码是按调用的先后顺序排列的:
第一个电话:
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;
}
公共对象getObject(字符串数据库、字符串sql、字符串标记、对象…参数)抛出SQLException{
连接conn=getConnection(数据库);
连接设置自动提交(错误);
PreparedStatement stmt=conn.prepareStatement(sql);
断言参数!=null&¶meters.length>0;
对于(int i=0;ipublic 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;
}
public boolean setTTL(long userID,long TTL)抛出SQLException{
返回executeUpdate(“adbname”,“UPDATE atablename SET TTL=?其中ID=?;”,TTL,userID);
}
//实际工作
公共布尔executeUpdate(字符串数据库、字符串sql、对象…参数)引发SQLException{
连接conn=getConnection(数据库);
连接设置自动提交(错误);
PreparedStatement stmt=conn.prepareStatement(sql);
对于(int i=0;i0;
conn.commit();
如果(stmt!=null)
stmt.close();
如果(conn!=null)
康涅狄格州关闭();
返回结果;
}
我不想承认这一点,但@trunable Wombat是对的。它最终(不完全)成为了那种“哦,我忘了告诉你”的情景之一
问题在于检索用户ID的方式存在设计缺陷,因为无法保证用户ID是唯一的(就我而言,这是一个相当严重的缺陷)。它正在从另一个用户那里提取数据。
非常感谢所有的帮助,虽然它没有直接解决问题,但您让我了解了SQL和存储方面的一些错误。我一定记住这一次,再次感谢 线索:4294967295=2^32-1 闻起来你有一些产品的32位版本,甚至可能是操作系统 或者在需要
BIGINT
时使用INT UNSIGNED
。您说“该行是长度为20的有符号BIGINT”--请提供SHOW CREATE TABLE
以及要保留什么
objecto=rs.getObject(tag)代码>不被限制为32位?在getObject
和executeUpdate
中,您应该将开头和结尾包装到try with=resource
中,以便在发生异常时保证关闭。另外,您在哪里使用任何事务
?在SQL语句之前和之后分别运行“BEGIN;”和“COMMIT;”来更改关闭似乎没有意义。如果我使用了错误的交易,你有一个合适的mariadb指南吗?从我设法找到的,应该做我所期望的。看,我给了你这个链接,说明如何使用事务。除非您修改问题以显示您所做的工作,否则将很难提供帮助。很难从您的代码中理解出哪里出了问题,但是,1)您为什么要处理对象而不是长对象
?2) Start.getSQLConnection()
在做什么?如果在executeUpdate
中,您通过connection conn=getConnection(数据库)获取连接,为什么必须这样做代码>3)正在引发哪些异常?4) 最后,我想这个问题将是我忘了告诉你关于。。。这就是问题所在-试着做一个非常简单的例子很高兴听到你修复了它这是一个64位的产品和操作系统,问题是它只是检索了一个无效的行。不过谢谢你的主意,我会记住的!