Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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 使用一些缓存的Mysql配置_Java_Mysql_Jdbc - Fatal编程技术网

Java 使用一些缓存的Mysql配置

Java 使用一些缓存的Mysql配置,java,mysql,jdbc,Java,Mysql,Jdbc,我使用JDBCJavaMySQL驱动程序,但我发现当我运行测试时,我确实会删除表填充数据并从后面直接读取数据,这种情况下速度会有多慢。数据似乎不存在,但我确实延迟了几秒钟-数据存在。我担心不仅测试是这样工作的,生产代码也可能无法读取最后编写的数据 所以我需要在写完后马上阅读。毫不拖延 一些缓存会有帮助吗?谷歌搜索和试用手册仍然找不到答案 以下是我用于插入和检索的一些代码: private Connection conn = null; private Statement stmt0; priva

我使用JDBCJavaMySQL驱动程序,但我发现当我运行测试时,我确实会删除表填充数据并从后面直接读取数据,这种情况下速度会有多慢。数据似乎不存在,但我确实延迟了几秒钟-数据存在。我担心不仅测试是这样工作的,生产代码也可能无法读取最后编写的数据

所以我需要在写完后马上阅读。毫不拖延

一些缓存会有帮助吗?谷歌搜索和试用手册仍然找不到答案

以下是我用于插入和检索的一些代码:

private Connection conn = null;
private Statement stmt0;
private Statement stmt1;

@Inject
public DBConnectorMysql(@Named("JDBC_URL") String url, @Named("JDBC_CRED") String creds) throws SQLException {
    conn = DriverManager.getConnection(url + creds);
    stmt0 = conn.createStatement();
    stmt1 = conn.createStatement();
}

@Override
public ResultSet executeQuery(String query) throws SQLException {
    return stmt0.executeQuery(query);
}

@Override
public int executeUpdate(String query, String... values) throws SQLException {
    PreparedStatement stmt = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
    int i = 0;
    for (String s: values){
        stmt.setString( ++i, s );
    }
    stmt.executeUpdate();

    int newId = -1;
    ResultSet rs = stmt.getGeneratedKeys();
    if (rs.next()) {
        newId = rs.getInt(1);
    }
    rs.close();
    stmt.close();
    return newId;
}
我确实使用JavaSE与


我主动使用了三个没有外键的表。

从代码中可以看出,您使用了来自同一连接的多个语句/准备好的语句对象,这些对象同时打开。这可能会产生意想不到的结果JDBC规范并没有具体说明如何处理这个问题,这取决于每个供应商的实现,我隐约记得MySQL/JDBC连接器的旧版本也有类似的行为

您应该确保在任何时候都只打开其中一个。您可以用一个简单的语句替换所有语句,但正如我看到的,这是不实际的,因为您需要executeQuery中的语句和executeUpdate中的PreparedStatement

否则,您可以将createStatement调用移动到使用它们的方法内部。executeQuery的最佳实践是返回带有结果的ArrayList,并在返回之前关闭ResultSet和stmt0

另一个不那么优雅的解决方案是编写closeQuery方法,在处理完executeQuery中的ResultSet后关闭stmt0


您必须在rs.close之前致电conn.commit,才能使更改生效。

您能分享更多详细信息吗?您使用的是纯Java还是服务器、JavaEE等?此外,您能否给出一些您正在谈论的表行数的指示?刚刚添加到问题中。谢谢