SqlMapClientTemplate的问题

fireelf000 2011-09-06 10:47:16
个位大虾,小弟刚刚遇到一个很郁闷的问题急需解决,在spring+ibatis配置中,如果配置了多个数据源,只要使用SqlMapClientTemplate在加载配置的时候就会报错
Unsatisfied dependency expressed through bean property 'dataSource': No unique bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: [dataSource1, dataSource2]
难道用多数据源就不能用SqlMapClientTemplate了?这有点太扯了吧,不多说上代码。


<!-- 配置数据源,使用proxool连接池 -->
<bean id="dataSource1" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="driver">
<value>${database.driver1}</value>
</property>
<property name="driverUrl">
<value>${database.url1}</value>
</property>
<property name="user">
<value>${database.username1}</value>
</property>
<property name="password">
<value>${database.password1}</value>
</property>
<property name="alias">
<value>MyPool1</value>
</property>
<property name="prototypeCount">
<value>10</value>
</property>
<property name="minimumConnectionCount">
<value>10</value>
</property>
<property name="maximumConnectionCount">
<value>50</value>
</property>
<property name="houseKeepingSleepTime">
<value>30000</value>
</property>
<property name="maximumActiveTime">
<value>180000</value>
</property>
<property name="maximumConnectionLifetime">
<value>3600000</value>
</property>
<property name="trace">
<value>false</value>
</property>
<property name="verbose">
<value>false</value>
</property>
</bean>

<bean id="dataSource2" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="driver">
<value>${database.driver2}</value>
</property>
<property name="driverUrl">
<value>${database.url2}</value>
</property>
<property name="user">
<value>${database.username2}</value>
</property>
<property name="password">
<value>${database.password2}</value>
</property>
<property name="alias">
<value>MyPool2</value>
</property>
<property name="prototypeCount">
<value>10</value>
</property>
<property name="minimumConnectionCount">
<value>10</value>
</property>
<property name="maximumConnectionCount">
<value>50</value>
</property>
<property name="houseKeepingSleepTime">
<value>30000</value>
</property>
<property name="maximumActiveTime">
<value>180000</value>
</property>
<property name="maximumConnectionLifetime">
<value>3600000</value>
</property>
<property name="trace">
<value>false</value>
</property>
<property name="verbose">
<value>false</value>
</property>
</bean>

<!-- 配置ibatis -->
<bean id="sqlMapClient1" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="dataSource1" />
<property name="configLocation">
<value>classpath:sqlmap-config1.xml</value>
</property>
</bean>
<bean id="sqlMapClient2" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="dataSource2" />
<property name="configLocation">
<value>classpath:sqlmap-config2.xml</value>
</property>
</bean>

<bean id="sqlMapClientTemplate1" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient" ref="sqlMapClient1" />
</bean>


经过反复测试,现在是这样的情况
1.只要配置中配置了sqlMapClientTemplate1,加载配置文件时立即报错,如果不配置sqlMapClientTemplate1,直接使用ibaits的sqlMapClient1和sqlMapClient2,在main函数中测试2个数据库都访问成功,一切ok

2.如果配置了sqlMapClientTemplate1,但是去掉dataSource2,只保留dataSource1,也ok

ps:spring使用的版本是2.5,难道这是bug?
...全文
545 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
游一游走一走 2011-09-23
  • 打赏
  • 举报
回复
在家试了下是可以配置的以下是我的完整配置,没有出现你说的情况,如果加上JDBC事务不出错逻辑也肯定会有问题,所以无试,多数据库环境下只能够用JTA来保证多数据库事务的完整性

