Question

J'ai 2 connexions de données séparées que je dois gérer au cours du cycle de vie d'une application j2ee. On a toutes ses propriétés connues avant la main et je configurer mybatis comme si

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

est grande. PooledDS fait référence à ma source de données configurée c3p0. La deuxième connexion sera créé avec un combo nom d'utilisateur / mot de passe qui est déterminé quand un utilisateur se connecte à l'application. Je voudrais utiliser C3P0 à nouveau pour cette source de données et je tente de configurer mybatis.xml comme

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

Mon entrée de ressource correspondant dans mon context.xml de Tomcat est

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

Vous voyez, je laisse l'utilisateur et mot de passe d'attributs vides parce que je ne les connais pas. Quand je sais que l'utilisateur pour lequel je besoin d'une connexion Je procédez comme suit:

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

Vous voyez, je tente de transmettre le nom d'utilisateur et mot de passe comme objet de propriété quand je reçois mon SqlSessionFactory. Quand je regarde mes messages journaux dans tomcat pour c3p0 Je vois que les propriétés de c3p0 sont vides et apparemment il n'a jamais entendu de mybatis ce que le nom d'utilisateur et mot de passe sont donc il ne peut pas établir une connexion. Je sais que je suis en utilisant le bon environnement « utilisateur », il est juste comment puis-je régler correctement le nom d'utilisateur et mot de passe pour cette connexion? Merci pour votre aide.

Était-ce utile?

La solution

Ok je me suis dit tout ce que je dois faire alors laissez-moi part.

Je trouve cela quelque part de friandise ou d'une autre sur la liste de diffusion google 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); 
    }

Beaucoup trop mon grand regret cependant, je ne peux pas passer mes propriétés que je voulais faire. Les seules propriétés qui apparaissent dans la méthode ci-dessus setProperties sont ceux qui sont définis dans le fichier mybatis.xml, comment décevant.

Ensuite, nous ajustons l'appel à la construction comme suit:

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

Quelle déception! Je dois savoir quel genre de DataSource je me sers. Ce genre de réduit une partie de la vraie viande de mybatis. Quoi qu'il en soit, ici, je sais que le nom d'utilisateur doit être sélectionné donc je définir la propriété utilisateur de cette source de données particulier c3p0 et maintenant je peux ouvrir des sessions avec mybatis comme d'habitude.

Enfin, qu'est-ce que l'apparence de l'environnement « utilisateur » comme? Que diriez-vous cela?

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

Voici donc je l'ai laissé de côté la propriété de l'utilisateur à définir dynamiquement comme je viens de le démontrer. C'est-il, mybatis intégré à c3p0. Je pense que cela démontre une faiblesse de mybatis que vous devez plonger profondément dans l'objet SqlSessionFactory. Mais là encore, si je choisis un cadre Je déraisonnablement attends la magie. Et avec mybatis Je ne reçois pas de la magie. Dans le cas contraire, il y a d'autres choix qui peuvent être faits à la poignée persistence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top