1

我正在将 JDBC 连接池与 mysql 一起使用。这是我的代码

    private static DataSource   _ds;

    /**
    * create the data source if it doesn't exist
    */
private DataSource getDataSource() throws FileNotFoundException,
        IOException, URISyntaxException
{
    if (_ds != null)
        return _ds;


    PoolProperties p = new PoolProperties();
    p.setUrl(url);
    p.setDriverClassName(driver);
    p.setUsername(username);
    p.setTestOnBorrow(true);
    if (password != null)
    {
        p.setPassword(password);
    }
    p.setValidationQuery(validationQuery);
    p.setJdbcInterceptors(JDBC_INTERCEPTOR);
    DataSource datasource = new DataSource();
    datasource.setPoolProperties(p);
    _ds = datasource;
    return datasource;
}

/**
 * gets a connection from the JDBC pool
 * 
 * @throws SQLException
 * @throws IOException
 * @throws FileNotFoundException
 * @throws URISyntaxException 
 */
public Connection getConnection() throws SQLException,
        FileNotFoundException, IOException, URISyntaxException
{
    Connection con = getDataSource().getConnection();
    con.setAutoCommit(false);
    return con;
}

每当我想使用连接时,我都会这样做:

con = getInstance().getConnection();
stmt = con.createStatement();
resultSet = stmt.executeQuery(selectQuery);

问题是查询的结果不是实时的。也就是说,如果我更改数据库中的某些内容并提交,java 中的查询不会得到更改。如果从另一个应用程序更改数据库,也会发生同样的情况

注意:更改会在一段时间后进行,或者如果我重新启动 tomcat

我的代码有什么问题吗?无论如何要修复这个错误?

谢谢

4

3 回答 3

3

这很可能是由 MySQL 的默认隔离级别 REPEATABLE READ 引起的。

这意味着在您结束(提交、回滚)“自己的”事务之前,您不会看到其他事务所做的更改(请记住:SELECT 已经启动了事务)

由于池中的连接永远不会关闭,因此这些事务可能不会结束。在运行选择之前尝试发出提交或回滚。

对于永久解决方案,您可以通过配置连接池(大多数都允许这样做)来更改默认隔离,通过调用setTransactionIsolation()连接或更改 MySQL 中的默认级别来更改事务级别。

于 2012-05-01T12:59:08.760 回答
0

可能原因是你关闭了:

autocommit(autocommit=0)

如果您使用默认设置,则:

 autocommit=1, transaction isolation level = REPEATABLE READ

问题将得到解决。

于 2018-10-25T04:58:12.707 回答
-1

这是由于大多数 ide (如 eclipse )完成的兑现。因此,您需要停止并清除所有兑现,然后尝试运行代码。

于 2012-05-01T11:54:13.580 回答