MyBatisおよびC3P0でユーザー名/パスワードを構成します
質問
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では、私は魔法を手に入れません。それ以外の場合、持続性を処理するために作成できる他の選択肢があります。