3

spring 3.2 と hibernate 4.2 を使用しています。プロパティファイル(application.properties)を持つデータソース(c3p0)とセッションファクトリー(LocalSessionFactoryBean)の2つのBeanがあります。

明示的なユーザー名とパスワードを使用してJava構成を使用してデータソースを定義すると、すべてうまくいきます。起動時に c3p0 はその構成をログに記録します。たとえば、「プロパティ」プロパティは次のとおりです。

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

それが正確な出力です

しかし、同じデータソースを Java ではなく xml (ユーザーとパスワードも含む) で定義すると、アプリケーションの動作が異なります。

「プロパティ」プロパティが表示されます

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 は、ユーザーとパスワードなしですべての環境プロパティを再び出力しますが、接続は成功します。まあ、わかりました:プーリングはセッションファクトリにプッシュできますが、資格情報はデータソースにある必要があります

どうしたの?資格情報とプーリング構成を備えたデータソースと、休止状態構成を備えた休止状態セッション ファクトリが必要です。

それが重要な場合。以下は私の構成です:

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

2 に答える 2

0

先週、このような奇妙な問題に直面し、インターネットで検索したところ、@Steve Waldman https://stackoverflow.com/a/15787141/2033885からこの質問と回答が見つかり、この問題の解決に役立ちました。この質問が古いことは知っていますが、私の答えが他の人に役立つことを願っています。

以下に問題を説明します。

ApplicationContext で C3P0 com.mchange.v2.c3p0.ComboPooledDataSource を使用して「データソース」Bean を定義すると、プロパティ「ユーザー」と「パスワード」が明示的に設定されるか、プロパティ ファイルから値が取得されます。私の場合は「persistence.properties」です。 . 次に、アプリケーション コンテキストのデータ ソース Bean:

<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 とアプリケーション コンテキストの両方で、「user」のプロパティ名を「jdbc.user」に変更することでした。

<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 であり、基礎となる OS についてあまり気にする必要はないと思いましたが、この問題により、私の教訓は次のとおりです。

于 2014-12-08T20:15:22.737 に答える