В настоящее время у меня есть следующий основной источник данных в Spring:
<bean id="dbcpDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost/test?relaxAutoCommit=true" />
...
</bean>
Теперь мне нужно предоставить пользовательский источник данных, основанный на серверной среде (не в конфигурации), для которого мне нужно вычислить поля driverClassName
и url
на основе некоторого условия.
Я попытался переопределить createDataSource()
метод:
public class MyDataSource extends BasicDataSource {
@Override
protected synchronized DataSource createDataSource() throws SQLException {
if(condition) {
super.setDriverClassName("com.mysql.jdbc.Driver");
super.setUrl("jdbc:mysql://localhost/test?relaxAutoCommit=true");
} else {
//...
}
return super.createDataSource();
}
}
Что работает, но я заметил, что createDataSource()
вызывается каждый раз, когда выполняется запрос (?), Поэтому я бы предпочел перенести тестирование условий в другое место.
Я попытался переопределить setDriverClassName()
и setUrl()
, который также работает и вызывается только один раз из того, что я могу сказать, но затем мне нужно предоставить некоторые значения в конфигурации Spring, чтобы вызвать эти установщики, поскольку они не вызываются в противном случае:
<bean id="dbcpDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="whatever" />
<property name="url" value="whatever" />
...
</bean>
, что может показаться странным.
Есть ли лучшие решения?