質問

J2EEアプリケーションのライフサイクル中に処理する必要がある2つの個別のデータ接続があります。 1つは前に知られているすべてのプロパティを持っています、そして私はMyBatisをそうするように構成します

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

これは素晴らしい。 Pooleddsは、C3P0構成データソースを指します。 2番目の接続は、ユーザーがアプリケーションにログインするときに決定されるユーザー名/パスワードコンボで作成されます。そのデータソースに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のContext.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を取得すると、ユーザー名とパスワードをプロパティオブジェクトとして渡そうとします。 C3P0のTomcatのログメッセージを見ると、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 DataSourceのユーザープロパティを設定し、今ではいつものように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>

それで、ここで私は、私が実証したように動的に設定するためにユーザープロパティを除外しました。それは、C3P0と統合されたMyBatisです。これは、SQLSessionFactoryオブジェクトを深く掘り下げなければならないMyBatisの弱点を示していると思います。しかし、再び、フレームワークを選択した場合、私は非現実的に魔法を期待しています。そして、Mybatisでは、私は魔法を手に入れません。それ以外の場合、持続性を処理するために作成できる他の選択肢があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top