1

My application-datasource.xmls is below my problem is I don't want to provide the user name and password in this context file I want to get the username and password at the runtime when user logs in but I don't know how to do this.

    <?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>

Some sites suggests to use the UserCredintialDataSource but it not works actually I want to refresh the entitymanagerfactory so it can makes the entity objects using the new connection in my current scenario it gives the error cannot open the connection while fetching the data. Thanks

1 Answers1

3

The EntityManagerFactory is global so what you are proposing will not work very well. If you refresh (ie, recreate) the EnitytManagerFactory, that will affect the entire application, not just the current request/thread/user. If you want truly to have have different database credentials for each user, Hibernate is not your best choice. You would essentially have to create a unique EntityManagerFactory for each session which would generate a lot of performance overhead and memory duplication. You can't use connection pools either, since you need to open a new connection for each user anyway.

My advice, re-think your requirements and your architecture. If you can't get away from user-credentials in the database and you must use Hibernate, then you will have to take a significant hit in performance, memory and complexity as you need to open and close new entitymanagerfactories for each user session.

pap
  • 25,288
  • 6
  • 37
  • 46