Database 数据库连接的良好实践

Database 数据库连接的良好实践,database,delphi,Database,Delphi,我正在创建Delphi应用程序以连接我的数据库 在某些情况下,我的应用程序需要在一秒钟内写入多个条目,而在另一些情况下,它必须在几分钟内停止工作 所以,总是打开和关闭连接,或者保持打开几个小时是没有意义的 所以我考虑创建一个计时器(interval=1000),然后 将在每个刻度上将一个整数从10减少到0。当int为 0连接将被关闭 与db交互的每个方法都将运行另一个 将int设置为10,并检查连接是否打开,如果未打开,将打开连接 这在数据库处理中是一种良好的做法,还是有其他建议 DB具有不同

我正在创建Delphi应用程序以连接我的数据库

在某些情况下,我的应用程序需要在一秒钟内写入多个条目,而在另一些情况下,它必须在几分钟内停止工作

所以,总是打开和关闭连接,或者保持打开几个小时是没有意义的

所以我考虑创建一个计时器(interval=1000),然后 将在每个刻度上将一个整数从10减少到0。当int为 0连接将被关闭

与db交互的每个方法都将运行另一个 将int设置为10,并检查连接是否打开,如果未打开,将打开连接

这在数据库处理中是一种良好的做法,还是有其他建议

  • DB具有不同的“惠特”连接。例如,与Oracle OCI相比,MySQL API允许快速打开连接。所以,使用MySQL,您可以打开连接,做任何您需要的事情,关闭连接。打开/关闭时间将是不可见的
  • DB具有不同的连接超时。例如,当MySQL连接处于非活动状态的时间超过
    wait\u timeout
    /
    interactive\u timeout
    时,MySQL服务器将自动关闭连接。Oracle将在您需要时保持您的连接处于打开状态。因此,应用程序必须能够处理这个问题
  • 问题在于资源。如果将有10K个客户端,所有客户端都保持连接opeb,那么这可能会导致服务器因空闲但已分配的资源而过载
  • 问题在于应用程序的复杂性。如果它必须保持许多数据集处于活动状态、维护活动事务等,那么重新打开连接将非常困难
  • 此外,一些数据访问组件(如)允许在连接被DBMS关闭或其他方式丢失时自动恢复连接()
  • 因此,根据您的DBMS、数据访问组件和应用程序需求,您必须决定要做什么。例如:

    • 有了MySQL,1-2个客户端,简单的插入,多分钟的非活动延迟,我会在需要之前打开连接,在工作完成后关闭连接
    • 对于Oracle、1K客户端等,我将使用您描述的算法
  • DB具有不同的“惠特”连接。例如,与Oracle OCI相比,MySQL API允许快速打开连接。所以,使用MySQL,您可以打开连接,做任何您需要的事情,关闭连接。打开/关闭时间将是不可见的
  • DB具有不同的连接超时。例如,当MySQL连接处于非活动状态的时间超过
    wait\u timeout
    /
    interactive\u timeout
    时,MySQL服务器将自动关闭连接。Oracle将在您需要时保持您的连接处于打开状态。因此,应用程序必须能够处理这个问题
  • 问题在于资源。如果将有10K个客户端,所有客户端都保持连接opeb,那么这可能会导致服务器因空闲但已分配的资源而过载
  • 问题在于应用程序的复杂性。如果它必须保持许多数据集处于活动状态、维护活动事务等,那么重新打开连接将非常困难
  • 此外,一些数据访问组件(如)允许在连接被DBMS关闭或其他方式丢失时自动恢复连接()
  • 因此,根据您的DBMS、数据访问组件和应用程序需求,您必须决定要做什么。例如:

    • 有了MySQL,1-2个客户端,简单的插入,多分钟的非活动延迟,我会在需要之前打开连接,在工作完成后关闭连接
    • 对于Oracle、1K客户端等,我将使用您描述的算法

    在我看来,如果您的应用程序用户活动并不意味着繁重的连接/断开连接操作,那么就没有必要增加更多的复杂性。

    在我看来,如果您的应用程序用户活动不意味着繁重的连接/断开连接操作,则无需增加更多的复杂性。

    请澄清这些注意事项1)您使用什么连接组件?2) 您的目标是企业应用程序吗?谢谢。我使用的是mysql,它是一个简单的应用程序(不是企业级),组件是TMYSQLConnection请澄清这些注意事项1)你使用什么连接组件?2) 您的目标是企业应用程序吗?谢谢。我使用的是mysql,它是一个简单的应用程序(不是企业级),组件是tmysqlconnectionOracle,当有很多连接不总是使用数据库时,可以配置为使用“共享服务器”模式(加上连接池和会话多路复用)。OP建议的方法只会以更糟糕的方式复制现有的方法。从客户端的角度来看,会话保持打开状态(无需重新初始化),而服务器将节省资源。是的,正确,许多事情可以从服务器端进行配置。在不需要的时候仍然关闭连接是一种好的做法。类似于call.Free,当不需要对象时。我同意连接可以在不需要时关闭,但这应该是一个“确定性调用”,比如.Free,而不是一个有时会触发的计时器。还应考虑重新初始化所有DB依赖对象的成本。IMHO在尝试其他解决方案之前,如果有适当的配置以允许持久连接,同时不影响服务器性能/资源使用,则应考虑该配置。可以将Oracle配置为使用“共享服务器”模式(加上连接池和会话多路复用)当有许多连接不总是使用数据库时。OP建议的方法只会以更糟糕的方式复制现有的方法。从客户端的角度来看,会话保持打开状态(无需重新初始化),而服务器将节省资源。是的,正确,许多事情可以从服务器端进行配置。在不需要的时候仍然关闭连接是一种好的做法。类似于call.Free,当对象为