2012-02-22 37 views
2

在我的工作环境中,始终存在着“应用服务层中的所有事情”与“在数据库程序中做所有事情”的争论。应用程序有多昂贵 - > DB调用? (即Java JDBC - > Oracle)?

我得到的是让应用程序服务器和数据库通信太频繁是一个相当昂贵的操作。我的问题是 - 它有多昂贵?

假设我们有这个例子 - 我在我的Java应用程序中有一个用户列表,我需要将一个特定的属性绑定到它们中的每一个。假设有20个用户和20个属性要存储。使用参数(employee_id,attribute_value)对Oracle过程进行20次调用而不是进行1次调用,并且一次发送所有employee_id及其匹配的attribute_values,要花多少钱?

编辑:

好吧,也许我没有明确说明我的情况 - 我会“dumbify”有点:)

如何更昂贵的是它使用n调用一个Oracle过程中插入1次,而不是1次调用n次插入的Oracle过程(其中n次插入基本上循环1次插入n次)?在n次调用中而不是1次执行它的原因是,对于新手来说,在Java中编写循环更容易,该循环使用简单数据类型作为输入对象(例如integer,varchar2等)执行n次过程调用,而不是思考一种将数组从Java传递给Oracle的方法。

+5

你是基准测量还是测量它?它可能取决于你的特定系统(例如数据库服务器与应用程序在同一台机器上)! – 2012-02-22 08:50:11

+0

严,没有。我们正在测量我们的HTTP响应持续时间,但除此之外,我认为我们没有任何统计数据。 另外,我们在Tomcat 5.5上运行基于Spring的Java Web应用程序,使用Oracle JDBC驱动程序连接到Oracle 10数据库。不幸的是,除了应用程序和数据库在不同的机器上这一事实外,我不太了解其他技术方面的很多帮助。 – eagerMoose 2012-02-22 09:17:19

回答

3

您需要逐个查看获取数据的成本。依赖于你所遵守的SLA。 在您使用的示例中,如果不是所有用户都同时登录到您的应用程序,并且“属性”对于每个用户具有不同的值,那么在一次提取中就没有意义。 如果上面的某些属性表示静态数据,则将它们缓存在应用程序中并使用缓存的数据是有意义的。

你真的需要做个案的决定。仅仅因为获取数据代价昂贵并不意味着你一次就能完成所有操作。如果你正在使用数据源和连接池(几乎所有apss都使用这些日子)​​,并且如果你使用了准备好的语句,那么在你的过程中使用BULK COLLECT语句,或者如果你是使用BULK COLLECT语句使用休眠(使用最佳读取大小),它不应该是非常昂贵的。 这种关系绝对不是线性的,即不会花费你20次单次电话。