我应该为每个Apache线程初始化一次数据库游标,还是应该在HTTP客户端可用的每个函数中初始化一个?
当客户端终止连接时(即用户关闭浏览器选项卡)会发生什么?处理请求的服务器端功能在返回之前是否继续正常,或者是否立即终止而没有机会关闭所有事务?
答案 0 :(得分:0)
游标是昂贵的资源。
...一般
只在您需要时打开它们。
完成后立即关闭它们。
每个游标的游标可能会不必要地占用资源。有时您拥有如此多的数据库活动,每个游标的游标可能具有更高的性能。这很少见。如果您认为游标打开关闭会减慢速度,则需要测量每个函数和每个线程之间的差异,以查看实际情况。
服务器不知道浏览器中发生了什么。零。来自浏览器的每个请求都是一个单独的,唯一的,断开连接的事件。
如果浏览器“关闭”,那并不意味着什么。它只意味着服务器不会获得任何进一步的请求。
如果服务器试图下载响应,则套接字崩溃,服务器最终停止尝试。
如果服务器没有处理任何内容,它仍然没有处理任何内容。
答案 1 :(得分:0)
我认为每个线程初始化数据库连接或游标等资源是可以的。一些框架/库正在使用线程局部“全局”变量。请注意数据库最大客户端连接限制。是否保持数据库连接仍然保持打开状态或者为每个请求花费一些时间连接到数据库取决于您的决定。它还取决于数据库服务器每个连接需要多少资源--AFAIK PostgreSQL为连接分配新进程(这非常昂贵),而MySQL使用线程。
这取决于运行您的应用的Web服务器。如果有人关闭了浏览器选项卡,您可能会注意到它可能在您想要向套接字写入HTTP响应时 - 它应该引发写入错误或类似的事情。但我可以想象,当检测到来自客户端的关闭连接时,配置为终止进程/线程的Web服务器。但是仍有一些情况会立即终止Web应用程序 - 例如停电:)或强制(网络)服务器重启。
小提示 - 您应该在处理HTTP请求之前检查并回滚事务,只是在处理上一个请求并且未正确回滚连接时抛出异常。 (或者您可以在处理HTTP请求之后执行此操作。)在处理HTTP请求之前,还要检查数据库连接是否仍处于活动状态(可能是暂时的)。