龙空技术网

用JAVA执行CMD命令备份PG数据库,解决需要口令的问题

怡和路恶霸 231

前言:

今天咱们对“java 数据库备份”大致比较重视,你们都需要分析一些“java 数据库备份”的相关资讯。那么小编在网络上网罗了一些关于“java 数据库备份””的相关知识,希望看官们能喜欢,同学们快快来了解一下吧!

最近要用JAVA做一个PostgreSQL的备份功能,没想到遇到一个大坑。

在网上搜索,很快就找到一个用JAVA的Runtime.getRuntime().exec()执行cmd命令来备份的方法。

执行代码后发现,没有导出对应的SQL文件。我觉得可能是命令有问题,于是我在cmd执行了这条命令,才发现问题所在。

原来是执行命令后还要输入数据密码的,这就是我说的那个大坑。

我马上就想到再用Runtime.getRuntime()执行一遍密码不就得了?但是结果果然不出所料,报错了。

于是又网上查,JAVA怎么执行交互式的cmd命令。让我查到可以获取上一个命令的OutputStream,然后用OutputStream写入密码。

于是把代码改成下面这样:

执行并没有报错,但是还是没有生成对应的SQL文件。

于是继续网上查,结果都找不到JAVA执行cmd备份PostgreSQL怎么来输入密码。

然后我决定转换思路,既然不知道怎么输入密码,那干脆查一下pg_dump免密码导出。果然找到了。那就是在环境变量里加上PGPASSWORD。

然后在cmd窗口执行导出命令,不用输入密码,成功导出。

但在很不幸,代码执行的时候,还是没有生成对应的SQL文件。难道是代码里执行不认这个环境变量?

本以为就一直卡在密码这里过不去了,没想到让我发现了另一个类ProcessBuilder。这个类也能执行cmd命令。于是把Runtime.getRuntime()全部换成ProcessBuilder。然后执行代码。

结果依然是那么的不出所料,没有生成对应的SQL文件。

不过幸好我鼠标多滚了两下,在ProcessBuilder类的API页面。被我看到了一个environment()方法。

就是environment()可以设置环境变量,于是我把刚刚的免密导出环境变量PGPASSWORD用ProcessBuilder类来设置。

然后执行代码,我对这次执行的结果并没抱多大希望。

但是结果依旧是那么的不出所料

导出成功了!

标签: #java 数据库备份 #java在cmd运行 #java数据库备份 #java口令