我有一个每 5 分钟执行一次的 cron 作业。cron 作业从服务中获取消息并存储到数据库中。
在 JSP 页面上,每 1 分钟执行一次 AJAX 请求。它根据时间检查数据库中的新消息。
现在,我的问题是有时这两个进程被交叉,并且由于 AJAX 请求未获取某些消息。
我已将此 cron 作业设为同步,但仍无法正常工作。
我需要的是......当 cron 作业运行时,我需要保留 AJAX HTTP 请求。
请指导。
我有一个每 5 分钟执行一次的 cron 作业。cron 作业从服务中获取消息并存储到数据库中。
在 JSP 页面上,每 1 分钟执行一次 AJAX 请求。它根据时间检查数据库中的新消息。
现在,我的问题是有时这两个进程被交叉,并且由于 AJAX 请求未获取某些消息。
我已将此 cron 作业设为同步,但仍无法正常工作。
我需要的是......当 cron 作业运行时,我需要保留 AJAX HTTP 请求。
请指导。
您希望在数据库中同步读取和写入。您不希望 AJAX 进程在 cron 作业插入该表的同时从消息表中读取。
你的问题似乎是幻读。这可以通过使用数据库事务,特别是定义适当的事务隔离级别来避免。幻读仅在隔离级别 TRANSACTION_SERIALIZABLE 下被阻止。
我相信您的 AJAX 请求会发送到使用 jdbc 在数据库中查找消息的 java 组件。如果您没有特别注意数据库事务,则 JDBC 中的默认事务隔离级别取决于您的数据库。
尝试将您的事务隔离级别设置为 TRANSACTION_SERIALIZABLE。
Connection connection = DriverManager.getConnection(jdbcUrl, user, password);
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
并非所有 jdbc 驱动程序都支持所有级别的事务隔离。
有关更多信息,请参见此处: http ://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html