【发布时间】:2011-05-28 11:34:57
【问题描述】:
目前我在 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>
这可能看起来令人困惑。
有没有更好的解决方案?
【问题讨论】:
-
你看过
BasicDataSource的实现吗? -
我认为你应该从那里开始调查,你不觉得吗? :)
标签: java hibernate spring jdbc