今天在整合spring和mybatis时进行测试,发现sql查询时连不上数据库,异常日志如下:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database.  Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (ORA-01017: invalid username/password; logon denied
)
### The error may exist in com/summerzhou/base/mapper/SysuserMapper.xml
### The error may involve com.summerzhou.base.mapper.SysuserMapper.selectByPrimaryKey
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (ORA-01017: invalid username/password; logon denied
)at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:371)at com.sun.proxy.$Proxy3.selectOne(Unknown Source)at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:163)at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:63)at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:43)at com.sun.proxy.$Proxy4.selectByPrimaryKey(Unknown Source)at com.summerzhou.test.TestClass.findUserById(TestClass.java:27)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:606)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)at org.junit.runners.ParentRunner.run(ParentRunner.java:309)at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

这里提示是用户/密码无效,我在oracle上试了试,密码是正确的。然后检查db.properties,其中的用户名密码也没错

driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.25.129:1521:orcl
username=tommy
password=***

使用spring框架获取dataSource实例,检查dataSource的userName,发现结果为x,并不是db文件中指定的tommy。

    @Testpublic void setDateSource() {BasicDataSource dataSource = (BasicDataSource) applicationContext.getBean("dataSource");System.out.println(dataSource.getUsername());}

我突然意识到,x就是我本机的用户名,查了查资料,spring框架的<context:property-placeholder>是用来激活“${}”占位符的,解析location属性中定义的文件,生成了一个PropertyPlaceholderConfigurer实例, PropertyPlaceholderConfigurer用来外部化根据java properties格式定义的属性,可以使程序员定制特定的环境属性,如数据库url和密码,这样可以只修改对应的properties文件,而无需影响框架。
在我定义的db.properties中,用户名的key为username,dataSource注入的属性值为${username},但其实这个username并不是文件中的值。因为PropertyPlaceholderConfigurer不仅在指定的properties文件中定义属性,还会检查java运行环境中的属性。我们可以通过system-properties-mode属性来定制检查属性的顺序,该属性有四个值:
1)ENVIRONMENT:默认属性,首先在运行环境中读取,如果没有得到指定的属性值,则在location指定的properties文件中读取。这也是dataSource的用户名为什么为本机名的原因,因为在运行系统中,username为系统本机名
2)NONE:从不检查系统属性,只解析properties文件
3)OVERRIDE:先系统后本地properties
4)FALLBACK:先properties后系统

综上,解决方法有两种:
1.将properties文件中的key之前全加上jdbc.,这样在读取属性时就不会与系统属性冲突

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@192.168.25.129:1521:orcl
jdbc.username=tommy
jdbc.password=****

dataSource注入改为:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassName" value="${jdbc.driverClassName}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property>
</bean>

2.将<context:property-placeholder>的system-properties-mode改为NONE或者FALLBACK

spring报错:ORA-01017: invalid username/password; logon denied相关推荐

  1. Oracle 登录时错误: ORA-01017: invalid username/password; logon denied

    2019独角兽企业重金招聘Python工程师标准>>> 现象: 本地执行:sqlplus sys/pwd as sysdba 正常登录: 通过jdbc登录: user = " ...

  2. oracle11g数据库登录01017,sqlplus登录Oracle时ORA-01017: invalid username/password; logon denied的错误...

    今天用scott用户登录Oracle数据库时,竟然出现了ORA-01017: invalid username/password; logon denied错误,原以为是因为我的scott用户没有解锁 ...

  3. ora-01017 invalid username/password logon denied

    ora-01017 invalid username/password logon denied pl/sql可以登录,java程序就是不行:后来换了一个用户,就可以登录: 后来把用户的密码重置了一下 ...

  4. sqlplus登录Oracle时ORA-01017: invalid username/password; logon denied的错误

    SQL> conn dell 输入口令: ERROR: ORA-01017: invalid username/password; logon deniedSQL> SQL> SQL ...

  5. 解決scott 用戶登錄錯誤: invalid username/password;logon denied

    这个错误的根本原因是Oracle11g数据库中的用户名和密码是区分大小写的,所以当使用小写字母无法登陆的时候,试试使用全大写.当然在登录前,记得先解锁. 在sys/system用户下: conn sy ...

  6. ORA-01017: invalid username/password; logon denied ORA-02063: 紧接着line(源于DBLINKN~~~)

    密码用双引号引起来重行创建一下(亲自测试过) create database link TEST_DBLINK_ONE   connect to APP   identified by "A ...

  7. SpringBoot连接Oracle数据库报ORA-01017: invalid username/password; logon denied

    目录 一.报错如下图: 二.lz的环境版本 三.解决方式 四.lz报错的原因 一.报错如下图: 问题描述 lz用sqlplus或者navicat客户端连接oracle数据库正常连接,但是在项目中运行一 ...

  8. oracle java.sql.SQLException: ORA-00911: 无效字符和ORA-01017: invalid username/password; logon denied

    1.执行sql报错 [Err] ORA-00911: 文字が無効です. select 用户 from XXX.表名 t where 用户 is not null 将sql中出现汉字的表名和字段名,使用 ...

  9. Oracle ORA-01017: invalid username/password;解决完一个12560又来一个

    问题描述: ORA-01017: invalid username/password;logon denied 问题分析: 1.密码错误导致报错. 解决办法:重新输入密码. 2.该登录用户没有权限. ...

最新文章

  1. NLP带来的“科幻感”超乎你的想象 - ACL2020论文解读
  2. java怎么来用urlrewrite伪静态化和urlrewrite的配置
  3. STM32开发 -- 可调直流稳压电源
  4. java数据库连接类,已经把数据库操作的方法都封装好了
  5. 响应式网页布局 - W3Schools How-Tos 01
  6. java关键字和标识符_Java数据类型和标识符
  7. Redis在Web项目中的应用与实践
  8. 设备驱动简介 -- ldd3读书笔记
  9. 从游戏谈起——论主动性和责任心
  10. zutuanxue.com-DNS服务器
  11. Java内存映射原理与实现
  12. php与sap系统,sap系统是什么意思
  13. android developer tools下载地址
  14. 【PTA】【C语言】球体的表面积及体积
  15. 计算机类单位换算,计算机单位换算大全
  16. Zigbee应用之搭建开发环境
  17. 【AGC031E】Snuke the Phantom Thief(费用流)
  18. 【大四上学期】过程控制系统课程笔记
  19. android 13 热点启动流程
  20. Windows10鼠标右键增加新项

热门文章

  1. Excle常用函数——if函数
  2. javascript王国的一次旅行,一个没有类的世界怎么玩转面向对象?
  3. 物理机安装centos7操作系统教程完整教程图解
  4. 中国传统节日中英对照:七夕
  5. C++学生考勤管理系统报告
  6. springboot+dubbo+zookeeper怎么设置熔断器并调用
  7. 华创期货:期货交易八大技巧让亏损远离
  8. 211哈尔滨工程大学,计算机考研情况
  9. Android聚合无效的问题
  10. OKHttp实现多文件上传