Настройка имени пользователя / пароля с помощью myBatis и c3p0 - PullRequest
2 голосов
/ 28 апреля 2011

У меня есть 2 отдельных подключения для передачи данных, которые мне нужно обрабатывать в течение жизненного цикла приложения j2ee.У каждого есть все его свойства, известные ранее, и я настраиваю 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>

Моя соответствующая запись ресурса в context.xml моего Tomcat:

   <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" /> 

Youвидите, я оставляю атрибуты user и password пустыми, потому что я их не знаю.Когда я знаю пользователя, для которого мне нужно соединение, я пытаюсь сделать следующее:

        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);

Видите ли, я пытаюсь передать имя пользователя и пароль в качестве объекта Property, когда получаю свой SqlSessionFactory.Когда я просматриваю свои сообщения журнала в tomcat для c3p0, я вижу, что свойства c3p0 пусты, и, очевидно, он никогда не слышал от myBatis, что такое имя пользователя и пароль, поэтому он не может установить соединение.Я знаю, что использую правильную «пользовательскую» среду, просто как правильно установить имя пользователя и пароль для этого подключения?Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 29 апреля 2011

Хорошо, я разобрался со всем, что мне нужно сделать, поэтому позвольте мне поделиться.

Я нашел этот кусок где-то в списке рассылки 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. В любом случае, здесь я знаю, какое имя пользователя нужно выбрать, поэтому я установил свойство User этого конкретного источника данных c3p0, и теперь я могу, как обычно, открывать сессии с mybatis.

Наконец, как выглядит пользовательская среда? Как насчет этого?

        <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 я не получаю волшебство. Иначе, есть другие варианты, которые можно сделать, чтобы справиться с упорством.

...