Java 所有内容的存储过程

Java 所有内容的存储过程,java,.net,stored-procedures,Java,.net,Stored Procedures,我与一位同事就.NET应用程序(在SQLServer2005数据库上)中存储过程(SP)的使用进行了热烈的讨论。[他有微软背景,我有Java语言-这可能相关,也可能无关] 我必须在UI中插入捕获的数据。为此,我将编写一个SP并在.NET代码中使用它?这不是必需的,但使用SP的优缺点是什么 另一种情况: 我正在维护一个城市列表。用户可以使用UI添加城市。如您所料,用户无法输入重复的城市。如果发生重复条目,将显示错误。这可以通过多种方式实现: 在我的代码中,运行select查询以检查它是否已经存在,

我与一位同事就
.NET
应用程序(在SQLServer2005数据库上)中存储过程(SP)的使用进行了热烈的讨论。[他有微软背景,我有Java语言-这可能相关,也可能无关]

我必须在UI中插入捕获的数据。为此,我将编写一个SP并在
.NET
代码中使用它?这不是必需的,但使用SP的优缺点是什么

另一种情况:

我正在维护一个城市列表。用户可以使用UI添加城市。如您所料,用户无法输入重复的城市。如果发生重复条目,将显示错误。这可以通过多种方式实现:

  • 在我的代码中,运行select查询以检查它是否已经存在,如果不存在,则在UI上插入城市,否则将出现错误
  • 直接插入,由于索引唯一,将捕获
    SQLException
    。内省SQLException以检查违反了什么唯一索引,并显示相应的错误
  • 创建一个SP并在其中处理上述逻辑,即检查重复和抛出错误或插入

  • 哪条路对?(欢迎链接到好的资源)。

    如果您打算编写一个sp来执行所有检查和插入(如果可以),那么为什么不返回修改的行数?如果它大于零,则表示您的方法成功。我会避免出现异常,其想法是不能插入并不是真正的异常,只是不受欢迎。调整存储过程的insert方法可以读取输出参数,并告诉调用者它是否插入了任何内容。

    如果您打算编写一个sp来执行所有检查和插入操作(如果它能够),那么为什么不返回修改的行数?如果它大于零,则表示您的方法成功。我会避免出现异常,其想法是不能插入并不是真正的异常,只是不受欢迎。调整存储过程的insert方法可以读取输出参数,并告诉调用者它是否插入了任何内容。

    首先,最好使用SPs,而不是临时SQL语句,因为: 1) 安全性-只需授予执行存储过程的权限,而不需要对基础表授予权限 2) 可维护性—可以在SQL Server中修补SP,而无需重新生成/部署.NET代码来调整查询 3) 性能—使用存储过程时执行计划缓存/重用可提高性能(如果在.NET中使用参数化SQL direct,也可以这样做) 4) 网络流量(可以忽略不计,但SPs可以帮助您在网络上传递整个SQL语句,特别是在大型查询时)

    异常代价很高,所以在可以防止的情况下尽量避免抛出异常。 我建议在尝试插入记录之前编写一个执行IF EXISTS检查的存储过程,并且仅在记录不存在时插入。只需返回一个返回码或输出参数,指示发生了什么。e、 g.0=插入正常,-1=已存在


    在一个存储过程调用中执行所有操作,以保存数据库往返(即,不要先查询数据库进行检查,然后再发送另一条语句进行插入)。使用EXISTS检查是最理想的检查方式。

    首先,最好使用SPs,而不是临时SQL语句,因为: 1) 安全性-只需授予执行存储过程的权限,而不需要对基础表授予权限 2) 可维护性—可以在SQL Server中修补SP,而无需重新生成/部署.NET代码来调整查询 3) 性能—使用存储过程时执行计划缓存/重用可提高性能(如果在.NET中使用参数化SQL direct,也可以这样做) 4) 网络流量(可以忽略不计,但SPs可以帮助您在网络上传递整个SQL语句,特别是在大型查询时)

    异常代价很高,所以在可以防止的情况下尽量避免抛出异常。 我建议在尝试插入记录之前编写一个执行IF EXISTS检查的存储过程,并且仅在记录不存在时插入。只需返回一个返回码或输出参数,指示发生了什么。e、 g.0=插入正常,-1=已存在


    在一个存储过程调用中执行所有操作,以保存数据库往返(即,不要先查询数据库进行检查,然后再发送另一条语句进行插入)。使用EXISTS检查是最理想的检查方式。

    一般来说,如果应用程序是给定数据库架构的唯一用户,那么我建议使用直接SQL(即无SP)。如果数据库在应用程序之间共享,那么控制应用程序和共享数据之间的接口就变得更加重要,定义此接口的最简单方法是通过存储过程控制对数据的访问

    SPs的使用增加了系统的复杂性,除非有充分的理由,否则不应增加复杂性。它还可能严重妨碍应用程序使用良好的ORM工具


    但与所有经验法则一样,总会有例外。

    作为一般经验法则,如果应用程序是给定数据库架构的唯一用户,那么我建议使用直接SQL(即无SP)。如果数据库在应用程序之间共享,那么控制应用程序和共享数据之间的接口就变得更加重要,定义此接口的最简单方法是通过存储过程控制对数据的访问

    SPs的使用增加了系统的复杂性,除非有充分的理由,否则不应增加复杂性。它还可能严重妨碍应用程序使用良好的ORM工具


    但正如所有经验法则一样,总会有例外。

    我喜欢将数据层和业务逻辑层分离的想法。因此,我不会将任何业务逻辑放在数据库中,而是放在域中的代码中

    如果您使用的是某种ORM,比如NHibernate,那么数据库的角色将自动执行