Настройка имени пользователя/пароля с помощью mybatis и c3p0
Вопрос
У меня есть 2 отдельных соединения данных, которые мне нужно обрабатывать во время жизненного цикла приложения J2EE. Один обладает всеми его свойствами, известными перед рукой, и я настраиваю Mybatis как так
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="JNDI">
<property name="data_source" value="java:comp/env/jdbc/pooledDS" />
</dataSource>
</environment>
Это круто. Booledds относится к моему источнику данных C3P0. Второе соединение будет создано с помощью комбинации имени пользователя/пароля, которая определяется, когда пользователь входит в приложение. Я хотел бы снова использовать 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.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. Когда я смотрю на свои сообщения журнала в Tomcat для C3P0, я вижу, что свойства 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, и теперь я могу открыть сеансы с 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>
Итак, здесь я оставил свойство пользователя динамически, как я только что продемонстрировал. Вот и все, Mybatis интегрирован с C3P0. Я думаю, что это демонстрирует слабость Mybatis, которую вы должны углубиться в объект SQLSessionFactory. Но опять же, если я выберу структуру, я нереально ожидаю магии. И с Mybatis я не получаю магию. В противном случае, есть и другие варианты, которые можно сделать, чтобы справиться с настойчивостью.