Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回错误数据的SQL_Java_Sql_Mariadb - Fatal编程技术网

Java 返回错误数据的SQL

Java 返回错误数据的SQL,java,sql,mariadb,Java,Sql,Mariadb,出于某种原因,我的SQL连接似乎返回了一个完全无效的响应。不知何故,在一次调用和下一次调用之间(经过一段短时间,大约一秒钟),它返回一个完全不同的值。我应该注意到,其他行的设置方式与没有此问题的完全相同 我应该注意,我正在使用ApacheDBCP2作为SQL数据源,getConnection()正在调用该数据源。我应该注意到,其他一切都很好,但不是因为某些原因 希望我包含了足够的信息。我不是要求你为我做这项工作,我只是不知道这里会有什么问题 //First call //Note Global.

出于某种原因,我的SQL连接似乎返回了一个完全无效的响应。不知何故,在一次调用和下一次调用之间(经过一段短时间,大约一秒钟),它返回一个完全不同的值。我应该注意到,其他行的设置方式与没有此问题的完全相同

我应该注意,我正在使用ApacheDBCP2作为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建立的。该行是长度为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;i 设置

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;
}
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位的产品和操作系统,问题是它只是检索了一个无效的行。不过谢谢你的主意,我会记住的!