我正在使用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
我的代码有什么问题吗?无论如何要解决这个错误?
谢谢
答案 0 :(得分:3)
最有可能的原因是MySQL的默认隔离级别是REPEATABLE READ。
这意味着在结束(提交,回滚)“自己的”事务之前,您看不到其他事务所做的更改(请记住:SELECT已经启动了事务)
由于池中的连接永远不会关闭,因此这些事务可能不会结束。尝试在运行select之前发出提交或回滚。
对于永久性解决方案,您可以通过配置连接池(大多数允许此更改)来更改默认隔离,通过调用连接上的setTransactionIsolation()
或更改MySQL中的默认级别来更改事务级别。
答案 1 :(得分:0)
也许原因是您已关闭:
autocommit(autocommit=0)
如果使用默认设置,则:
autocommit=1, transaction isolation level = REPEATABLE READ
问题将会解决。
答案 2 :(得分:-1)
这是由于像eclipse这样的大多数想法所做的兑现。因此,您需要停止并清除所有兑现,然后尝试运行代码。