2013-04-03 2 views
3

Я использую весну 3.2 и спящий режим 4.2. У меня есть 2 компонента: datasource (c3p0) и sessionFactory (LocalSessionFactoryBean) с файлом свойств (application.properties).c3p0 и спящий режим пользователя/пароль

Когда я определяю источник данных, используя конфигурацию java с явным именем пользователя и паролем, все работает хорошо. во время запуска c3p0 регистрирует свою конфигурацию. например Свойство «Свойства»:

properties -> {user=******, password=******} 

это точные результаты

но когда я определить один и тот же источник данных в XML (также с пользователем и паролем), а не в Java, приложение ведет себя по-разному.

свойство «Свойства» показывает

properties -> {java.runtime.name=xxx, line.separator=xxx, maven.home=xxx, ...} 

и все переменные окружения, но ничего о пользователе или пароль. и он отказывается подключиться к базе данных:

java.sql.SQLException: ORA-01017: invalid username/password; logon denied 

но когда в application.properties я добавить:

hibernate.connection.username=xxx 
hibernate.connection.password=xxx 

c3p0 снова выводит все свойства среды без пользователя и пароля, но соединение успешно. хорошо, хорошо: объединение может быть перенесено на сессионную фабрику, но учетные данные должны быть в источнике данных

так что происходит? Я хочу иметь datasource с учетными данными и конфигурацией объединения и спящим сеансом с настройкой спящего режима.

в случае, если это имеет значение. Ниже моя конфигурация:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="xxx.model" /> 
     <property name="hibernateProperties"> 
      <util:properties location="classpath:/spring/application.properties" /> 
     </property> 
    </bean> 

XML DS:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/> 
     <property name="user" value="xxx"/> 
     <property name="password" value="xxx"/> 
     <property name="jdbcUrl" value="xxx"/> 
    </bean> 

и Java DS:

@Bean 
public DataSource dataSource() throws PropertyVetoException { 
    ComboPooledDataSource ds = new ComboPooledDataSource(); 
    ds.setDriverClass("oracle.jdbc.driver.OracleDriver"); 
    ds.setUser("xxx"); 
    ds.setPassword("xxx"); 
    ds.setJdbcUrl("xxx"); 
    return ds; 
} 

ответ

3

Так что это очень странно.

Мое предположение - это. Файл DriverManagerDataSource c3p0 имеет свойство «свойства» типа java.util.Properties.

Где-то кое-что в вашей вселенной промежуточного программного обеспечения настроено так, чтобы автоматически устанавливать такое свойство в System.properties. Это кажется мне плохим, но похоже, что это происходит. Лучше всего было бы отключить это поведение. Это не вещь c3p0, но кроме этого, я не уверен, где вы должны смотреть.

Было бы предложено установить свойство свойства [yuk] явно в вашем XML. Возможно, это предотвратит его отказ от свойств системы. См. here как установить свойство типа Properties. Свойство свойств должно содержать ключ с именем «пользователь» и ключ с именем «пароль» (и нет необходимости устанавливать пользователя и пароль вне этих свойств). Что-то вроде:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/> 
    <property name="jdbcUrl" value="xxx"/> 
    <property name ="properties"> 
     <props> 
      <prop key="user">xxx</prop> 
      <prop key="paswords">xxx</prop> 
     </props> 
    </property> 
</bean> 

Удачи вам!

+0

yep, и удивительно, используя это подход заставляет свойство свойств снова выглядеть нормально – piotrek

0

Я столкнулся с такой странной проблемой, как этот на прошлой неделе, ища в Интернете. Я нашел этот вопрос и ответ от @Steve Waldman https://stackoverflow.com/a/15787141/2033885, что помогло мне решить эту проблему. Я знаю, что этот вопрос старый, но я надеюсь, что мой ответ может помочь другим.

Ниже я описать проблему:

При определении «источник данных» боб с помощью C3P0 com.mchange.v2.c3p0.ComboPooledDataSource в вашем ApplicationContext, свойств «пользователя» & «пароль» являются seted явно или получение значения из файла свойств, в моем случае «persistence.properties». Следующая моя Источник данных боб в контексте применения:

<context:property-placeholder location="classpath*:config/persistence.properties" /> 

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <!-- access --> 
     <property name="driverClass" value="${driverClass}" /> 
     <property name="jdbcUrl" value="${jdbcUrl}" /> 
     <property name="user" value="${user}" /> 
     <property name="password" value="${password}" /> 
</bean> 

Моя ошибка была использовать свойство с именем «пользователь», когда я запускаю мое приложение в Windows, ее все просто отлично, но .. в Linux, уже есть Системное свойство с именем «пользователь», которое переопределяет мое «пользовательское» свойство в persistence.properties. Исправления в моем случае было изменить имя свойства для «пользователя» на «jdbc.user», как в persistence.properties и прикладной контексте:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <!-- access --> 
     <property name="driverClass" value="${driverClass}" /> 
     <property name="jdbcUrl" value="${jdbcUrl}" /> 
     <property name="user" value="${jdbc.user}" /> 
     <property name="password" value="${jdbc.password}" /> 
</bean> 

Я разработка с использованием Windows, но тестирование и производственная средой является Linux. Я думал, что Tomcat - это Tomcat, и не стоит заботиться о базовой ОС, но из-за этой проблемы мой урок узнал следующее: Конечная среда развертывания всегда имеет значение, независимо от того, какой сервер приложений вы используете :)

Смежные вопросы