
点击蓝字关注我们
上篇我们介绍了使用EPRS(EDB Postgres Replication Server)实现数据库在线升级,EPRS与库的连接就是通过EDB JDBC进行连接的,本篇我们专门介绍一下EDB JDBC连接EPAS数据库。
EDB JDBC 连接器将 Java 应用程序连接到 Postgres 数据库.
JDBC 驱动程序类型
目前有四种类型的 JDBC 驱动程序,每种都有自己的实现、使用和限制。EDB JDBC 连接器是类型 4 驱动程序。
Type 1 driver
该驱动程序类型是JDBC-ODBC桥。
它仅限于本地运行。
计算机上必须安装 ODBC。
算机上必须安装特定数据库的ODBC驱动程序。
由于本机方法调用,通常无法在applet内运行。
Type 2 driver
这是本地数据库库驱动程序。
使用计算机上的本机数据库library来访问数据库。
由于本机方法调用,通常无法在applet内运行。
客户端必须安装数据库。
Type 3 driver
100% Java 驱动程序,非本地的(native)方法。
不需要在客户端上预安装。
可以像任何 Java 类文件一样即时下载和配置。
使用专有协议与中间件服务器通信。
中间件服务器将专有调用转换为 DBMS 特定调用。
Type 4 driver
100% Java 驱动程序,非本地的(native)方法。
不需要在客户端上预安装。
可以像任何 Java 类文件一样即时下载和配置。
与 Type 3 驱动程序不同,它直接与 DBMS 服务器对话。
将 JDBC 调用直接转换为数据库特定的调用。
JDBC 接口
下图显示了 JDBC 规范中的核心 API 接口以及它们之间的关系。这些接口在java.sql包中实现。

JDBC 类和接口
核心API由类和接口组成。这些类和接口协同工作,如图所示:

JDBC 驱动管理器
下图描述了DriverManager类在典型JDBC应用程序中的角色。DriverManager充当Java应用程序和后端数据库之间的桥梁,并确定用于目标数据库的JDBC驱动程序。

