精华帖 (0) :: 良好帖 (0) :: 新手帖 (3) :: 隐藏帖 (6)
|
|
---|---|
作者 | 正文 |
发表时间:2011-07-03
#数据库连接 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 ,有没有好的办法能实现类似的功能 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-07-03
为什么要改用户名?这不就是一个多数据源的问题么?
|
|
返回顶楼 | |
发表时间:2011-07-03
不是,因为,我想tomcat下只部署这一个项目,然后登录用户连的数据库存到另外一表里,这样,不管多少个用户我都可以配置到库中,
按您所说,加数据源,那不是所有用户都连到一个库了吗,没办法区分出来 |
|
返回顶楼 | |
发表时间:2011-07-03
补充一下,我是想tomcat下只部署这一个项目,然后不同用户进来连不同的数据源,事前我已经把那些用户操作那个ORACLE用户下的所有表都已配置到一个表里了
有人说是重新注入datasource,全我不知道如何还重新注入,另外即使是重新注入了,那我原来代码中的return super.jdbcTemplate.queryForInt(sql,new Object[]{});这样的代码还可以用吗?? |
|
返回顶楼 | |
发表时间:2011-07-04
那位知道能给指导下?
|
|
返回顶楼 | |
发表时间:2011-07-04
谈不上指导,能提点看法。
1、如果想动态配置数据源的话,使用Spring托管的话会有问题。因为在程序启动的时候,spring的容器中就已经初始化了所有数据源,这个是没有办法做到动态效果的。(至少我想不出托管给Spring之后怎么样动态生成数据源) 2、如果非要做到这个效果,只能在Spring初始化的时候配置多个数据源,JDCBTemplate只能手动去拿,每次拿之前。根据登录用户的信息去选择数据源。这样达到动态选择数据源的效果。 3、如果不托管给Spring,单纯用JDBC去连的话,应该是可以做到动态去连接库的问题。 但是这2种情况,在事务和获取数据源方面都要自己手动去写,可能会比较麻烦点~ 以上浅见,轻拍 |
|
返回顶楼 | |
发表时间:2011-07-04
之前我试了下SESSION这种方法,但SESSION在我的IFRAME下就成NULL了,获取不到,不知道获取到后又有什么问题?
|
|
返回顶楼 | |
发表时间:2011-07-04
15210494746 写道 谈不上指导,能提点看法。
1、如果想动态配置数据源的话,使用Spring托管的话会有问题。因为在程序启动的时候,spring的容器中就已经初始化了所有数据源,这个是没有办法做到动态效果的。(至少我想不出托管给Spring之后怎么样动态生成数据源) 2、如果非要做到这个效果,只能在Spring初始化的时候配置多个数据源,JDCBTemplate只能手动去拿,每次拿之前。根据登录用户的信息去选择数据源。这样达到动态选择数据源的效果。 3、如果不托管给Spring,单纯用JDBC去连的话,应该是可以做到动态去连接库的问题。 但是这2种情况,在事务和获取数据源方面都要自己手动去写,可能会比较麻烦点~ 以上浅见,轻拍 2、如果非要做到这个效果,只能在Spring初始化的时候配置多个数据源,JDCBTemplate只能手动去拿,每次拿之前。根据登录用户的信息去选择数据源。这样达到动态选择数据源的效果。 这个怎么拿法,有没有好的见意,因为我的程序都写完了,现在客户要求这样,尽可能少量改代码就能实现..... |
|
返回顶楼 | |
发表时间:2011-07-04
继承下com.mchange.v2.c3p0.ComboPooledDataSource,覆盖setUser, setPassword,自己从数据库读取不行吗?
|
|
返回顶楼 | |
发表时间: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; }
|
|
返回顶楼 | |