SQLException: Could not open JDBC Connection for
SQLException: Could not open JDBC Connection for
sprouting 发表于2年前
SQLException: Could not open JDBC Connection for
  • 发表于 2年前
  • 阅读 69
  • 收藏 1
  • 点赞 2
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

摘要: SQLException: No suitable driver found for ${jdbc.driver} Could not open JDBC Connection for transaction

今天遇到一个非常有意思的问题,启动项目之后,报错:

严重: Servlet.service() for servlet [taotao-manage] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: ------
java.lang.ClassNotFoundException: ${jdbc.driver}

从字面上看,是数据库找不到驱动,打开maven,驱动是存在的,然后检查配置文件

并没有发现错误,而且之前启动项目是没有问题,查看配置文件:

<!--连接池设置-->
	<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"
		  destroy-method="close">
		<!-- 数据库驱动,注意一下它的地址 -->
		<property name="driverClass" value="${jdbc.driver}" />
		<!-- 相应驱动的jdbcUrl -->
		<property name="jdbcUrl" value="${jdbc.url}" />
		<!-- 数据库的用户名 -->
		<property name="username" value="${jdbc.username}" />
		<!-- 数据库的密码 -->
		<property name="password" value="${jdbc.password}" />
		<!--&lt;!&ndash; 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0 &ndash;&gt;
		<property name="idleConnectionTestPeriod" value="60" />
		&lt;!&ndash; 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0 &ndash;&gt;
		<property name="idleMaxAge" value="30" />-->
		<!-- 每个分区最大的连接数 -->
		<property name="maxConnectionsPerPartition" value="150" />
		<!-- 每个分区最小的连接数 -->
		<property name="minConnectionsPerPartition" value="5" />
	</bean>

也不存在问题,IDEA甚至可以帮你找到配置文件,然后检查数据库连接,数据库是否假死,数据库的密码和用户都没有问题。百度之发现:

在 spring里使用org.mybatis.spring.mapper.MapperScannerConfigurer 进行自动扫描的时候,设置了sqlSessionFactory 的话,可能会导致PropertyPlaceholderConfigurer失效,也就是用${jdbc.username}这样之类的表达式,将无法 获取到properties文件里的内容。 导致这一原因是因为,MapperScannerConigurer实际是在解析加载bean定义阶段的,这个时候要是设置 sqlSessionFactory的话,会导致提前初始化一些类,这个时候,PropertyPlaceholderConfigurer还没来得及替 换定义中的变量,导致把表达式当作字符串复制了。 但如果不设置sqlSessionFactory 属性的话,就必须要保证sessionFactory在spring中名称一定要是sqlSessionFactory ,否则就无法自动注入。又或者直接定义 MapperFactoryBean ,再或者放弃自动代理接口方式。 
来源:http://www.oschina.net/question/188964_32305?sort=default&p=1#answers

仔细一检查,果然

将配置文件如下替换

<!--<property name="driverClass" value="${jdbc.driver}" />-->
<property name="driverClass" value="com.mysql.jdbc.Driver" />
即不使用${}符号即可。

下面的是大神提供的解决方案:

http://www.lpnote.com/ (大神的博客)@

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  

<property name="basePackage" value="com.xxxx.dal.mapper" /> 

<property name="sqlSessionFactoryBeanName" value="ysSqlSessionFactory" />

 <!-- <property name="sqlSessionFactory" ref="ysSqlSessionFactory"></property> -->

 </bean>

 

改用sqlSessionFactoryBeanName注入就没有问题(不要使用sqlSessionFactory属性注入,使用 sqlSessionFactoryBeanName注入),因为这时不会立即初始化sqlSessionFactory,传入的只是名字,非bean, 所以不会引发提前初始化问题。。

共有 人打赏支持
粉丝 6
博文 125
码字总数 43036
×
sprouting
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: