Frage

Ich habe 2 separate Datenverbindungen, die ich während des Lebenszyklus einer J2EE -Anwendung verarbeiten muss. Man hat alle Eigenschaften, die zuvor bekannt sind, und ich konfiguriere MyBatis als so

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

Das ist toll. Pooledds bezieht sich auf meine C3P0 -konfigurierte Datenquelle. Die zweite Verbindung wird mit einer Benutzernamen-/Passwort -Kombination erstellt, die festgelegt wird, wenn sich ein Benutzer bei der Anwendung anmeldet. Ich möchte C3P0 erneut für diese Datenquelle verwenden und versuche, mybatis.xml als zu konfigurieren

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

Mein entsprechender Ressourceneintrag im Kontext meines Tomcats ist 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" /> 

Sie sehen, ich lasse den Benutzer- und Kennwortattributen leer, weil ich sie nicht kenne. Wenn ich den Benutzer kenne, für den ich eine Verbindung brauche, versuche ich Folgendes:

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

Sie sehen, ich versuche, den Benutzernamen und das Passwort als Eigenschaftsobjekt weiterzugeben, wenn ich meine SQLSessionFactory erhalte. Wenn ich meine Protokollnachrichten in Tomcat für C3P0 betrachte, sehe ich, dass die C3P0 -Eigenschaften leer sind und anscheinend nie von MyBatis gehört, was der Benutzername und das Passwort sind, so dass es keine Verbindung herstellen kann. Ich weiß, dass ich die richtige "Benutzer" -Enumgebung verwende. Wie kann ich den Benutzernamen und das Passwort für diese Verbindung richtig einstellen? Danke für Ihre Hilfe.

War es hilfreich?

Lösung

Ok, ich habe alles herausgefunden, was ich tun muss, um mich zu teilen.

Ich habe diesen Leckerbissen irgendwo in der MyBatis Google Mailingliste gefunden:

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

Zu meinem Leidwesen kann ich meine eigenen Eigenschaften nicht wie ich versuchten. Die einzigen Eigenschaften, die in der obigen SetProperties -Methode erscheinen, sind diejenigen, die in der Datei mybatis.xml definiert sind, wie enttäuschend.

Anschließend passen wir den Anruf an, um wie folgt zu bauen:

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

Wie enttäuschend! Ich muss wissen, welche Art von DataSource ich benutze. Diese Art von dem echten Fleisch von Mybatis reduziert. Wie auch immer, hier weiß ich, welcher Benutzername ausgewählt werden soll, damit ich die Benutzereigenschaft dieser bestimmten C3P0 -Datenquelle festlegt, und jetzt kann ich wie gewohnt Sitzungen mit MyBatis eröffnen.

Wie sieht die Umgebung "Benutzer" aus? Wie wäre es damit?

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

Hier habe ich die Benutzereigenschaft ausgelassen, um dynamisch wie ich nur demonstriert habe. Das ist es, MyBatis integrierte in C3P0. Ich denke, dies zeigt eine Schwäche von MyBatis, die Sie tief in das SQLSessionFactory -Objekt eintauchen müssen. Aber auch wenn ich einen Rahmen wähle, erwarte ich unrealistisch Magie. Und mit MyBatis bekomme ich keine Magie. Andernfalls gibt es andere Möglichkeiten, die für die Beharrlichkeit getroffen werden können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top