目前我们有一个通过在Tomcat context.xml文件中使用数据源配置的应用程序。因此,我们可以通过检索JNDI名称并获得连接来成功获得连接。我想知道我们是否可以通过使用Spring数据源替换它,如果我们仍然需要context.xml文件中的信息?
示例'context.xml':
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/myDataSource"
auth="Container"
type="javax.sql.DataSource"
username="john"
password="doe"
driverClassName="<removed>"
url="<removed>"
maxActive="30"
maxIdle="10"
maxWait="1000"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"/>
</Context>
因此,在我们的代码中,我们搜索这样的JNDI上下文:
Context envCtx = (Context) initCtx.lookup(..);
DataSource ds = (DataSource) envCtx.lookup(..);
Connection connection = ds.getConnection();
我想知道我们是否可以更好地定义Spring数据源而不是使用这种方法以及我们如何做到这一点?
答案 0 :(得分:6)
我认为您的dataSource
现在配置与此类似:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource"/>
如果你用这样的东西替换它:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://${jdbc.hostname}/${jdbc.schema}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
Tomcat 中的 DataSource
配置不再需要
在第一种情况下,Tomcat使用自己的实现来管理和公开连接池。后一种配置(我强烈建议由于可移植性和减少对容器的依赖性)不依赖于Tomcat。相反,Spring实例化自己的连接池(请注意,池实现来自外部库,如DBCP或C3P0),并且绝对没有对Tomcat JNDI引用的引用。
答案 1 :(得分:1)
Tomasz Nurkiewicz可能已经回答了这个问题但是我想指出一些关于commons-dbcp与tomcat jdbc连接池的问题:后者与便携式和更通用的commons-dbcp相比有几个优点重要的:tomcat连接池可能会更快,并防止饥饿。以下是在做出决定之前可能有用的更多信息:http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html
答案 2 :(得分:1)
将数据源定义放在Spring配置文件中通常意味着在开发,测试和生产环境之间移动时需要重新编译代码。将定义放在context.xml中意味着相同的二进制文件可以在任何环境中使用。