文档章节

SQLException: Could not open JDBC Connection for

sprouting
 sprouting
发布于 2016/05/12 15:55
字数 705
阅读 91
收藏 1

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

严重: 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, 所以不会引发提前初始化问题。。

© 著作权归作者所有

共有 人打赏支持
sprouting
粉丝 9
博文 146
码字总数 54481
作品 0
广州
程序员
数据库中间件 Sharding-JDBC 源码分析 —— JDBC实现与读写分离

摘要: 原创出处 http://www.iocoder.cn/Sharding-JDBC/jdbc-implement-and-read-write-splitting/ 「芋道源码」欢迎转载,保留摘要,谢谢! 本文主要基于 Sharding-JDBC 1.5.0 正式版 1. 概述...

芋道源码
2017/10/22
0
0
嵌入式 内存 数据库H2 Mixed Mode布署

Connection Modes The following connection modes are supported: Embedded mode (local connections using JDBC) Remote mode (remote connections using JDBC or ODBC over TCP/IP) Mixed......

JavaGG
2010/03/24
0
0
JDBC中Class.forName()的作用

使用JDBC时,我们都会很自然得使用下列语句: java 代码 Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8"; ......

村长大神
2014/05/09
0
0
SpringData入门笔记(一) - 重温jdbc操作

学习Spring Data之前,我们先通过几种基础的、常见的方式访问数据库,然后再通过Spring Data的方式访问,可以分别其中的优劣,对它们有一个更好的了解。 目标 有一个学生表,属性有id/name/a...

dotleo
2017/11/05
0
0
java调用oracle存储过程

一:无返回值的存储过程 存储过程为: CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS BEGIN INSERT INTO HYQ.BID (IID,I_NAME) VALUES (PARA1, PARA2); END ......

battier
2011/07/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

发生系统错误 5 拒绝访问

1、使用命令net start *开启一个服务的时候,出现发生系统错误5,拒绝访问。 解决:切换到管理员模式执行此命令即可。

fang_faye
20分钟前
1
0
devops 成长路线

https://36kr.com/p/5157249.html

swingcoder
32分钟前
1
0
Java内存区域的划分和异常

行时数据区域 JVM在运行Java程序时候会将内存划分为若干个不同的数据区域。 程序计数器 线程私有。可看作是当前线程所执行的字节码的行号指示器,字节码解释器的工作是通过改变这个计数值来读...

架构师springboot
34分钟前
1
0
kubeadm 安装kubernetes1.12.1

准备环境 服务器 服务器情况: IP 系统版本 角色 Hostname 10.20.13.24 Centos7 64位 minimal master kuber24 10.20.13.25 Centos7 64位 minimal work Kuber25 10.20.13.26 Centos7 64位 mi......

hgfgoodcreate
37分钟前
4
0
腾讯又添 AI 开源项目! 腾讯 AI Lab 正式开源业内最大规模多标签图像数据集

2018年10月17日,腾讯AI Lab宣布正式开源“Tencent ML-Images”项目,地址为https://github.com/Tencent/tencent-ml-images。该项目由多标签图像数据集ML-Images,以及业内目前同类深度学习模...

腾讯开源
44分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部