gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:27:47 25 4
gpt4 key购买 nike

在 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 时,我尝试将用户名和密码作为属性对象传递。当我在 tomcat 中查看 c3p0 的日志消息时,我看到 c3p0 属性是空的,而且显然它从未从 myBatis 那里听到用户名和密码是什么,因此无法建立连接。我知道我使用的是正确的“用户”环境,我该如何正确设置此连接的用户名和密码?谢谢你的帮助。

最佳答案

好的,我想出了我需要做的一切,所以让我分享。

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

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 文件中定义的,多么令人失望。

然后我们调整调用build如下:
            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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com