我目前正在做一个大学项目,我正在创建一个非常简单的电子商务风格的网站。
我使用JDBC驱动程序管理器和连接池来连接到db,而使用Tomcat9.0作为容器。
问题是:当我通过网站修改某些产品(例如,可用的数量)时,网站并不总是反映变化,而我总是可以在MySql工作台中正确地看到数据。
实际上,在相同的查询中,每两次就有一次工作:
诸若此类。
我已经尝试过设置缓存(从查询中设置缓存,使用SQL_NO_CACHE),但是它似乎没有解决问题,而是尝试使用Datasource,但是它会导致其他问题,很可能我没有时间去解决。
这是连接池文件,我认为这可能是个问题,我不太确定:
public class DriverManagerConnectionPool {
private static List<Connection> freeDbConnections;
static {
freeDbConnections = new LinkedList<Connection>();
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.out.println("DB driver not found:"+ e.getMessage());
}
}
private static synchronized Connection createDBConnection() throws SQLException {
Connection newConnection = null;
String ip = "localhost";
String port = "3306";
String db = "storage";
String username = "root";
String password = "1234";
newConnection = DriverManager.getConnection("jdbc:mysql://"+ ip+":"+ port+"/"+db+"?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC", username, password);
newConnection.setAutoCommit(false);
return newConnection;
}
public static synchronized Connection getConnection() throws SQLException {
Connection connection;
if (!freeDbConnections.isEmpty()) {
connection = (Connection) freeDbConnections.get(0);
freeDbConnections.remove(0);
try {
if (connection.isClosed())
connection = getConnection();
} catch (SQLException e) {
connection.close();
connection = getConnection();
}
} else {
connection = createDBConnection();
}
return connection;
}
public static synchronized void releaseConnection(Connection connection) throws SQLException {
if(connection != null) freeDbConnections.add(connection);
}
}
我真的希望你能帮我,我还没有在网上找到任何解决方案!
发布于 2020-07-26 11:26:43
我想是因为自动提交是禁用的。请尝试使用@Transactional或set自动提交到true。您还可以尝试在每个语句之后使用db.commit。
发布于 2020-07-26 11:29:28
根据连接池实现,池中的所有连接似乎都是自动提交的false。
执行查询后,请检查是否已正确提交连接。
因此,在使用相同的连接进行更改后执行查询时,可能会出现这样的情况--它反映了前面和其他连接上所做的这些更改,可能会返回旧值。
https://stackoverflow.com/questions/63104603
复制