gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:00:33 25 4
gpt4 key购买 nike

我在 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);

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

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

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

谢谢

最佳答案

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

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

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

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

关于java - MySql JDBC 连接池不实时获取数据库记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10396968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com