jndi - 使用 myBatis 和 c3p0 配置用户名/密码

标签 jndi c3p0 mybatis

我需要在 j2ee 应用程序的生命周期中处理 2 个独立的数据连接。其所有属性都是事先已知的,我这样配置 myBatis

    <environment id="development">
        <transactionManager type="JDBC" />
        <dataSource type="JNDI">
            <property name="data_source" value="java:comp/env/jdbc/pooledDS" />
        </dataSource>
    </environment>

这太棒了。 PooledDS 指的是我的 c3p0 配置的数据源。第二个连接将使用用户名/密码组合创建,该组合在用户登录应用程序时确定。我想再次使用 c3p0 作为该数据源,并尝试将 mybatis.xml 配置为

    <environment id="user">
        <transactionManager type="JDBC" />
        <dataSource type="JNDI">
            <property name="data_source" value="java:comp/env/jdbc/pooledDS2" />
        </dataSource>
    </environment>

我的Tomcat的context.xml中对应的资源条目是

   <Resource name="jdbc/pooledDS2" auth="Container" 
         description="DB Connection for Users" 
         driverClass="oracle.jdbc.driver.OracleDriver"
         maxPoolSize="100" minPoolSize="10" acquireIncrement="1" 
         factory="org.apache.naming.factory.BeanFactory"
         maxIdleTime="850"  
         type="com.mchange.v2.c3p0.ComboPooledDataSource" 
         jdbcUrl="jdbc:oracle:thin:@localhost:1521:orcl4" /> 

你看,我将用户和密码属性留空,因为我不知道它们。当我知道需要连接的用户时,我会尝试以下操作:

        Reader reader = Resources.getResourceAsReader(RESOURCE);
        Properties userProps = new Properties();
        userProps.setProperty("user", loginName);
        userProps.setProperty("username", loginName);
        userProps.setProperty("password", password);
        sqlMapperUser = new SqlSessionFactoryBuilder().build(reader, "user", userProps);

你看,当我获取 SqlSessionFactory 时,我尝试将用户名和密码作为 Property 对象传递。当我查看 tomcat 中 c3p0 的日志消息时,我发现 c3p0 属性为空,显然它从未从 myBatis 听到用户名和密码是什么,因此无法建立连接。我知道我正在使用正确的“用户”环境,只是如何正确设置此连接的用户名和密码?感谢您的帮助。

最佳答案

好吧,我已经弄清楚了需要做的一切,所以让我分享一下。

我在 mybatis google 邮件列表的某个地方发现了这个花絮:

import java.beans.PropertyVetoException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.ibatis.datasource.DataSourceFactory;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0DataSourceFactory implements DataSourceFactory { 

    private ComboPooledDataSource dataSource = null; 

    public C3P0DataSourceFactory () { 
    } 

    public void setProperties(Properties properties) { 
        this.dataSource = new ComboPooledDataSource(); 
        this.dataSource.setPassword(properties.getProperty("password"));
        this.dataSource.setJdbcUrl(properties.getProperty("url"));
        try {
            this.dataSource.setDriverClass(properties.getProperty("driver"));
        } catch (PropertyVetoException e) {
        }
    } 

    public DataSource getDataSource() { 
        return (this.dataSource); 
    }

不过,我很懊恼,我无法像我试图做的那样传递我自己的属性。上面的 setProperties 方法中出现的唯一属性是 mybatis.xml 文件中定义的属性,多么令人失望。

然后我们调整构建调用如下:

            Reader reader = Resources.getResourceAsReader(RESOURCE);
        Properties userProps = new Properties();
        sqlMapperUser = new SqlSessionFactoryBuilder().build(reader, "user");
        ComboPooledDataSource ds = (ComboPooledDataSource) sqlMapperUser.getConfiguration().getEnvironment().getDataSource();
        ds.setUser(loginName);

多么令人失望啊!我必须知道我正在使用哪种数据源。这样就减少了 MyBatis 的一些真正的功能。无论如何,在这里我知道要选择哪个用户名,因此我设置了该特定 c3p0 数据源的 User 属性,现在我可以像往常一样使用 mybatis 打开 session 。

最后,“用户”环境是什么样的?这个怎么样?

        <environment id="user">
        <transactionManager type="JDBC" />
        <dataSource type="C3P0DataSourceFactory">
            <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
            <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl4" />
            <property name="password" value="snotty" />             
        </dataSource>

    </environment>

所以在这里我省略了要动态设置的用户属性,就像我刚才演示的那样。就是这样,MyBatis 与 c3p0 集成。我认为这表明了 MyBatis 的一个弱点,那就是你必须深入研究 SqlSessionFactory 对象。但话又说回来,如果我选择一个框架,我就会不切实际地期待魔法。对于 MyBatis,我并没有获得魔法。否则,可以采取其他选择来处理持久性。

关于jndi - 使用 myBatis 和 c3p0 配置用户名/密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5821264/

相关文章:

java - 创建使用 myBatis 和 Sybase 数据库的 Java 项目

java - 如何在Spring中使用WebLogic提供的JNDI DataSource?

java - 从 Tomcat 资源访问 oracle,为什么会出现 NamingException?

java - 迁移到 Hibernate 4 后无法连接到数据库

java - 使用c3p0.idle_test_period。

java - Spring Boot的Mybatis ResultHandler无法运行

java - MyBatis - 为 Oracle 编写映射器,同时针对 H2 进行测试

Tomcat - 将数据库连接移出 server.xml

java - 如果JNDI可以序列化到本地JVM,为什么还需要RMI来调用方法呢?

mysql - 如何在带有 hibernate (c3p0)的spring boot中使用连接池?