我在mysql中使用JDBC连接池。这是我的代码
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);问题是查询的结果不是实时的。也就是说,如果我在DB中更改了一些内容并提交,如果DB是从另一个应用程序更改的,则java中的查询不会发生changes.same
注意:更改是在一段时间后进行的,或者如果我重新启动tomcat
我的代码有什么问题吗?如何修复这个错误?
谢谢
发布于 2012-05-01 20:59:09
这很可能是由MySQL的默认隔离级别造成的,即可重复读取。
这意味着在结束(提交、回滚)自己的事务之前,您看不到其他事务所做的更改(记住: SELECT已经启动了一个事务)。
由于池中的连接永远不会关闭,因此这些事务可能不会结束。尝试在运行select之前执行commit或rollback命令。
对于永久解决方案,您可以通过配置连接池(大多数都允许这样做)来更改默认隔离,通过在连接上调用setTransactionIsolation()或通过更改MySQL中的默认级别来更改事务级别。
发布于 2018-10-25 12:58:13
也许是因为你关闭了:
autocommit(autocommit=0)如果使用默认设置,请执行以下操作:
autocommit=1, transaction isolation level = REPEATABLE READ这个问题就会得到解决。
发布于 2012-05-01 19:54:14
这是由于现金,这是由大多数ide,如eclipse。因此,您需要停止并清除所有的现金,然后尝试运行代码。
https://stackoverflow.com/questions/10396968
复制相似问题