背景
项目开发早期使用 MySQL ,后期需要适配 oracle ,总结适配进程及多数据库支持时,从开发早期就需要斟酌的几点。
另外,总结几点最近半年开发进程中的技术问题。坑都填了,也该是时候记录一下填坑的经过了,要不然下次可能还会踏入同一个坑。
Oracle 适配点
- 表名称长度限制,支持 Oracle 12C 以下是需要斟酌 30个字符的限制。
- Oracle 关键字
USER不能乱用做别名.跟 MySQL 不一样,Oracle 有一张特殊的用户表名称就是USER。 - Oracle 没有默许转义符号,支持模糊查询时,需要手动编写查询语句指定 ESCAPE 字符。这点 MyBatisPlus 插件的模糊查询心有余而力不足,所以或者需要自定义模糊查询 SQL。好在 MySQL 和 Oracle 的
ESCAPE语法是是一样的,可以统一。另外字符串联接函数CONCAT也应当以 Oracle 为主,只能有两个参数。 - Oracle 的字段长度,一个中文的长度是2,这点与 MySQL 不一样。可变长度、允许输入中文的字段,都需要自动扩大到 MySQL 的 2 倍长。
- Oracle 的 null 值插入或更新时的异常问题,可以通过 MyBatisPlus 的全局配置
jdbc-type-for-null: 'null'统一解决。 - Oracle 辨别大小写的,SQL 语法中注意小写会不会真的是小写,如果是,需要加引号转义。
- MySQL 的 text 或 LongText 字段,对应
NCLOBVSVARCHAR(4000),有些特殊字段需要超长字符的,有个四千的边界,超过就需要用NCLOB类型。
其他低级毛病
有些低级毛病,比如:
- yml 配置冒号后面要有空格,特殊字符用单引号。
- IDEA 将普通 Java 工程导出可履行 jar 的时候,MANTIFET 清单文件生成的目录一定要放在 src 下面,否则打包生成的文件履行时找不到主类。
- 迭代器遍历的正确用法是
while(it.hasNext)而非 if ,后者只会履行一次。再次印证了一句经验:不要相信拷贝来的代码,除非经过了你的测试。 - 精度丢失问题,一个简单的计算指定周期的时间戳的代码,未斟酌精度问题而溢出:
switch (type){
case “year”:
result = time*365*24*60*60*1000;
break;
case “month”:
result = time*30*24*60*60*1000;
break;
case “day”:
result = time*24*60*60*1000;
break;
}
这个简单的根据时间单位类型,计算间隔的时间戳的代码, time 类型传入了 int ,结果几个纯数值默许 int 相乘后,单位为 year 结果溢出为负数了。
这是一个计算密码锁定时间的功能,锁定时间算出为负了,当密码正确时自动判断会不会继续锁定时,当前时间 > (锁定开始时间+锁定经常)直接解锁了。
这个毛病虽然低级,但是却测不出来,只有脑回路清奇的测试把密码锁定策略的锁定周期设置为年时才会显现。
高级问题
Web 项目安全扫描,https 支持的进程中,默许的 ssl 配置被扫到了不安全的密码套件和密钥长度太短的问题。Spring Boot 项目配置 SSL ,在目标服务器配置后 ciphers 密码套件后,访问不成功,总结一下这个进程。
相关的 SSL 配置:
enabled: false
key-store: file:xxx.jks
key-store-type: JKS
key-alias: xxx
key-store-password: xxx
# 配置证书版本,默许是 TLS1.0
protocol: TLS
# 设置SSL版本,默许是 TLS1.0
enabled-protocols: TLSv1.2
# 密钥套件算法,剔除不安全的算法
ciphers: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
需要注意的是,ciphers 参数中的密码算法对 JDK 版本有要求,较低的1.8 小版本是不支持的。
工具思惟
有一台服务器的 SFTP 服务配置连接时间很短,由于网络问题,FTP 客户端总是没法在30秒内完成连接。但是碰到需要上传文件的时候,怎样办呢?
找他人上传了两次以后,总不能每次都找他人帮忙上传吧。试了下 Java 的 FTP 上传工具类,jsch 居然能成功上传。一个简单的工具类,就成了缩减版的 FTP 工具了。
开发启示录
启示一,协同开发进程中,如果你看到了确切是问题的异常,抛在开发沟通群里,不能期望真正负责这个模块的人会主动解决这个问题。最好的方法是 @他 并明确告知他有问题。否则,下次这个问题复现的时候,或者会再次面对的。
启示二,再次反思,拷贝代码要测试。
本篇文章到此结束,如果您有相关技术方面疑问可以联系我们技术人员远程解决,感谢大家支持本站!
本文来源:https://www.yuntue.com/post/152850.html | 云服务器网,转载请注明出处!

微信扫一扫打赏
支付宝扫一扫打赏