spring报错:ORA-01017: invalid username/password; logon denied
今天在整合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相关推荐
- Oracle 登录时错误: ORA-01017: invalid username/password; logon denied
2019独角兽企业重金招聘Python工程师标准>>> 现象: 本地执行:sqlplus sys/pwd as sysdba 正常登录: 通过jdbc登录: user = " ...
- oracle11g数据库登录01017,sqlplus登录Oracle时ORA-01017: invalid username/password; logon denied的错误...
今天用scott用户登录Oracle数据库时,竟然出现了ORA-01017: invalid username/password; logon denied错误,原以为是因为我的scott用户没有解锁 ...
- ora-01017 invalid username/password logon denied
ora-01017 invalid username/password logon denied pl/sql可以登录,java程序就是不行:后来换了一个用户,就可以登录: 后来把用户的密码重置了一下 ...
- sqlplus登录Oracle时ORA-01017: invalid username/password; logon denied的错误
SQL> conn dell 输入口令: ERROR: ORA-01017: invalid username/password; logon deniedSQL> SQL> SQL ...
- 解決scott 用戶登錄錯誤: invalid username/password;logon denied
这个错误的根本原因是Oracle11g数据库中的用户名和密码是区分大小写的,所以当使用小写字母无法登陆的时候,试试使用全大写.当然在登录前,记得先解锁. 在sys/system用户下: conn sy ...
- ORA-01017: invalid username/password; logon denied ORA-02063: 紧接着line(源于DBLINKN~~~)
密码用双引号引起来重行创建一下(亲自测试过) create database link TEST_DBLINK_ONE connect to APP identified by "A ...
- SpringBoot连接Oracle数据库报ORA-01017: invalid username/password; logon denied
目录 一.报错如下图: 二.lz的环境版本 三.解决方式 四.lz报错的原因 一.报错如下图: 问题描述 lz用sqlplus或者navicat客户端连接oracle数据库正常连接,但是在项目中运行一 ...
- 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中出现汉字的表名和字段名,使用 ...
- Oracle ORA-01017: invalid username/password;解决完一个12560又来一个
问题描述: ORA-01017: invalid username/password;logon denied 问题分析: 1.密码错误导致报错. 解决办法:重新输入密码. 2.该登录用户没有权限. ...
最新文章
- NLP带来的“科幻感”超乎你的想象 - ACL2020论文解读
- java怎么来用urlrewrite伪静态化和urlrewrite的配置
- STM32开发 -- 可调直流稳压电源
- java数据库连接类,已经把数据库操作的方法都封装好了
- 响应式网页布局 - W3Schools How-Tos 01
- java关键字和标识符_Java数据类型和标识符
- Redis在Web项目中的应用与实践
- 设备驱动简介 -- ldd3读书笔记
- 从游戏谈起——论主动性和责任心
- zutuanxue.com-DNS服务器
- Java内存映射原理与实现
- php与sap系统,sap系统是什么意思
- android developer tools下载地址
- 【PTA】【C语言】球体的表面积及体积
- 计算机类单位换算,计算机单位换算大全
- Zigbee应用之搭建开发环境
- 【AGC031E】Snuke the Phantom Thief(费用流)
- 【大四上学期】过程控制系统课程笔记
- android 13 热点启动流程
- Windows10鼠标右键增加新项