如果我创建了一个Spring数据源,我还需要在Tomcat context.xml中定义数据源吗?

如果我创建了一个Spring数据源,我还需要在Tomcat context.xml中定义数据源吗?,spring,tomcat,jdbc,datasource,Spring,Tomcat,Jdbc,Datasource,目前,我们有一个应用程序,它是通过在Tomcat context.xml文件中使用数据源配置的。因此,通过检索JNDI名称并获得连接,我们能够成功地获得连接。我想知道我们是否可以使用Spring数据源来代替它,我们是否仍然需要context.xml文件中的信息 “context.xml”示例: <?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name="jdbc/myDat

目前,我们有一个应用程序,它是通过在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>

我想知道我们是否可以更好地定义Spring数据源,而不是使用这种方法,以及我们如何做到这一点?

我假设您的
数据源现在的配置与此类似:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource"/>

如果您将其替换为以下内容:

Context envCtx = (Context) initCtx.lookup(..);
DataSource ds = (DataSource) envCtx.lookup(..);
Connection connection = ds.getConnection();
<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中的
数据源
配置


在第一种情况下,连接池由Tomcat使用自己的实现进行管理和公开。后一种配置(由于可移植性和减少对容器的依赖性,我强烈推荐这种配置)不依赖于Tomcat。相反,Spring实例化了自己的连接池(注意,池实现来自外部库,如DBCP或C3P0)绝对没有Tomcat JNDI参考。

Tomasz Nurkiewicz可能已经回答了这个问题,但我想指出一点关于commons dbcp与Tomcat jdbc连接池的关系:后者比可移植的更通用的commons dbcp有几个优点,其中最重要的一点是:tomcat连接池可能会更快,并且可以防止饥饿。在做出决定之前,这里有更多有用的信息:将数据源定义放入Spring配置文件通常意味着在开发、测试和生产环境之间移动时需要重新编译代码。将定义放在context.xml中意味着相同的二进制文件在任何环境中都可以工作。

那么,如果我们定义这样的bean,我们可以跳过context.xml文件吗?我添加了一些关于如何使用它的示例代码。现在我看到了您的编辑。您可以继续使用
context.xml
文件,但可以像在我的第一个示例中一样利用Spring并通过JNDI查找
dataSource
,或者使用第二个示例并跳过
context.xml
和JNDI。