<?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/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="userBeanTest" class="com.zhangyz.tools.UserBeanTest"
scope="prototype" />
<bean id="springInterceptor" class="com.zhangyz.tools.SpringInterceptor"></bean>
<aop:config>
<aop:aspect ref="springInterceptor">
<aop:pointcut expression="execution(* com.zhangyz.tools..*method1(..))"
id="method1" />
<aop:around method="aroundMethod" pointcut-ref="method1" />
</aop:aspect>
</aop:config>
<bean id="propertyAutoChange"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:jdbc.properties</value>
</property>
</bean>
<bean id="dataSource1" class="com.ibatis.common.jdbc.SimpleDataSource">
<constructor-arg index="0">
<map>
<entry>
<key>
<value>JDBC.DefaultAutoCommit</value>
</key>
<value>${jdbc.autoCommit}</value>
</entry>
<entry>
<key>
<value>JDBC.Driver</value>
</key>
<value>${jdbc.driverClassName}</value>
</entry>
<entry>
<key>
<value>JDBC.ConnectionURL</value>
</key>
<value>${jdbc.url}</value>
</entry>
<entry>
<key>
<value>JDBC.Username</value>
</key>
<value>${jdbc.username}</value>
</entry>
<entry>
<key>
<value>JDBC.Password</value>
</key>
<value>${jdbc.password}</value>
</entry>
</map>
</constructor-arg>
</bean>
<bean id="dataSource2" class="com.ibatis.common.jdbc.SimpleDataSource">
<constructor-arg index="0">
<map>
<entry>
<key>
<value>JDBC.DefaultAutoCommit</value>
</key>
<value>${jdbc.autoCommit}</value>
</entry>
<entry>
<key>
<value>JDBC.Driver</value>
</key>
<value>${jdbc.driverClassName}</value>
</entry>
<entry>
<key>
<value>JDBC.ConnectionURL</value>
</key>
<value>${jdbc.url}</value>
</entry>
<entry>
<key>
<value>JDBC.Username</value>
</key>
<value>${jdbc.username}</value>
</entry>
<entry>
<key>
<value>JDBC.Password</value>
</key>
<value>${jdbc.password}</value>
</entry>
</map>
</constructor-arg>

</bean>
<bean id="sqlMapClient1" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="dataSource1"></property>
<property name="configLocation">
<value>classpath:SqlMapConfig.xml</value>
</property>
</bean>
<bean id="sqlMapClient2" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="dataSource2"></property>
<property name="configLocation">
<value>classpath:SqlMapConfig.xml</value>
</property>
</bean>
<bean id="sqlMapClientTemplate1" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient" ref="sqlMapClient1"></property>
</bean>
<bean id="sqlMapClientTemplate2" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient" ref="sqlMapClient2"></property>
</bean>
<bean id="accountDao1" class="com.zhangyz.dao.impl.AccountDaoImpl">
<property name="sqlMapClientTemplate" ref="sqlMapClientTemplate1"></property>
</bean>
<bean id="accountDao2" class="com.zhangyz.dao.impl.AccountDaoImpl">
<property name="sqlMapClientTemplate" ref="sqlMapClientTemplate2"></property>
</bean>

<bean id="accountService" class="com.zhangyz.service.AccountService">
<property name="accountDao1" ref="accountDao1"></property>
<property name="accountDao2" ref="accountDao2"></property>
</bean>

<bean id="accountAction" class="com.zhangyz.action.AccountAction">
<property name="accountService" ref="accountService"></property>
</bean>
</beans>


游一游走一走 2011-09-23
  • 打赏
  • 举报
回复
粗略看了下配置文件感觉没有什么问题......
你的exception不能够搞的详细点么,它应该会指定那个类无法给dataSource赋值吧,没有用过分布式的事物,但就我的了解spring不支持你这样的分布式吧,是用jta吧,麻烦贴下spring,ibatis的版本我回家了试试看
cjoy4856 2011-09-23
  • 打赏
  • 举报
回复
lz是否使用了spring提供的SqlMapClientDaoSupport类 如果你的dao层使用这个类(继承)的话,你这样可能是错的。
1.在SqlMapClientDaoSupport 类中需要的是SqlMapClient

public final void setSqlMapClient(SqlMapClient sqlMapClient) {
if (!this.externalTemplate) {
this.sqlMapClientTemplate.setSqlMapClient(sqlMapClient);
}
}

2.按照LZ的使用sqlMapClientTemplate1 创建 但是在SqlMapClientDaoSupport 中需要的sqlMapClientTemplate

