私は最近、手動で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は単に "あきらめ"てハングします。
アドバイスをいただければ幸いです。
私はこれがSpringとは関係がないと疑っています。それはかなり薄い層です。トランザクションとは何か関係ありますが...? – skaffman
私は同意します。取引を終了していない可能性がありますか?別のクエリがテーブルをロックすることは可能ですか? InnoDBを使用している場合は、 "show innodb status" –