Java实现动态数据源切换,Oracle存储过程调用

前言

时间有如白驹过隙,在敲代码的手中溜走

上周有做一个需求,要求实现页面动态数据源的切换,然后进行一个不同的存储过程调用。乍一听还挺简单的,可实际做的过程中,还是发现很多问题。

涉及技术:DruidDataSource数据源、Spring @Aysnc异步注解、Springboot jasypt加密。

在此记录,避免入坑。


一:表设计

因为要实现动态切换数据源,执行不同的存储过程。所以需要数据库来存储数据。

1:数据源配置表

该表用来存储配置的数据库连接相关,这里我用的Oracle。就是用户名,密码,url这些等等。

这里注意:安全起见,一般情况下密码都要考虑进行一个加密的存储。后面会详细介绍。

除了数据库连接以外,还可以将一些业务字段也放进去。这里我是将存储过程的执行语句也放进去了。(有点偷懒)。当然也可以数据源一个表,业务一个表。具体看业务需求。

2:执行结果表

因为项目中的存储过程过大,执行需要很长时间。所以需要使用异步实现,再用一个表去存储结果。


二:Spring  @Aysnc异步注解

该注解可以让被标注的方法异步执行。需要几个前提条件。

1:在配置类上添加@EnableAsync注解,表示开启异步配置开关

 2:将需要异步执行方法的所在类放入容器,交由Spring管理,使用时注入

 主要是要放入容器,使用@Compoent、@Service等等放入容器的注解都可以。

3:需要异步指定的方法上添加@Async注解,即可实现异步方法调用

在需要用到的地方,直接注入类,然后调用异步方法。代码中就会正常向下执行返回结果啦,然后再去异步调用。


 三:Springboot  jasypt加密

一个简单的加密Java类库

1:添加依赖

    <dependency>
         <groupId>com.github.ulisesbocchio</groupId>
         <artifactId>jasypt-spring-boot-starter</artifactId>
         <version>3.0.4</version>
    </dependency>

2:添加配置文件

jasypt:
  encryptor:
    property:
      prefix: "aaa["
      suffix: "]"
    password: syl

Jsstpt加密的默认格式是ENC[数据],上面配置文件更改格式为:aaa[数据]。该值主要是看数据是不是需要加密/解密。

下面的password是必须的,相当于盐,加密解密都需要用到。

3:加密 / 解密

Java中使用只需要注入一个 StringEncryptor 类即可使用。

 这个只是测试。真正使用不需要写这样的接口。

如此,我们就可以实现一个密码的加密及解密。


四:DruidDataSource、存储过程调用

Druid是阿里的一个数据源连接池的实现,结合了C3p0,Dbcp等DB连接池的优点,并且加入了日志监控等功能,Druid可以很好的监控DB连接池和SQL执行情况。

DruidDataSource是阿里的一个数据源, 它不仅可以获取数据库连接,还把这些数据库连接管理了起来,也就是所谓的数据库连接池。

1:获取连接

 *****上面则是设置数据库连接驱动、url、账号密码等。

注意:密码是上面讲的jasypt加密。需要进行解密。

*****下面则是一些连接相关的参数。

注意:druid连接失败后,默认一直重试,这会导致数据库错误次数过多锁定的情况。

贴一个大佬发的连接机制:

          while(true) {
                try {
                    DruidDataSource.this.lock.lockInterruptibly();
                } catch (InterruptedException var28) {
                    break;
                }
               
 省略N行-----
                    if (emptyWait && DruidDataSource.this.asyncInit && DruidDataSource.this.createCount < (long)DruidDataSource.this.initialSize) {
                        emptyWait = false;
                    }

我就被这个坑了,一开始没有处理,直接导致数据库被锁。所以我们需要取消它的自动重试。

当然还是根据业务需求,选择合适的重试次数,不让他一直重试即可。

2:存储过程调用

 调用prepareCall方法调用存储过程,语句两边需要加括号。最后execute执行即可。

注意:execute执行返回的boolean值并不是成功失败,而是表示执行的是哪种语句。返回值为true时,表示执行的是查询语句,可以通过getResultSet方法获取结果;返回值为false时,执行的是更新语句或DDL语句。所以不要用结果判断成功失败。换个思路,不报错不就是成功吗哈哈。

3:关闭连接

最后,大家记得关闭连接。虽然占用内存不多,可养成习惯总是好的。节约内存。


OK,到此结束。动态数据源切换,Oracle存储过程调用就讲完了。希望能够帮助到大家,觉得可以的话麻烦点个赞鼓励下。如果哪里有纰漏,欢迎大家指正交流。拜拜~🐱

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值