public final void setSqlMapClientTemplate(SqlMapClientTemplate sqlMapClientTemplate) {
Assert.notNull(sqlMapClientTemplate, "SqlMapClientTemplate must not be null");
this.sqlMapClientTemplate = sqlMapClientTemplate;
this.externalTemplate = true;
}



以上代码为源码,从源码来看需要的属性名称都不对(或是设置都不对)
orblogin 2011-09-23
  • 打赏
  • 举报
回复
上面发错了,看下这篇文章

http://code.alibabatech.com/docs/cobarclient/zh/
orblogin 2011-09-23
  • 打赏
  • 举报
回复
MultiSqlMapClientFactory
fireelf000 2011-09-06
  • 打赏
  • 举报
回复
3楼,答非所问?
fireelf000 2011-09-06
  • 打赏
  • 举报
回复
回2楼的兄弟,显示指定也不行,现在就是两种情况,要么不配置SqlMapClientTemplate,要么只保留一个dataSource,如果2个数据源再配置SqlMapClientTemplate怎么配都报错
ZPH2254 2011-09-06
  • 打赏
  • 举报
回复
学习了
liyang1271989 2011-09-06
  • 打赏
  • 举报
回复




<?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/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<bean id="dataSourceSysadmin"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@192.168.0.111:1521:ORCL" />
<property name="username" value="" />
<property name="password" value="" />
</bean>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="dataSysadmin"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@192.168.0.111:1521:ORCL" />
<property name="username" value="" />
<property name="password" value="" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSysadmin" />
</bean>
<aop:config>
<aop:advisor
pointcut="execution(* com.aisino2..service.*.*(..))"
advice-ref="txAdvice" />
</aop:config>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="insert*" />
<tx:method name="delete*" />
<tx:method name="update*" />
<tx:method name="uploadFkxx*" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>

<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation"
value="classpath:config/ibatis/sql-map-config.xml" />
<property name="dataSource" ref="dataSource" />
</bean>

<bean id="sqlMapSysadmin"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation"
value="classpath:config/ibatis/oracle/sql-map-sysadmin-config.xml" />
<property name="dataSource" ref="dataSysadmin" />
</bean>
<bean id="operateLog"
class="com.aisino2.sysadmin.dao.OperateLogNote">
<property name="sqlMapClient" ref="sqlMapSysadmin" />
</bean>
</beans>

Fly_m 2011-09-06
  • 打赏
  • 举报
回复
<bean id="sqlMapClientTemplate1" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="dataSource" ref="dataSource1" />
<property name="sqlMapClient" ref="sqlMapClient1" />
</bean>

这样呢?显示指定datasource?
fireelf000 2011-09-06
  • 打赏
  • 举报
回复
千万别沉了啊,难道没有哪位遇到过这种情况吗
fireelf000 2011-09-06
  • 打赏
  • 举报
回复
真的没有人遇到过吗?难道没人用过spring+ibatis做分布式事务?
fireelf000 2011-09-06
  • 打赏
  • 举报
回复
谢谢7楼的朋友,但是那个文章和我现在的问题没什么联系。
我在重复下当前的环境,项目马上就要完成了,一直都是单dataSource+SqlMapClientTemplate,
但是现在由于业务需求,需要将数据库拆分,变成2个数据库,于是需要在spring中添加第二个数据库的配置,但是现在配置文件中一旦再配置多一个数据源,spring在加载配置的时候就会报错。
经测试,问题出在2个dataSource和SqlMapClientTemplate上,去掉任意dataSource或者去掉SqlMapClientTemplate都可以正常运行。
24K純帥 2011-09-06
  • 打赏
  • 举报
