论坛首页 Java企业应用论坛

struts2+spring3,spring3有没有办法动态改到datasourse中的user及password

浏览 14285 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (3) :: 隐藏帖 (6)
作者 正文
   发表时间:2011-07-03  
jdbc.properties

#数据库连接
jdbc.connection.driverclass=oracle.jdbc.driver.OracleDriver
jdbc.connection.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
jdbc.connection.username=test    
jdbc.connection.password=test

#c3p0连接池
acquireIncrement=3
initialPoolSize=3
maxPoolSize=15
minPoolSize=5
maxStatements=15
maxStatementsPerConnection=5



bean.xml

    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        lazy-init="false">
        <property name="locations">
            <list>
                <value>classpath*:jdbc.properties</value>
            </list>
        </property>
    </bean>       
    <!-- 配置c3p0数据源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${jdbc.connection.driverclass}" />
        <property name="jdbcUrl" value="${jdbc.connection.url}" />
        <property name="user" value="${jdbc.connection.username}" />
        <property name="password" value="${jdbc.connection.password}" />

        <property name="acquireIncrement" value="${acquireIncrement}" />
        <property name="initialPoolSize" value="${initialPoolSize}" />
        <property name="maxPoolSize" value="${maxPoolSize}" />
        <property name="minPoolSize" value="${minPoolSize}" />
        <property name="maxStatements" value="${maxStatements}" />
        <property name="maxStatementsPerConnection" value="${maxStatementsPerConnection}" />
    </bean>

    <!-- jdbc模板 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
        <constructor-arg>
            <ref bean="dataSource" />
        </constructor-arg>
    </bean>



问题是:有没有办法根据用户不同动态改变连接数据库的用户名和密码,
如用户1进来后用户名和密码如下:
jdbc.connection.username=test
jdbc.connection.password=test
用户2进来后用户名和密码如下:
jdbc.connection.username=test2
jdbc.connection.password=test2

用户2进来后用户名和密码如下:
jdbc.connection.username=test3
jdbc.connection.password=test3

因为我不想手功来改
jdbc.connection.username=
jdbc.connection.password=
之是想库里读出来后自动把取出的值赋给username和password ,有没有好的办法能实现类似的功能

   发表时间:2011-07-03  
为什么要改用户名?这不就是一个多数据源的问题么?
0 请登录后投票
   发表时间:2011-07-03  
不是,因为,我想tomcat下只部署这一个项目,然后登录用户连的数据库存到另外一表里,这样,不管多少个用户我都可以配置到库中,
按您所说,加数据源,那不是所有用户都连到一个库了吗,没办法区分出来
0 请登录后投票
   发表时间:2011-07-03  
补充一下,我是想tomcat下只部署这一个项目,然后不同用户进来连不同的数据源,事前我已经把那些用户操作那个ORACLE用户下的所有表都已配置到一个表里了

有人说是重新注入datasource,全我不知道如何还重新注入,另外即使是重新注入了,那我原来代码中的return super.jdbcTemplate.queryForInt(sql,new Object[]{});这样的代码还可以用吗??
0 请登录后投票
   发表时间:2011-07-04  
那位知道能给指导下?
0 请登录后投票
   发表时间:2011-07-04  
谈不上指导,能提点看法。
1、如果想动态配置数据源的话,使用Spring托管的话会有问题。因为在程序启动的时候,spring的容器中就已经初始化了所有数据源,这个是没有办法做到动态效果的。(至少我想不出托管给Spring之后怎么样动态生成数据源)
2、如果非要做到这个效果,只能在Spring初始化的时候配置多个数据源,JDCBTemplate只能手动去拿,每次拿之前。根据登录用户的信息去选择数据源。这样达到动态选择数据源的效果。
3、如果不托管给Spring,单纯用JDBC去连的话,应该是可以做到动态去连接库的问题。

但是这2种情况,在事务和获取数据源方面都要自己手动去写,可能会比较麻烦点~
以上浅见,轻拍
0 请登录后投票
   发表时间:2011-07-04  
之前我试了下SESSION这种方法,但SESSION在我的IFRAME下就成NULL了,获取不到,不知道获取到后又有什么问题?
0 请登录后投票
   发表时间:2011-07-04  
15210494746 写道
谈不上指导,能提点看法。
1、如果想动态配置数据源的话,使用Spring托管的话会有问题。因为在程序启动的时候,spring的容器中就已经初始化了所有数据源,这个是没有办法做到动态效果的。(至少我想不出托管给Spring之后怎么样动态生成数据源)
2、如果非要做到这个效果,只能在Spring初始化的时候配置多个数据源,JDCBTemplate只能手动去拿,每次拿之前。根据登录用户的信息去选择数据源。这样达到动态选择数据源的效果。
3、如果不托管给Spring,单纯用JDBC去连的话,应该是可以做到动态去连接库的问题。

但是这2种情况,在事务和获取数据源方面都要自己手动去写,可能会比较麻烦点~
以上浅见,轻拍



2、如果非要做到这个效果,只能在Spring初始化的时候配置多个数据源,JDCBTemplate只能手动去拿,每次拿之前。根据登录用户的信息去选择数据源。这样达到动态选择数据源的效果。
这个怎么拿法,有没有好的见意,因为我的程序都写完了,现在客户要求这样,尽可能少量改代码就能实现.....
0 请登录后投票
   发表时间:2011-07-04  
继承下com.mchange.v2.c3p0.ComboPooledDataSource,覆盖setUser, setPassword,自己从数据库读取不行吗?
0 请登录后投票
   发表时间:2011-07-04  
cheng888qi 写道
继承下com.mchange.v2.c3p0.ComboPooledDataSource,覆盖setUser, setPassword,自己从数据库读取不行吗?

 

 

 

 

属性文件可以自己动态创建吧?

下面代码应该可以实现你说的这种

 

 

	private ComboPooledDataSource buildDataSource(Properties property)
			throws PropertyVetoException {
		ComboPooledDataSource ds = new ComboPooledDataSource();
		   //加载DataSource驱动
	      ds.setDriverClass(property.getProperty(DRIVER_CLASS));
	      //设置连接数据库的url
	      ds.setJdbcUrl(property.getProperty(JDBC_URL));
	      //设置数据库用户名
	      ds.setUser(property.getProperty(USER));
	      //设置数据库密码
	      
	      ds.setPassword(property.getProperty(PASSWORD));
	      //设置池的最大连接数
	      
	      ds.setMaxPoolSize(Integer.parseInt(property.getProperty(MAX_POOL_SIZE)));
	      //设置池的最小连接数
	      ds.setMinPoolSize(Integer.parseInt(property.getProperty(MIN_POOL_SIZE)));
	      ds.setMaxStatements(Integer.parseInt(property.getProperty(MAX_STATEMENTS)));
	      ds.setMaxIdleTime(Integer.parseInt(property.getProperty(MAX_IDLETIME)));
	      ds.setInitialPoolSize(Integer.parseInt(property.getProperty(INITIAL_POOLSIZE)));
	      ds.setCheckoutTimeout(Integer.parseInt(property.getProperty(CHECKOUT_TIMEOUT)));
	      ds.setIdleConnectionTestPeriod(Integer.parseInt(property.getProperty(IDLECONNECTIONTESTPERIOD)));
		return ds;
	}

 

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics