- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
目前我在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 配置中以触发这些 setter ,因为它们不会以其他方式调用:
<bean id="dbcpDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="whatever" />
<property name="url" value="whatever" />
...
</bean>
这可能看起来令人困惑。
有没有更好的解决方案?
最佳答案
无需扩展 BasicDataSource
。继承是最强的耦合形式,应避免使用,除非您有真正的理由使用它。
你有两个选择:
创建一个包装器(使用组合而不是继承)
public class MyDataSource implements DataSource {
private BasicDataSource target = new BasicDataSource();
public MyDataSource() {
if (condition) {
target.setDriverClassName("com.mysql.jdbc.Driver");
target.setUrl("jdbc:mysql://localhost/test?relaxAutoCommit=true");
} else { ... }
}
public Connection getConnection() {
return target.getConnection();
}
... etc ...
}
创建一个工厂(因为您只需要自定义对象的创建阶段,您不需要控制它的整个生命周期)。
public class MyDataSourceFactory {
public DataSource createDataSource() {
BasicDataSource target = new BasicDataSource();
if (condition) {
target.setDriverClassName("com.mysql.jdbc.Driver");
target.setUrl("jdbc:mysql://localhost/test?relaxAutoCommit=true");
} else { ... }
return target;
}
}
.
<bean id = "factory" class = "MyDataSourceFactory" />
<bean id = "dbcpDataSource"
factory-bean = "factory" factory-method = "createDataSource">
<property ... />
</bean>
编辑:请注意,您仍然可以将从工厂获取的对象配置为常规 Spring bean。
此外,如果您的条件足够简单,您可以使用 Spring 提供的声明式方法完全避免编写自己的代码,例如 Spring Expression language .
关于java - 如何正确覆盖 Spring 和 Hibernate 的 BasicDataSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4493743/
我正在尝试将 hibernate 与 spring 集成,我问 - 只是想知道这是否可能 - 我可以使用 @Autowired 和 @Componentscan 来注入(inject) BasicDa
这个问题在这里已经有了答案: ClassCastException when casting to the same class (11 个答案) 关闭 7 年前。 我在尝试检索在 Tomcat 全
我已配置数据源并将自动提交设置为 false。
您好,我在我的项目中使用基于 Spring 的 Web 应用程序,我尝试添加依赖项在 dcbp 1.2 的 pom.xml 中,但它仍然显示错误以上错误 请帮我解决这个问题我尝试了以下方法:添加依赖关
我配置我的数据源: 得到错误: Caused by: org.springframework.beans.factory
在尝试创建一个演示 Spring-MVC 应用程序时,我在启动时遇到了一个问题: ConversionNotSupportedException:无法将类型 org.apache.commons.db
我有一个简短的脚本打开数据源然后关闭它。此脚本使用 BasicDataSource。 BasicDataSource bds = new BasicDataSource(); bds.setDrive
我有使用 Spring JPA 和 Hibernate 开发应用程序的经验。我按照中所述设置了我的数据源 http://blog.springsource.org/2011/11/04/using-c
目前我将密码 [未加密] 保存在属性文件中。此密码使用 ant 按原样放置在配置 xml 中。 [配置xml是针对datasource的,就是创建dbcp.BasicDataSource的对象] 现在
org.apache.commons.dbcp BasicDatasource 和 PoolingDataSoure 有什么区别?两者都支持连接池吗?什么时候使用它们? 最佳答案 BasicDataS
在grails 2.1.0中使用服务时,出现以下异常。关于调试的想法? 造成原因: Caused by: java.lang.IllegalStateException: Already value
在我们的开发数据库 Oracle 11g R2 中,我们注意到通过 Java 应用程序使用 BasicDataSource 打开的连接无限期地保持打开状态。理想情况下,我们希望每个应用程序实例最多有
我使用 spring 访问数据库: XML Spring 上下文: ... 代码: System.out.println("There is : " + new ClassPathXmlA
我正在使用 Apache BasicDataSource 来处理我的数据库代码 - 只是创建方法来执行访问数据库的特定任务。下面是一个示例; /** * Update a users display
我想为BasicDataSource ,任何人都可以告诉我如何添加 。 BasicDataSource dataSource = new BasicDataSource(); //NOSON
我们的服务器在工作中出现问题,我正在尝试了解发生了什么。它是一个在 linux 服务器上运行的 Java 应用程序,该应用程序从 TCP 套接字接收信息并对其进行分析,然后在分析后写入数据库。 有时数
Spring DriverManagerDataSource 和 apache BasicDataSource 有什么区别?哪一个更可取,在什么情况下? 谢谢。 最佳答案 根据 Spring docu
我在 JBoss EAP 服务器中部署了一个 Spring 应用程序,使用以下设置: 如何配置连接池的最小和最大大小? BasicDataSource 的任
尝试启动我的 spring MVC hibernate 应用程序时出现此异常。 SEVERE: Exception sending context initialized event to liste
我正在尝试使用 SSL 保护应用程序中的 MySQL 连接。我目前拥有的相关代码: BasicDataSource dataSource = new BasicDataSource();
我是一名优秀的程序员,十分优秀!