Domanda

Ho 2 connessioni dati separati ho bisogno di gestire durante il ciclo di vita di un'applicazione J2EE. Uno ha tutte le sue proprietà conosciuto prima mano e io configurare myBatis come modo

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

Questo è grande. PooledDS si riferisce alla mia fonte di dati c3p0 configurato. Il secondo collegamento verrà creato con una combinazione username / password che è determinato quando un utente accede all'applicazione. Vorrei utilizzare nuovamente c3p0 per tale origine dati e tentare di configurare mybatis.xml come

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

La mia voce corrispondente risorsa nel mio context.xml di 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" /> 

Si vede, lascio l'utente e la password attributi vuota perché io non li conosco. Quando so che l'utente per cui ho bisogno di una connessione provo quanto segue:

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

Si vede, cerco di passare il nome utente e la password come un oggetto immobile quando ottengo il mio SqlSessionFactory. Quando guardo i miei messaggi di log in Tomcat per c3p0 vedo che le proprietà c3p0 sono vuote e apparentemente non si è mai sentito dal myBatis ciò che il nome utente e la password sono quindi non può stabilire una connessione. So che sto usando il corretto ambiente "user", è solo come faccio a impostare correttamente il nome utente e la password per la connessione? Grazie per il vostro aiuto.

È stato utile?

Soluzione

Ok ho capito tutto quello che ho bisogno di fare in modo lasciatemi azione.

Ho trovato questo da qualche bocconcino o un altro sul mybatis google mailing list:

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

Troppo il mio rammarico, però, non posso passare le mie proprietà, come stavo cercando di fare. Le uniche proprietà che appaiono nel metodo setProperties sopra sono quelli che sono definiti nel file mybatis.xml, come deludente.

Poi regolare la chiamata a costruire nel seguente modo:

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

Come deludente! Devo sapere che tipo di DataSource sto usando. Questo genere di riduce alcuni la vera carne di MyBatis. Comunque, ecco lo so che nome utente deve essere selezionato in modo da impostare la proprietà d'uso di quel particolare origine dati c3p0 e ora posso aprire sessioni con mybatis come al solito.

Infine, ciò che fa il "utente" ambiente assomigliare? Che ne dici di questo?

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

Così qui ho lasciato fuori la proprietà utente da impostare in modo dinamico, come ho appena dimostrato. Che è, MyBatis integrato con c3p0. Credo che questo dimostra una debolezza di MyBatis che bisogna scavare in profondità nella oggetto SqlSessionFactory. Ma poi di nuovo, se scelgo un quadro che sto irrealisticamente aspettavo magia. E con MyBatis non ottengo la magia. In caso contrario, ci sono altre scelte che possono essere fatte al manico persistenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top