Настройка имени пользователя/пароля с помощью mybatis и c3p0

StackOverflow https://stackoverflow.com/questions/5821264

  •  26-10-2019
  •  | 
  •  

Вопрос

У меня есть 2 отдельных соединения данных, которые мне нужно обрабатывать во время жизненного цикла приложения J2EE. Один обладает всеми его свойствами, известными перед рукой, и я настраиваю Mybatis как так

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top