MySql JDBC连接池不实时获取数据库记录

时间:2012-05-01 11:22:42

标签: java mysql jdbc

我正在使用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

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

谢谢

3 个答案:

答案 0 :(得分:3)

最有可能的原因是MySQL的默认隔离级别是REPEATABLE READ。

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

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

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

答案 1 :(得分:0)

也许原因是您已关闭:

autocommit(autocommit=0)

如果使用默认设置,则:

 autocommit=1, transaction isolation level = REPEATABLE READ

问题将会解决。

答案 2 :(得分:-1)

这是由于像eclipse这样的大多数想法所做的兑现。因此,您需要停止并清除所有兑现,然后尝试运行代码。