在我的工作场所总是有“在应用程序服务层中做所有事情”与“在数据库过程中做所有事情”这一论点。
我得到的是使应用程序服务器和数据库通信过于频繁是一项相当昂贵的操作。我的问题是 - 它有多贵?
假设我们有这个例子 - 我的Java应用程序中有一个用户列表,我需要将某个属性绑定到每个用户。假设有20个用户,要存储20个属性。使用参数(employee_id,attribute_value)对Oracle过程进行20次调用而不是进行1次调用,并立即发送所有employee_ids及其匹配的attribute_values,会花费多少钱?
编辑:
好吧,也许我没有说清楚我的情况 - 我会“愚蠢”一点:)
对n进行1次插入的Oracle过程进行n次调用,而不是对进行n次插入的Oracle过程进行1次调用(其中n次插入基本上是循环1次插入n次),要贵多少?在n次调用中而不是在1次调用中执行此操作的原因在于,对于新手而言,在Java中编写循环,使用简单数据类型作为输入对象(即整数,varchar2等)执行n过程调用肯定比思考更容易将数组从Java传递到Oracle的方法。
答案 0 :(得分:3)
您需要逐案查看获取数据的成本。取决于您所遵循的SLA。 在您所采用的示例中,如果不是所有用户同时登录到您的应用程序并且“属性”对于每个用户具有不同的值,则无需一次性获取所有用户。 但是,如果上面的某些属性表示静态数据,则将它们缓存在应用程序中并使用缓存数据是有意义的。
你真的需要逐个案例决定。仅仅因为获取数据代价高昂并不意味着你可以一次性获取所有数据。
至于它有多贵,如果你使用的是数据源和连接池(现在几乎所有的apss都使用),并且如果你使用预准备语句,请在你的程序中使用BULK COLLECT语句,或者如果你正在使用休眠(使用最佳提取大小),它不应该是非常昂贵的。 这种关系绝对不是线性的,即一次通话不会花费你20倍。