回复
http://hi.baidu.com/yb030832/blog/item/9bb78dfde8118e40d6887df4.html
第一部分 Spring基础  第1章 开始Spring之旅   1.1 为什么使用Spring    1.1.1 J2EE开发者的一天    1.1.2 Spring的承诺   1.2 Spring是什么   1.3 开始Spring之旅   1.4 理解反向控制    1.4.1 依赖注入    1.4.2 IoC应用    1.4.3 企业级应用中的IoC   1.5 应用AOP    1.5.1 AOP介绍    1.5.2 AOP使用    1.5.3 企业级应用中的AOP   1.6 Spring比较    1.6.1 比较Spring和EJB    1.6.2 关于其他轻量级容器    1.6.3 Web框架    1.6.4 持久层框架   1.7 小结  第2章 装配Bean   2.1 容纳你的Bean    2.1.1 BeanFactory介绍    2.1.2 使用应用上下文    2.1.3 Bean的生命   2.2 基本装配    2.2.1 使用XML装配    2.2.2 添加一个Bean    2.2.3 通过Set方法注入依赖    2.2.4 通过构造函数注入依赖   2.3 自动装配    2.3.1 处理自动装配中的不确定性    2.3.2 混合使用自动和手动装配    2.3.3 缺省自动装配    2.3.4 何时采用自动装配   2.4 使用Spring的特殊Bean    2.4.1 对Bean进行后处理    2.4.2 对Bean工厂进行后处理    2.4.3 分散配置    2.4.4 定制属性编辑器    2.4.5 解析文本信息    2.4.6 监听事件    2.4.7 发布事件    2.4.8 感知其他Bean   2.5 小结  第3章 创建切面   3.1 AOP介绍    3.1.1 定义AOP术语    3.1.2 Spring的AOP实现   3.2 创建通知    3.2.1 前置通知    3.2.2 后置通知    3.2.3 环绕通知    3.2.4 异常通知    3.2.5 引入通知   3.3 定义切入点    3.3.1 在Spring中定义切入点    3.3.2 理解Advisor    3.3.3 使用Spring的静态切入点    3.3.4 使用动态切入点    3.3.5 切入点实施   3.4 创建引入    3.4.1 实现IntroductionInterceptor    3.4.2 创建一个引入Advisor    3.4.3 谨慎使用引入通知   3.5 使用ProxyFactoryBean   3.6 自动代理    3.6.1 BeanNameAutoProxyCreator    3.6.2 DefaultAdvisorAutoProxyCreator    3.6.3 元数据自动代理   3.7 小结 第二部分 Spring在业务层的应用  第4章 征服数据库   4.1 学习Spring的DAO理念    4.1.1 理解Spring的DataAccessException    4.1.2 与DataSource一起工作    4.1.3 一致的DAO支持   4.2 在Spring中使用JDBC    4.2.1 JDBC代码的问题    4.2.2 使用JdbcTemplate    4.2.3 把操作创建成对象    4.2.4 自增键   4.3 介绍Spring的ORM框架支持   4.4 用Spring整合Hibernate    4.4.1 Hibernate概览    4.4.2 管理Hibernate资源    4.4.3 用HibernateTemplate访问Hibernate    4.4.4 HibernateDaoSupport的子类   4.5 Spring和JDO    4.5.1 配置JDO    4.5.2 用JdoTemplate访问数据库   4.6 Spring和iBATIS    4.6.1 配置SQL Map    4.6.2 使用SqlMapClientTemplate   4.7 Spring和OJB   4.8 小结  第5章 事务管理   5.1 理解事务    5.1.1 仅用4个词解释事务    5.1.2 理解Spring对事务管理的支持    5.1.3 介绍Spring的事务管理器   5.2 在Spring中编写事务   5.3 声明式事务    5.3.1 理解事务属性    5.3.2 声明一个简单的事务策略   5.4 通过方法名声明事务    5.4.1 使用NameMatchTransactionAttributeSource    5.4.2 名称匹配事务的捷径   5.5 用元数据声明事务    5.5.1 用元数据来书写事务属性    5.5.2 用Commons Attributes声明事务   5.6 修剪事务声明    5.6.1 从父TransactionProxyFactoryBean继承    5.6.2 自动代理事务   5.7 小结  第6章 远程调用   6.1 Spring远程调用概览   6.2 与RMI一起工作    6.2.1 连接RMI服务    6.2.2 输出RMI服务   6.3 使用Hessian和Burlap的远程调用    6.3.1 访问Hessian/Burlap服务    6.3.2 用Hessian或Burlap公开Bean的功能   6.4 使用HTTP invoker    6.4.1 通过HTTP访问服务    6.4.2 把Bean作为HTTP服务公开   6.5 使用EJB    6.5.1 访问EJB    6.5.2 用Spring开发EJB   6.6 使用JAX-RPC的Web Service    6.6.1 用JAX-RPC应用一个Web Service    6.6.2 在Spring里置入一个Web Service   6.7 小结  第7章 访问企业服务   7.1 从JNDI中获取对象    7.1.1 使用传统的JNDI    7.1.2 代理JNDI对象   7.2 发送电子邮件   7.3 调度任务    7.3.1 使用Java Timer调度任务    7.3.2 使用Quartz调度器    7.3.3 按调度计划调用方法   7.4 使用JMS发送消息    7.4.1 使用JMS模板发送消息    7.4.2 消费消息    7.4.3 转换消息   7.5 小结 第三部分 Spring在Web层的应用  第8章 建立Web层   8.1 开始Spring MVC之旅    8.1.1 请求生命中的一天    8.1.2 配置DispatcherServlet    8.1.3 Spring MVC概述   8.2 将请求映射到控制器    8.2.1 将URL映射到Bean名称    8.2.2 使用SimpleUrlHandlerMapping    8.2.3 使用元数据映射控制器    8.2.4 使用多映射处理器   8.3 用控制器处理请求    8.3.1 编写一个简单的控制器    8.3.2 处理命令    8.3.3 处理表单提交    8.3.4 用向导处理复杂表单    8.3.5 在一个控制器中处理多个动作    8.3.6 使用一次性控制器   8.4 视图解析    8.4.1 使用模板视图    8.4.2 解析视图Bean    8.4.3 选择视图解析器   8.5 使用Spring的绑定标签   8.6 处理异常   8.7 小结  第9章 其他视图技术   9.1 使用Velocity模板    9.1.1 定义Velocity视图    9.1.2 配置Velocity引擎    9.1.3 解析Velocity视图    9.1.4 格式化日期和数字    9.1.5 暴露请求和会话属性    9.1.6 在Velocity中绑定表单域   9.2 使用FreeMarker    9.2.1 构造一个FreeMarker视图    9.2.2 配置FreeMarker引擎    9.2.3 解析FreeMarker视图    9.2.4 在FreeMarker中绑定表单域   9.3 使用Tile设计页面布局    9.3.1 Tile视图    9.3.2 Tile控制器   9.4 产生非HTML输出    9.4.1 产生Excel工作表    9.4.2 产生PDF文档    9.4.3 产生其他非HTML文件   9.5 小结  第10章 使用其他Web框架   10.1 使用Jakarta Struts    10.1.1 注册Spring插件    10.1.2 实现知晓Spring的Struts action    10.1.3 委托action   10.2 使用Tapestry    10.2.1 替换Tapestry引擎    10.2.2 装载Spring Bean至Tapestry页面中   10.3 集成JavaServer Faces    10.3.1 解析变量    10.3.2 发布请求已处理事件   10.4 集成WebWork    10.4.1 WebWork1    10.4.2 XWork/WebWork2   10.5 小结  第11章 保护Spring 应用程序   11.1 Acegi安全系统介绍    11.1.1 安全拦截器    11.1.2 认证管理器    11.1.3 访问决策管理器    11.1.4 运行身份管理器   11.2 管理身份验证    11.2.1 配置ProviderManager    11.2.2 根据数据库验证身份    11.2.3 根据LDAP仓库进行身份验证    11.2.4 基于Acegi和Yale CAS实现单次登录   11.3 控制访问    11.3.1 访问决策投票    11.3.2 决定如何投票    11.3.3 处理投票弃权   11.4 保护Web应用程序    11.4.1 代理Acegi的过滤器    11.4.2 强制Web安全性    11.4.3 处理登录    11.4.4 设置一个安全上下文    11.4.5 确保通道安全性    11.4.6 使用Acegi的标签库   11.5 保护方法调用    11.5.1 创建一个安全切面    11.5.2 使用元数据保护方法   11.6 小结

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