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

Mar*_*rco 2 spring tomcat datasource jdbc

目前我们有一个通过在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>
Run Code Online (Sandbox Code Playgroud)

所以在我们的代码中,我们搜索这样的JNDI上下文:

Context envCtx = (Context) initCtx.lookup(..);
DataSource ds = (DataSource) envCtx.lookup(..);
Connection connection = ds.getConnection();
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*icz 6

我假设您dataSource的配置现在与此类似:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource"/>
Run Code Online (Sandbox Code Playgroud)

如果你用这样的东西替换它:

<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>
Run Code Online (Sandbox Code Playgroud)

DataSource不再需要 Tomcat中的配置.

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