Frage

Ich wechselte vor kurzem Spring Framework statt JDBC manuell Handhabung und es ist vor allem ein guter Übergang. Ein Programm gestartet seltsame Probleme mit, aber: wenn die Datenbank langsam ist, wenn getJdbcTemplate().update( ... ) nennt es manchmal nie wieder

.

Nach ein wenig Recherche, wechselte ich von Apache DBCP auf C3PO , aber das Problem nach wie vor kam zurück.

Hier ist der Code verwende ich:

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");
        }
    }
}

Hier ist, wie es in der Protokolldatei aussieht:

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 [com.mchange.v2.c3p0.impl.NewPooledConnection@170984c] 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 [com.mchange.v2.c3p0.impl.NewPooledConnection@170984c] on CHECKOUT has SUCCEEDED.
2009-07-29 17:37:13.571 com.mchange.v2.resourcepool.BasicResourcePool trace com.mchange.v2.resourcepool.BasicResourcePool@d402dd [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@170984c)
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

Dies ist, wo der Code hängt. Normalerweise ist es nur geht auf wie folgt:

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 com.mchange.v2.resourcepool.BasicResourcePool@d402dd [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@170984c)
2009-07-29 17:37:13.763 com.mycomp.MyDao Updated work table

Ich weiß nicht, warum ich keine Lognachricht von Spring Framework selbst zu bekommen. Ich habe diese Zeilen in meinem Haupt-Code:

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

Die Testnachricht zeigt, aber sonst nichts. Es tut uns divergieren.

habe ich eine Verlangsamung vor dem Dreh bemerken. Das letzte Mal, wenn die Abfrage erfolgreich ausgeführt wurde dauerte es eine Minute und eine halbe bis Ende, statt der üblichen 200 ms. Das nächste Mal lasse ich es für 25 Minuten laufen, bevor der Prozess zu töten.

Ich weiß, ich habe einige Probleme mit meiner Datenbank (InnoDB), die auf ich arbeite, aber dies scheint wie nach einem Timeout, Spring Framework nur „aufgibt“ und hängt.

Jede mögliche Beratung verstanden werden.

War es hilfreich?

Lösung

Schließlich wurde das Problem vermieden, indem das zugrunde liegende DB Problem beheben.

Ich war eine InnoDB-Tabelle als Arbeitswarteschlange verwenden, was bedeutete, dass ich hinzugefügt und entfernt eine ganze Menge von Gegenständen zu. Der Tisch hatte nie zu viele Zeilen zu einem bestimmten Zeitpunkt, aber anscheinend InnoDB kann diese Art von Arbeit nicht umgehen, oder wie mein DBA Freund es ausdrückte, „Löschen von Zeilen aus einer Tabelle tut nichts für die Leistung“.

Nach dem Aufsuchen einer viel verrückter db Strategie wechseln, die beteiligt Erstellen und Löschen von Tabellen die ganze Zeit, war die Leistung sehr verbessert und die hängt ging.

Also ich denke, was ich sagen will ist, skaffman Kommentar wahrscheinlich richtig war. Dies hat nichts mit Frühling zu tun hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top