2016-09-09 5 views
-1

Ich habe ein Problem in meinem Spring MVC JDBC Anruf. Wenn ich den Aufruf nach dem Starten des Servers schnell mache, wird die JDBC-Verbindung in einer Sekunde hergestellt und die Daten werden abgerufen. Wenn die anderen DAOs in schneller Folge miteinander verbunden werden, wird in ähnlicher Weise die Verbindung hergestellt. Aber wenn ich versuche, ein DAO nach einer Lücke von nur wenigen Minuten aufzurufen, dauert die JDBC-Verbindung ewig. Es wird aufJDBC Verbindung dauert zu lange

stecken

„DataSourceUtils: 110 - Fetching JDBC-Verbindung von Datasource“

Ich habe noch nie die Geduld wirklich überprüfen hatte, wie lange es die Verbindung zum Abrufen nimmt aber ich habe gewartet 10 Minuten und es gab keine Anzeichen dafür, dass die Verbindung hergestellt wurde.

Als nächstes versuche ich den Server zumindest neu zu starten. Aber JDBC behindert sogar das Anhalten des Servers !! Die Konsole ist auf dieser Linie fest:

„DisposableBeanAdapter: 327 - Methode aufrufen zerstören‚close‘auf Bohne mit dem Namen‚datasource‘“

Schließlich starte ich Eclipse und es funktioniert gut, bis es wieder eine Zeitlücke.

Diese meine Bohne Definition für die Datenquelle ist:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="url" /> 
    <property name="username" value="abc" /> 
    <property name="password" value="abc" /> 
    <property name="validationQuery" value="SELECT 1" /> 
    <property name="testWhileIdle" value="true" /> 
    <property name="maxActive" value="100" /> 
    <property name="minIdle" value="10" /> 
    <property name="initialSize" value="10" /> 
    <property name="maxIdle" value="20" /> 
    <property name="maxWait" value="1000" /> 
</bean> 

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

<bean id="getDataDao" class="com.project.dao.GetDataDao"> 
    <constructor-arg index="0" ref="jdbcTemplate" /> 
    <constructor-arg index="1" value="STORED_PROC_NAME"></constructor-arg> 
</bean> 

In meiner DAO-Datei, erweitere ich StoredProcedure Klasse Frühling und dies ist der Konstruktor:

public GetDataDao(JdbcTemplate jdbcTemplate, String spName) { 

     super(jdbcTemplate, spName); 

     declareParameter(new SqlParameter("p_input", Types.VARCHAR)); 
     declareParameter(new SqlOutParameter("o_result", Types.VARCHAR)); 

     compile(); 
    } 

In einer anderen Funktion, das ist wie nenne ich die SP:

spOutput = super.execute(spInput); 

wo spOutput und spInput sind HashMaps.

Mache ich etwas falsch in meiner Konfiguration? TIA.

+1

Nicht in Ihrer Konfiguration, vermute ich in Ihrem Code ... Erhalten Sie keine Verbindungen selbst und verwenden Sie federgeführte Transaktionen. Wenn Ihr Pool nicht mehr verfügbar sein wird, werden Ihnen eventuell die verfügbaren Verbindungen ausgehen.In Ihrem Fall nach etwa 100 Anfragen (es sei denn, Sie haben MySQL so konfiguriert, dass diese Verbindungen nicht zugelassen werden). –

+2

Eclipse hat damit nichts zu tun. Ich verstehe nie, warum Leute ihre IDE erwähnen, wenn sie Probleme haben. Spring macht das in meinen Apps jeden Tag richtig. Es ist etwas in deinem Code. – duffymo

+0

Ändern Sie Ihre Frage und senden Sie den Code, wo Sie die Verbindung erhalten und verwenden. – kaliatech

Antwort

-1

Der zusätzliche Code hilft, aber ich sehe nichts darin, das das Problem verursachen würde, das Sie sehen. Der wahrscheinlichste Grund für das Problem, das Sie sehen, ist, dass Verbindungen aus dem Pool entfernt werden, aber sie werden nicht zurückgegeben, und der Pool wird schließlich ausgehungert. Der dbcp-Pool blockiert später das Herunterfahren, da diese Verbindungen noch offen und wahrscheinlich blockiert sind.

Um dies zu überprüfen, könnten Sie versuchen, maxActive und ähnliche Einstellungen auf etwas niedrigeres, vielleicht sogar "1" zu setzen und dann zu überprüfen, ob Sie das gleiche Problem sofort bekommen.

Haben Sie überprüft, dass Ihre gespeicherte Prozedur zurückkehrt? Sie erhalten tatsächlich spOutput für jeden Anruf und die gespeicherte Prozedur selbst hängt nicht konsistent oder zufällig?

Wenn das so ist, ist mein einziger anderer Vorschlag, mehr Code zu posten, vor allem aus dem Call-Stack, der zu GetDataDao führt, und was auch immer die Methode in der DAO enthält, macht den Aufruf sp.execute. Eine Annahme ist, dass Sie keine Transaktionen verwenden, aber wenn Sie dies tun, wäre es auch sehr wichtig, zu zeigen, wo Sie eine Transaktion im Code starten/committen.

+0

'spOutput' gibt Daten korrekt zurück. Es hängt nur, wenn Sie die Verbindung erhalten. Sobald dies eingerichtet ist, wird der SP schnell ausgeführt und die Daten werden zurückgesendet. Ich denke nicht, dass der Rest des Codes relevant ist. Es hat nichts mit der JDBC-Verbindung zu tun. – javaGirl243

+0

Kann ich bitte wissen warum meine Frage abgelehnt wurde? – javaGirl243

+0

@ javaGirl243 - Ich habe Sie nicht abgelehnt, aber ich nehme an, es liegt daran, dass Ihre Frage nicht klar ist und nicht genügend Informationen enthält, damit jemand Ihnen wirklich helfen kann. In ähnlicher Weise wurde meine Antwort wahrscheinlich abgelehnt, weil ich keine prägnante Antwort gegeben habe, und der Downvoter dachte nicht, dass deine Frage beantwortet worden sein sollte. Ich würde vorschlagen, eine neue Frage zu posten, sie aber kurz halten und den fehlenden Code zeigen, den ich in meiner Antwort erwähnt habe. StackOverflow ist nicht immer ein freundlicher Ort für Neuankömmlinge, aber dennoch besteht die Absicht darin, eine bestimmte Qualität von Fragen und Antworten aufrechtzuerhalten. – kaliatech