2009-07-29 5 views
2

私は最近、手動でJDBCを処理するのではなく、Spring Frameworkに切り替えました。しかし、データベースが遅い場合は、getJdbcTemplate().update(...)を呼び出すときに、それが返されないことがあります。jdbcTemplateは長い更新でハングします

少し調べたところ、私はApache DBCPをC3POに変更しましたが、問題はまだ解決しました。ここでは、ログファイルに次のようになります

public class MyDao extends SimpleJdbcDaoSupport { 
    private static Logger logger = Logger.getLogger(MyDao.class); 

    public MyDao(Config config) { 
     super(); 

     ComboPooledDataSource cpds = new ComboPooledDataSource(); 
     try { 
      cpds.setDriverClass("com.mysql.jdbc.Driver"); 
     } catch (PropertyVetoException e) { 
      throw new RuntimeException(e); 
     } 
     cpds.setUser("username"); 
     cpds.setPassword("password"); 
     cpds.setJdbcUrl("jdbc:mysql://localhost/schema" + 
         "?useUnicode=true&characterEncoding=UTF-8"); 
     cpds.setMaxStatements(180); 
     cpds.setPreferredTestQuery("SELECT 1"); 
     cpds.setTestConnectionOnCheckout(true); 

     this.setDataSource(cpds); 
    } 

    public void addToWorkQueue(String item) { 
     long[] ids = Utils.getItemIds(item); 

     try { 
      logger.debug("About to insert to work table"); 
      getJdbcTemplate().update(
        "INSERT IGNORE INTO work " + 
        "SELECT * FROM queue WHERE id_1 = ? AND id_2 = ?", 
        new Object[] { ids[0], ids[1] } 
      ); 
     } finally { 
      logger.debug("Updated work table"); 
     } 
    } 
} 

はここで私が使用しているコードだ

2009-07-29 17:37:13.570 com.mycomp.MyDao About to insert into work table 
2009-07-29 17:37:13.570 com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool Testing PooledConnection [[email protected]] on CHECKOUT. 
2009-07-29 17:37:13.571 com.mchange.v2.c3p0.stmt.GooGooStatementCache checkinAll(): com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats -- total size: 1; checked out: 0; num connections: 1; num keys: 1 
2009-07-29 17:37:13.571 com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool Test of PooledConnection [[email protected]] on CHECKOUT has SUCCEEDED. 
2009-07-29 17:37:13.571 com.mchange.v2.resourcepool.BasicResourcePool trace [email protected] [managed: 3, unused: 2, excluded: 0] (e.g. [email protected]) 
2009-07-29 17:37:13.571 com.mchange.v2.c3p0.stmt.GooGooStatementCache com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache ----> CACHE HIT 
2009-07-29 17:37:13.571 com.mchange.v2.c3p0.stmt.GooGooStatementCache checkoutStatement: com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats -- total size: 1; checked out: 1; num connections: 1; num keys: 1 

コードがハング場所です。私は春のフレームワーク自体から任意のログメッセージが届かない理由を私は知らない

2009-07-29 17:37:13.762 com.mchange.v2.c3p0.stmt.GooGooStatementCache checkinStatement(): com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats -- total size: 1; checked out: 0; num connections: 1; num keys: 1 
2009-07-29 17:37:13.763 com.mchange.v2.c3p0.stmt.GooGooStatementCache checkinAll(): com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats -- total size: 1; checked out: 0; num connections: 1; num keys: 1 
2009-07-29 17:37:13.763 com.mchange.v2.resourcepool.BasicResourcePool trace [email protected] [managed: 3, unused: 2, excluded: 0] (e.g. [email protected]) 
2009-07-29 17:37:13.763 com.mycomp.MyDao Updated work table 

:通常それはちょうど、このようになります。私はメインコードにこれらの行を追加しました:

Logger springLogger = Logger.getLogger("org.springframework"); 
springLogger.setLevel(Level.TRACE); 
springLogger.debug("testing spring logger"); 

テストメッセージが表示されますが、それ以外は表示されません。発散して申し訳ありません。

私はハングする前に減速に気づきました。クエリが正常に実行された最後の時間は、通常の200msではなく、1分半で完了しました。次回は、プロセスを殺す前に25分間稼働させました。

私は自分のデータベース(InnoDB)にいくつか問題があることは知っていますが、これはタイムアウト後のように思えますが、Spring Frameworkは単に "あきらめ"てハングします。

アドバイスをいただければ幸いです。

+0

私はこれがSpringとは関係がないと疑っています。それはかなり薄い層です。トランザクションとは何か関係ありますが...? – skaffman

+0

私は同意します。取引を終了していない可能性がありますか?別のクエリがテーブルをロックすることは可能ですか? InnoDBを使用している場合は、 "show innodb status" –

答えて

2

結局、根本的なDBの問題を修正することで問題は回避されました。

私はInnoDBテーブルを作業キューとして使用していました。これは、たくさんのアイテムを追加して削除したことを意味していました。ある時点でテーブルに行が多すぎることはありませんでしたが、明らかにInnoDBはこの種の作業を処理できません。また、DBAの友人が「テーブルから行を削除してもパフォーマンスが向上しません。

テーブルの作成と削除を頻繁に行う大変クレイジーなdb戦略に切り替えると、パフォーマンスが大幅に向上し、ハングアップがなくなりました。

私が言っていることは、スカフマンのコメントはおそらく正しいと思います。これは春とは関係がありませんでした。

+0

を実行して質問を閉じるか、スプリングタグを削除する必要がありますか? – iwein

関連する問題