Datasource-Initialisierung beim start des Servers bis
Haben wir eine Anwendung, wo wir verwendet spring für IOC. Wir haben die dataSource-bean konfiguriert applicationContext.xml und dass ist auf die in anderen bean definations.
Die dataSource-bean-Begriff sieht wie folgt aus:
<bean id="dbDataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:oci:@TESTDB" />
<property name="username" value="TESTUSER" />
<property name="password" value="TESTPWD" />
<property name="initialSize" value="50" />
<property name="maxActive" value="40" />
<property name="maxIdle" value="10" />
<property name="minIdle" value="10" />
<property name="maxWait" value="-1" />
</bean>
<bean id="serviceDAO" class="com.test.impl.ServiceDAOImpl">
<property name="dataSource" ref="dbDataSource" />
</bean>
ServiceDAOImpl sieht wie folgt aus:
public class ServiceDAOImpl implements ServiceDAO {
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public ValueObj readValue(String key) {
String query = "SELECT * FROM SERVICE_LOOKUP WHERE KEY=?";
/**
* Implement the RowMapper callback interface
*/
return (ValueObj) jdbcTemplate.queryForObject(query,
new Object[] { key }, new RowMapper() {
public Object mapRow(ResultSet resultSet, int rowNum)
throws SQLException {
return new ValueObj(resultSet.getString("KEY"),
resultSet.getString("VALUE"));
}
});
}
public ServiceDAOImpl() {
}
}
Nun, auf der server-start-up Injektion geschieht Geldstrafe und, wenn wir die dataSource im serviceDAOImpl die Verbindung geschieht, ist in Ordnung. Aber das erste mal der Datenbank-Aufruf dauert es rund 3 Minuten erhalten Sie die Antwort zurück. Ich denke, das ist, weil der pool-Erstellung erfolgt während der erste Anruf und wir haben den parameter "initialSize" = 50
im applicationConext.xml
.
So, um dies zu vermeiden, müssen wir einen Weg finden, in der der pool angelegt werden können, während der Start der Anwendung selbst und kann direkt verwendet werden.
Bitte vorschlagen. Lassen Sie mich wissen, wenn keine Klärung erforderlich.
Grüße
Saroj
- der Frühling hat eifrig singleton-bean-Erzeugung/Initialisierung standardmäßig so ist der pool erstellt, wenn der Kontext Lesen und konfiguriert. Etwas anderes muss die Ursache der Verzögerung.
- Hi Soulcheck, Vielen vielen Dank für die Antwort. Aber die ich getestet habe, den code mit initialSize parameter Wert 1 und die Zeit reduziert sich auf 6 Sek.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einen work-around für dieses .Sie zwingen könnte jdbcTemplate zu verwenden
DB-Verbindung beim Start. Siehe den link hier für die ausführliche Erklärung .
Den zweiten constructor-arg lazy Init-flag.
Aravind Eine Lösung ist die bevorzugte, aber nur, wenn Sie nicht wollen, um zu definieren, eine extra-Bohnen können Sie den Frühling auf Ihren DAO init-Methode:
und dann definieren
ServiceDAOImpl.init()
fordert einige sql wieSELECT 1 FROM SERVICE_LOOKUP LIMIT 1
oder noch besser einige noop wieSELECT 1
: