Обновите фабрику управления объектами на лету - PullRequest
1 голос
/ 24 февраля 2012

Мой application-datasource.xmls ниже моей проблемы: я не хочу указывать имя пользователя и пароль в этом файле контекста. Я хочу получить имя пользователя и пароль во время выполнения, когда пользователь входит в систему, но я не могузнаю, как это сделать.

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schem...-beans-2.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schem...ng-aop-2.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

    <tx:annotation-driven />
    <!-- DataSource has been Lazily initialized, set lazy-init to false in production -->

    <bean id="datasource"
    class="com.mchange.v2.c3p0.ComboPooledDataSource" lazy-init="true" destroy-method="close">
    <!-- Tracker created for connection problem: https://sourceforge.net/tracker/?func=detail&aid=3176467&group_id=25357&atid=38369 0-->
    <property name="driverClass" value="com.ibm.as400.access.AS400JDBCDriver" />
    <property name="jdbcUrl" value="${url}" />
    <!--<property name="user" value="${username}" />
    <property name="password" value="${password}" />-->

    <!-- Pool Size Properties follow -->
    <property name="minPoolSize" value="0"/> <!-- Minimum no. of pooled connections -->
    <property name="initialPoolSize" value="1" /> <!-- Initial no. of pooled connections (>minimum)[optional] -->
    <property name="maxPoolSize" value="2"/> <!-- Maximum no. of pooled connections (>minimum) -->
    <property name="acquireIncrement" value="1"/> <!-- Connections to be added every time the need arises -->

    <!-- Connection Establishment Strategy follows -->
    <property name="acquireRetryAttempts" value="5" /> <!-- Retry Attempts on Database connection failure -->
    <property name="acquireRetryDelay" value="1000"/> <!-- Milliseconds between re-tries -->
    <property name="breakAfterAcquireFailure" value="true" /> <!-- Aggressively break DataSource on connection failure -->

    <!-- Prepared Statement pooling -->
    <property name="maxStatements" value="300"/> <!-- Value ~= maxPoolSize * no. of (frequently used)stored procedures -->
    <property name= "maxStatementsPerConnection" value="15" /> <!-- Statement caching per connection for improved performance -->

    <!-- Connection Age related settings -->
    <property name="maxIdleTime" value="300" /> <!-- Seconds for a connection to remain idle before being closed -->
    <property name="unreturnedConnectionTimeout" value="300" /> <!-- Wait for number of seconds for application to release a connection -->

    <property name="idleConnectionTestPeriod" value="30000"/> <!-- Test for idle connections(In milliseconds) -->
    <property name= "autoCommitOnClose" value="true" /> <!-- For ensuring all transactions to commit/rollback on close -->
    <property name="debugUnreturnedConnectionStackTraces" value ="true" />
    <!-- Ignored overrides -->

    <!-- Used for connection testing during startup -->
    <!--property name="testConnectionOnCheckin" value="true" /--> <!-- Test for connection validity asynchronously -->

    <!--property name="initialPoolSize" value="1" /--> <!-- Initial no. of pooled connections (>minimum)[optional] -->
    <!--property name="idleConnectionTestPeriod" value="30000" /> In milliseconds(Overridden) -->
    <!--property name="maxConnectionAge" value="1800" /--> <!-- Life in seconds for any connection(busy/idle) before being deleted -->
    <!--property name="numHelperThreads" value="3" /--> <!-- Perform JDBC operations asynchronously -->

    <bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerE ntityManagerFactoryBean">
    <property name="persistenceUnitName" value="persistence" />
    <property name="persistenceXmlLocation" value="classpathersistence.xml" />
    <property name="dataSource" ref="datasource" />
    <property name="loadTimeWeaver">
    <bean class="org.springframework.instrument.classloading .InstrumentationLoadTimeWeaver" />
    </property>
    <property name="jpaVendorAdapter" ref="vendorAdapter" />
    </bean>

    <bean id="vendorAdapter"
    class="org.springframework.orm.jpa.vendor.Hibernat eJpaVendorAdapter">
    <property name="databasePlatform" value="${dialect}" />
    <property name="showSql" value="${show_sql}" />
    <property name="generateDdl" value="false" />
    </bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionM anager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean class="org.springframework.orm.jpa.support.Persist enceAnnotationBeanPostProcessor" />
<bean class="org.springframework.dao.annotation.Persiste nceExceptionTranslationPostProcessor"/>
</beans>

Некоторые сайты предлагают использовать UserCredintialDataSource, но на самом деле он не работает. Я хочу обновить фабрику управления объектами, чтобы она могла создавать объекты сущностей с использованием нового соединения в моем текущем сценарии, который она дает.ошибка не может открыть соединение при получении данных.Спасибо

1 Ответ

2 голосов
/ 24 февраля 2012

EntityManagerFactory является глобальным, поэтому то, что вы предлагаете, будет работать не очень хорошо.Если вы обновите (то есть создадите заново) EnitytManagerFactory, это повлияет на все приложение, а не только на текущий запрос / поток / пользователя.Если вы действительно хотите иметь разные учетные данные базы данных для каждого пользователя, Hibernate не ваш лучший выбор.По сути, вам нужно было бы создать уникальный EntityManagerFactory для каждого сеанса, который будет генерировать много накладных расходов производительности и дублирования памяти.Вы также не можете использовать пулы соединений, так как вам все равно нужно открывать новое соединение для каждого пользователя.

Мой совет, переосмыслите ваши требования и вашу архитектуру.Если вы не можете отойти от учетных данных пользователя в базе данных и должны использовать Hibernate, то вам придется значительно снизить производительность, память и сложность, поскольку вам нужно открывать и закрывать новые сущности управления объектами для каждого сеанса пользователя.1003 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...