EDB Postgres Advanced Server JDBC连接器兼容性
EDB jdbc Connector v42.7.3.2是目前的jdbc版本。除非有特殊要求(运行旧应用程序或JVM),否则应该使用此驱动程序。该驱动程序支持PostgreSQL 10或更高版本,并需要Java 8或更高版本。它包含对SSL和 javax.sql 包的支持。
Note:当前版本不再支持 Java 1.6 和 1.7。之前版本的EDB JDBC Connector v42.2.12.3将继续支持Java 1.6和1.7版本。
安装 Java 和 EDB JDBC
sudo dnf -y install javasudo dnf -y install edb-jdbcsudo dnf -y install java-11-openjdksudo dnf -y install java-devel[nuser@epas-1 ~]$ java -version
openjdk version "11.0.22" 2024-01-16 LTSOpenJDK Runtime Environment (Red_Hat-11.0.22.0.7-2.0.1) (build 11.0.22+7-LTS)OpenJDK 64-Bit Server VM (Red_Hat-11.0.22.0.7-2.0.1) (build 11.0.22+7-LTS, mixed mode, sharing)
如果显示是1.8.0
可以通过以下命令修改系统所有java版本。
sudo update-alternatives --config java
# select 2),java-11-openjdk.x86_64
以下示例是使用以下OS、Java 和 EDB JDBC 包执行的:
[nuser@epas-1 ~]$ cat etc/oracle-release
Oracle Linux Server release 8.5
[nuser@epas-1 ~]$ sudo dnf list installed |grep "java\|jdbc"
edb-jdbc.noarch 42.7.3.2-1.el8 @enterprisedb-enterprise-noarchjava-1.8.0-openjdk.x86_64 1:1.8.0.432.b06-2.0.1.el8 @ol8_appstreamjava-1.8.0-openjdk-headless.x86_64 1:1.8.0.432.b06-2.0.1.el8 @ol8_appstreamjava-11-openjdk.x86_64 1:11.0.22.0.7-2.0.1.el8 @ol8_appstreamjava-11-openjdk-devel.x86_64 1:11.0.22.0.7-2.0.1.el8 @ol8_appstreamjava-11-openjdk-headless.x86_64 1:11.0.22.0.7-2.0.1.el8 @ol8_appstreamjavapackages-filesystem.noarch 5.3.0-2.module+el8+5206+de031079 @ol8_codeready_buildertzdata-java.noarch 2024b-4.0.1.el8 @ol8_appstream
[nuser@epas-15 bin]$ java -version
openjdk version "1.8.0_432"OpenJDK Runtime Environment (build 1.8.0_432-b06)OpenJDK 64-Bit Server VM (build 25.432-b06, mixed mode)
select 示例
7.1 创建 Java 文件
$ vi jdbc_select.java
import java.sql.*;public class JDBC_select {public static void main(String[] args) {try {// 加载 EDB JDBC 驱动Class.forName("com.edb.Driver");// 数据库连接参数String url = "jdbc:edb://192.168.31.101:5444/edb";String user = "enterprisedb";String password = "enterprisedb";// 建立连接Connection con = DriverManager.getConnection(url, user, password);// 创建 SQL 语句Statement stmt = con.createStatement();// 执行查询ResultSet rs = stmt.executeQuery("SELECT * FROM emp");// 获取列数和列名ResultSetMetaData rsMetaData = rs.getMetaData();int columnCount = rsMetaData.getColumnCount();// 打印列名for (int i = 1; i <= columnCount; i++) {System.out.print(rsMetaData.getColumnName(i) + "\t");}System.out.println();// 遍历结果集并打印每行数据while (rs.next()) {for (int i = 1; i <= columnCount; i++) {System.out.print(rs.getString(i) + "\t");}System.out.println();}// 关闭资源rs.close();stmt.close();con.close();System.out.println("Command successfully executed");} catch (ClassNotFoundException e) {System.out.println("Class Not Found: " + e.getMessage());} catch (SQLException exp) {System.out.println("SQL Exception: " + exp.getMessage());System.out.println("SQL State: " + exp.getSQLState());System.out.println("Vendor Error: " + exp.getErrorCode());}}}
其中的连接信息不必多说,一看就明白。
编辑 ResultSet rs ,将 SQL 查询SELECT * FROM emp替换为所需的查询。
7.2 查找.jar文件位置
$ find usr /opt -type f -name 'edb-jdbc*.jar'
/usr/edb/jdbc/edb-jdbc18.jar
7.3 执行EDB JDBC程序
运行以下命令,插入 .jar 路径:
[nuser@epas-1 jdbc]$ java -cp /usr/edb/jdbc/edb-jdbc.jar jdbc_select.java
empno ename job mgr hiredate sal comm deptno7369 SMITH CLERK 7902 1980-12-17 00:00:00 800.00 null 207499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600.00 300.00 307521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250.00 500.00 307566 JONES MANAGER 7839 1981-04-02 00:00:00 2975.00 null 207654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250.00 1400.00 307698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850.00 null 307782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450.00 null 107788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000.00 null 207839 KING PRESIDENT null 1981-11-17 00:00:00 5000.00 null 107844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500.00 0.00 307876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100.00 null 207900 JAMES CLERK 7698 1981-12-03 00:00:00 950.00 null 307902 FORD ANALYST 7566 1981-12-03 00:00:00 3000.00 null 207934 MILLER CLERK 7782 1982-01-23 00:00:00 1300.00 null 10Command successfully executed
Update示例
8.1 创建java程序
$ vi jdbc_update.java
import java.sql.*;public class JDBC_update {public static void main(String[] args) {try {// 加载 EDB JDBC 驱动Class.forName("com.edb.Driver");// 数据库连接参数String url = "jdbc:edb://192.168.31.101:5444/edb";String user = "enterprisedb";String password = "enterprisedb";// 建立连接Connection con = DriverManager.getConnection(url, user, password);// 更新语句String updateQuery = "UPDATE emp SET sal = ? WHERE empno = ? AND sal = ?";// 创建 PreparedStatementPreparedStatement pstmt = con.prepareStatement(updateQuery);// 设置参数pstmt.setDouble(1, 2300); // 新薪水pstmt.setInt(2, 7934); // 员工编号pstmt.setDouble(3, 1300); // 当前薪水// 执行更新int rowsUpdated = pstmt.executeUpdate();// 检查更新结果if (rowsUpdated > 0) {System.out.println("Employee's salary updated successfully.");} else {System.out.println("No matching record found, or salary is not1300.");}// 关闭资源pstmt.close();con.close();} catch (ClassNotFoundException e) {System.out.println("Class Not Found: " + e.getMessage());} catch (SQLException exp) {System.out.println("SQL Exception: " + exp.getMessage());System.out.println("SQL State: " + exp.getSQLState());System.out.println("Vendor Error: " + exp.getErrorCode());}}}
修改 empno 号为7934的员工薪水为2300
8.2 执行java程序
运行以下命令,插入 .jar 路径:
[nuser@epas-1 jdbc]$ java -cp /usr/edb/jdbc/edb-jdbc.jar jdbc_update.java
Employee's salary updated successfully.
alter 数据
9.1 创建java程序
该文件会更改数据库中的数据,从而更改用户的密码。
$ vi jdbc_alter.java
import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public class jdbc_alter {public static void main(String[] args) {Connection c = null;Statement stmt = null;try {// 加载 EDB 驱动Class.forName("com.edb.Driver");// 连接到数据库cDriverManager.getConnection("jdbc:edb://192.168.31.101:5444/edb","enterprisedb", "enterprisedb");// 设置自动提交为 falsec.setAutoCommit(false);System.out.println("Successfully Connected.");// 创建 Statementstmt = c.createStatement();// 执行 ALTER ROLE 语句String sql = "ALTER ROLE test PASSWORD 'test4321'";stmt.executeUpdate(sql);// 提交事务c.commit();System.out.println("Password updated successfully.");} catch (Exception e) {// 捕获异常并打印错误信息System.err.println(e.getClass().getName() + ": " + e.getMessage());// 如果发生异常,回滚事务try {if (c != null) {c.rollback();}} catch (Exception rollbackEx) {System.err.println("Rollback failed: " + rollbackEx.getMessage());}} finally {try {// 关闭资源if (stmt != null) stmt.close();if (c != null) c.close();} catch (Exception closeEx) {System.err.println("Failed to close resources: " + closeEx.getMessage());}}}}
9.2 设置 CLASSPATH
为什么使用EDB JDBC,我们设置CLASSPATH环境变量。
export CLASSPATH=/usr/edb/jdbc/edb-jdbc18.jar:.echo $CLASSPATH
验证设置生效。
9.3 编译
执行javac对java程序进行编译
javac jdbc_alter.java
生成编译类文件jdbc_alter.class
9.4 执行文件
在当前目录下执行
[nuser@epas-1 jdbctest]$ java jdbc_alter
Successfully Connected.Password updated successfully.
关于公司
感谢您关注新智锦绣科技(北京)有限公司!作为 Elastic 的 Elite 合作伙伴及 EnterpriseDB 在国内的唯一代理和服务合作伙伴,我们始终致力于技术创新和优质服务,帮助企业客户实现数据平台的高效构建与智能化管理。无论您是关注 Elastic 生态系统,还是需要 EnterpriseDB 的支持,我们都将为您提供专业的技术支持和量身定制的解决方案。
欢迎关注我们,获取更多技术资讯和数字化转型方案,共创美好未来!
![]() | ![]() |
Elastic 微信群 | EDB 微信群 |

发现“分享”和“赞”了吗,戳我看看吧






