如何避免数据库挂在oracle中?

时间:2015-10-03 16:55:12

标签: php oracle

我有一个php应用程序连接到一个只有两个表的数据库:usersfolders。当您登录应用程序并按下按钮时,folders表中会插入大量记录。该过程大约需要15分钟才能完成。在这个时候,所有的应用程序都被卡住了。在我的应用程序的标题中,我有类似

的内容
select * from users where id = {$_SESSION['user_id']}

但是在folders表中插入了数万条记录之后,第二条查询才会被执行。在我等待15分钟并完成导入后,我可以访问我想要的任何页面。我该如何解决这个问题?

我最初忘记提及的一件非常重要的事情(我为此道歉)是一个oracle数据库。我之前为MySql测试过它(仅仅是为了好奇)它没有任何问题,但对于oracle它似乎有这个问题。使用OCI8建立连接。

3 个答案:

答案 0 :(得分:3)

15分钟的人口应该在后台任务中发生,然后看看用户是否存在是微不足道的。如果没有向用户显示某种消息。

例如githubs fork功能,你会看到一本书被扫描,直到后台任务完成。

这可以通过使用具有用户ID和已处理列的第三个表来完成。后台任务正在寻找已处理= 0和处理。

用户正在寻找processed = 1继续,如果已处理= 0则显示友好页面。

当procssing在后台完成时,然后更新DB中的标志

答案 1 :(得分:2)

我认为您应该制作单独的longprocess.php文件并使用header()将其重定向到shortprocess.php。现在,用户不必等待,因为longprocess.php将在15分钟后退出,shortprocess.php会立即向用户发送数据。

longprocess.php

<?php 
header('Location: shortprocess.php');
//time taking sql query here
exit;
?>

P.S。因为两个php文件都将使用单独的数据库连接,因此它可能不会影响其他脚本的性能。

答案 2 :(得分:0)

谢谢大家的回答和努力,但错误在于我:事实证明问题不是来自数据库,而是来自PHP的会话。在标题中,在执行查询之前,我使用'session_start()'而不使用session_write_close()。所以,在session_start()调用之后,我开始了15分钟的查询。在那段时间内任何查看另一个页面的尝试都是不可能的,因为session_write_close函数还没有被调用(当脚本结束时会自动调用它),这让我觉得数据库阻塞了脚本,但实际上它是我的PHP代码那是错的。