背景:
新入职一家公司,项目用了很多地方的oracle对接客户的数据库,以前我是没有用过。
并且对接的驱动是ojbdc6和8都在用,其他同事正常的很,就我不行
在连接的时候出现这个问题,这个问题其实还卡了我一天多时间,才入职就要出个开发任务,没时间来搞这个,所以中途下班时间搞搞,嗨呀,时间太赶了
网上的解决办法,完全解决不了(切换jdk位数)或者不能根治(直接降版本)
错误:
分析
有没有那么几种可能性呢?
1、是我自己还是所有人都是这样(首先排除,项目模板是大佬提供的,他那可以跑的起来,这个假设pass)
2、有没有可能是驱动倒入错误(其实最开始在mvnrepository库里找,是下不下来的,还得自己陪远程maven库,要么就是自己下驱动包,然后手动加到自己的maven本地库,我是直接copy大佬的maven库,有现成的,真爽!因为测了几次,maven仓库也切换了,说明确实不是这个的问题 pass掉)
3、网上评论都说是ojdbc版本问题和jdk问题(这个问题最像,我当时也以为我快成功了,结果....不过确实ojdbc6可以连接是真的,但是....已经好了的项目确实好多ojdbc8,这个不可能因为我的问题去改所有连接驱动,不现实,所以出现这个问题,网上的那几个解决方法基本解决不了,或者不能根治,问题原因其实都没有说明白)
4、我问了下公司大佬,大佬说会不会是idea版本问题或者是连接url问题,这个我用的确实低了点,2017版本....,不过后来测试不是这个问题,地址问题,这个也可以排除,不过最终答案靠点边,这个后面再说(这个其实也pass,因为都试过了)
5、没有5了,只有老老实实去跟错误代码一点一点找问题,说来也奇怪,上面标红代码那里,点进去之后,那个类没有691行,这就狠有意思...,这个是其一,之后去查资料发现数据库连接时有一个参数:
oracle.jdbc.v$session.osuser
底层代码取值代码为:System.getProperty("user.name")
然后尴尬的来了,我win10系统是中文名,其实看到这个参数的时候就想会不会是中文错误了,但是连接参数出现问题,我就在启动类加上了这个代码
System.setProperty("user.name", "英文名");
启动,解决,问题原因就固定了。
ojdbc8不能很好的兼容中文,导致了这个连接问题。
处理
这里给两个解决方案:
1、直接把ojdbc6的包换个名字放过来,我用着是没啥问题,还可以(如果实在找不到方法可以试试,一切正常)
2、设置操作系统用户名为英文名或者在代码里面设置
System.setProperty("user.name", "英文名");
也可以设置项目全局变量,启动时加上-Duser.name="英文名"
linu倒是不太会出现这个问题,那玩意基本都是英文
吃一堑长一智,真的是,程序员们真的,少用中文!这问题。。。。