吐血整理数据库连接的过程


吐血整理数据库连接的过程

今天接手一个好老的项目,用的框架是JSP,maven都没有,Spring还是3.x版本的。让我把桐乡12345上面做好的一个功能给移植到海盐12345上面。我请教了两位大神才好不容易把项目跑起来,然后我登录系统报错数据库异常。

报的错误是Could not get JDBC Connection,为什么报错呢?根据报错的行号定位过去(这里吐槽一下,IDEA的bug真多,直接跳到DataSourceUtils.java第82行位置根本不对,可能是因为Spring 3.x版本的源码找不到了,导致源文件压根无法定位的原因),慢慢定位到报错之前的那一行

然后我看了一眼dataSource,发现数据库的账号密码特别奇怪,长得像下面这样子

用户名密码的前后多了\n\t\t\t,也不知道为什么会这个样子。

为了找到原因,我只能去硬着头皮 debug 阅读 Spring 加载数据源的源码了。数据源是在org.springframework.jdbc.core.JdbcTemplate#execute(org.springframework.jdbc.core.PreparedStatementCreator, org.springframework.jdbc.core.PreparedStatementCallback)这个函数里面获取到的

这个dataSource又是在org.springframework.jdbc.support.JdbcAccessor#setDataSource这个函数里面进行设置的

所以在设置数据源的代码上增加断点,重新启动一下应用,我发现一个非常诡异的事情,设置数据源的方法居然会进来两次。根据调试堆栈往上翻一翻,好像能够看到是给不同的 bean 设置了数据源,它们的名字叫做:persistemce_oracle_jdbcpersistemce_cx_jdbc

为什么是这两个bean呢?我全局搜索了一下persistemce_oracle_jdbc,在applicationContext.xml中找到了答案

好了,答案揭晓了,applicationContext.xml 里面的账号密码写错了,不能有回车,也不知道是谁上传的代码,真坑