2017-04-25 11 views
2

私はSpring、Java、Hibernate、Postgresql環境で作業しています。私は私のデータベースでかなり深刻な遅さを見ています。私の具体的な質問は、データベースにヒットしないメソッドを含むクラスにSpringの@Transactionalアノテーションを追加するとどういう悪いことでしょうか?つまり、トランザクションを必要としません。これらのメソッドが、より頻繁に使用されるメソッドの一部であるとします。不必要なデータベーストランザクションは、遅さを引き起こしますか?

したがって、このような何か(単なる例):

@Component 
@Transactional 
public class ProjectManager { 

    public String getProjectUrl(Project project) { 
     //simple logic that does not use the database 
     return "/my/url/" + project.getId(); 
    } 

} 

私は、データベースの遅さを引き起こす可能性が多くの要因があります理解しています。私はこれが巨大な赤旗かそれほど大きな取引ではないかと疑問に思いますか?これらのメソッドを抜き出して、@Transactionalというマークの付いていない別のクラスに配置する必要がありますか?

TIA

+0

このメソッドのベンチマークは '@ Transactional'アノテーションがある場合とない場合がありますか? –

+1

* "Springの' @ Transactional'アノテーションを追加するとどうなりますか?*あなたがそこに問題があると言うコードをプロファイルしない限り、ほとんどありません。 – Andreas

+0

私はそれが何らかの助けになるかどうか100%確信していませんが、[ここ](http://blog.jhades.org/how-does-spring-transactional-really-work/)の説明を見つけることができます。あなたが '@ Transactional'を使うときに何が起こっているのでしょうか? – saljuama

答えて

4

まず第一に、あなたのgetProjectUrl方法は春の側面、それに傍受されます。必要な

  • があなたのメソッドを呼び出します
  • がトランザクション
  • を完了した場合

    1. は、トランザクションを作成します。

      これは、spring docs。また、Springは、メソッドコードがDBをまったく使用しないことを理解するのに十分なほどスマートではありません(as we see see in source)。

      したがって、Springの@Transactionalがある程度のオーバーヘッドを引き起こすと確信できます

      しかし、どのようなオーバーヘッドですか?いずれにしても

      • Javaは - アスペクト・コードは、我々は、物理的(DB)トランザクションを作成するように強制することができる@Transactionalpropagation値に応じて、とにかく
      • 実装します。これにより、ネットワーク+接続+ db-sideオーバーヘッドが発生します。他の側から

      、あなたが@Transactionalを削除した場合、あなたはPostgresが暗黙のトランザクションdocs)内の任意の非トランザクションSQLクエリをラップしていることも知っておく必要があります。

      PostgreSQLは実際として、すべてのSQL文を扱いますトランザクション内で実行されます。 BEGINコマンドを発行しないと、個々のステートメントに暗黙のBEGINと(成功した場合)COMMITがラップされます。

      最後に、答え:@Transactionalは、DBを処理しない場合は使用しないでください。

    関連する問題