云服务器内容精选

  • 加载驱动 在创建数据库连接之前,需要先加载数据库驱动程序。 加载驱动有两种方法: 在代码中创建连接之前任意位置隐含装载:Class.forName("com.huawei.gaussdb.jdbc.Driver");。 在JVM启动时参数传递:java -Djdbc.drivers=com.huawei.gaussdb.jdbc.Driver jdbctest。 上述jdbctest为测试用例程序的名称。 父主题: 基于JDBC开发
  • 环境类 客户端需配置JDK1.8。JDK是跨平台的,支持Windows、Linux等多种平台,下面以Windows为例,配置方法如下: DOS窗口(windows下的命令提示符)输入“java -version”,查看JDK版本,确认为JDK1.8版本。如果未安装JDK,请从官方网站下载安装包并安装。 根据如下步骤配置系统环境变量。 右键单击“我的电脑”,选择“属性”。 在“系统”页面左侧导航栏单击“高级系统设置”。 在“系统属性”页面,“高级”页签上单击“环境变量”。 在“环境变量”页面上,“系统变量”区域单击“新建”或“编辑”配置系统变量。变量说明如表1所示。 表1 变量说明 变量名 操作 变量值 JAVA_HOME 若存在,则单击“编辑”。 若不存在,则单击“新建”。 JAVA的安装目录。 例如:C:\Program Files\Java\jdk1.8.0_131。 Path 单击“编辑”。 若配置了JAVA_HOME,则在变量值的最前面加上: %JAVA_HOME%\bin。 若未配置JAVA_HOME,则在变量值的最前面加上 JAVA安装的全路径: C:\Program Files\Java\jdk1.8.0_131\bin。 CLASSPATH 单击“新建”。 %JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar。
  • 示例3 常用数据类型使用 // 前置操作。 String createsql = "create table if not exists t_bit(col_bit bit)"; Statement stmt = conn.createStatement(); stmt.execute(createsql); stmt.close(); // bit类型使用示例,注意此处bit类型取值范围[0,1]。 Statement st = conn.createStatement(); String sqlstr = "create or replace function fun_1()\n" + "returns bit AS $$\n" + "select col_bit from t_bit limit 1;\n" + "$$\n" + "LANGUAGE SQL;"; st.execute(sqlstr); CallableStatement c = conn.prepareCall("{ ? = call fun_1() }"); // 注册输出类型,位串类型。 c.registerOutParameter(1, Types.BIT); c.execute(); // 使用Boolean类型获取结果。 System.out.println(c.getBoolean(1)); // float8类型使用示例。 st.execute("create table if not exists t_float(col1 float8)"); PreparedStatement pstm = conn.prepareStatement("insert into t_float values(?)"); pstm.setDouble(1,123456.123); pstm.execute(); pstm.close(); // 函数返回值为float8的使用示例。 st.execute("create or replace function func_float() " + "return float8 " + "as declare " + "var1 float8; " + "begin " + " select col1 into var1 from t_float limit 1; " + " return var1; " + "end;"); CallableStatement cs = conn.prepareCall("{? = call func_float()}"); cs.registerOutParameter(1,Types.DOUBLE); cs.execute(); System.out.println(cs.getDouble(1)); st.close();
  • 示例4 数据库连接监控功能使用 此示例将演示如何使用JDBC驱动的连接监控功能。 // 以下用例以gaussdbjdbc.jar为例。 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBMonitorTest { // 创建数据库连接。 public static void main(String[] args){ String driver = "com.huawei.gaussdb.jdbc.Driver"; String username = System.getenv("EXAMPLE_USERNAME_ENV"); String passwd = System.getenv("EXAMPLE_PASSWORD_ENV"); String sourceURL = "jdbc:gaussdb://$ip:$port/database?dbMonitor=true&loggerLevel=debug&loggerFile=dbMonitor.log"; try { // 加载数据库驱动。 Class.forName(driver).newInstance(); } catch (Exception e) { e.printStackTrace(); } Connection conn = null; Statement statement = null; try { // 创建数据库连接。 conn = DriverManager.getConnection(sourceURL, username, passwd); // 创建表。 statement = conn.createStatement(); String createTableQuery = "CREATE TABLE IF NOT EXISTS mytable (id INT PRIMARY KEY, name VARCHAR(50))"; statement.executeUpdate(createTableQuery); // 插入数据。 String insertQuery = "INSERT INTO mytable (id, name) VALUES (1, 'John')"; statement.executeUpdate(insertQuery); // 查询数据。 String selectQuery = "SELECT * FROM mytable "; ResultSet resultSet = statement.executeQuery(selectQuery); while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("id: " + id + ", name: " + name); } // 删除表。 String dropTableQuery = "DROP TABLE IF EXISTS mytable"; statement.executeUpdate(dropTableQuery); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (statement != null) { statement.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } try { Thread.sleep(10000); } catch (InterruptedException e) { throw new RuntimeException(e); } } } 在日志文件dbMonitor.log中可以看到输出的连接监控信息,具体包括: Nov 23, 2023 10:30:54 AM com.huawei.gaussdb.jdbc.qos.DataProcess saveQosResult FINE: { "Destination host:port" : "localhost:8000",--服务器的IP和端口。 "Delay" : "1.00 ms",--网络时延。 "Jitter" : "0.04ms",--网络抖动。 "Loss" : "0%",--网络丢包率。 "DownloadSpeed" : "0.395Mbps",--网络下行速率。 "UpLoadSpeed" : "0.498Mbps"--网络上行速率。 } Nov 23, 2023 10:30:56 AM com.huawei.gaussdb.jdbc.CollectDBData saveCollectResult FINE: { "openCount": "1",--应用开启数据库连接的次数。 "closeCount": "1",--应用关闭数据库连接的次数。 "abortedCount": "0",--连接异常断开的次数。 "visitCount": "12",--应用对数据库的访问量。 "cpuUsage": "20.39%",--客户端机器CPU的使用率。 "memoryUsage": "98.32%"--客户端机器内存的使用率。 }
  • 示例3 常用数据类型使用示例 // 前置操作。 String createsql = "create table if not exists t_bit(col_bit bit, col_bit1 int)"; Statement stmt = conn.createStatement(); stmt.execute(createsql); stmt.close(); // bit类型使用示例,注意此处bit类型取值范围[0,1]。 Statement st = conn.createStatement(); String sqlstr = "create or replace function fun_1()\n" + "returns bit AS $$\n" + "select col_bit from t_bit limit 1;\n" + "$$\n" + "LANGUAGE SQL;"; st.execute(sqlstr); CallableStatement c = conn.prepareCall("{ ? = call fun_1() }"); // 注册输出类型,位串类型。 c.registerOutParameter(1, Types.BIT); c.execute(); // 使用Boolean类型获取结果。 System.out.println(c.getBoolean(1)); // float8类型使用示例。 st.execute("create table if not exists t_float(col1 float8,col2 int)"); PreparedStatement pstm = conn.prepareStatement("insert into t_float values(?)"); pstm.setDouble(1,123456.123); pstm.execute(); pstm.close(); // 函数返回值为float8的使用示例。 st.execute("create or replace function func_float() " + "return float8 " + "as declare " + "var1 float8; " + "begin " + " select col1 into var1 from t_float limit 1; " + " return var1; " + "end;"); CallableStatement cs = conn.prepareCall("{? = call func_float()}"); cs.registerOutParameter(1,Types.DOUBLE); cs.execute(); System.out.println(cs.getDouble(1)); st.close();
  • 示例4 数据库连接监控功能使用示例 此示例将演示如何使用JDBC驱动的连接监控功能。 // 以下用例以gaussdbjdbc.jar为例。 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBMonitorTest { // 创建数据库连接。 public static void main(String[] args){ String driver = "com.huawei.gaussdb.jdbc.Driver"; String username = System.getenv("EXAMPLE_USERNAME_ENV"); String passwd = System.getenv("EXAMPLE_PASSWORD_ENV"); String sourceURL = "jdbc:gaussdb://$ip:$port/database?dbMonitor=true&loggerLevel=debug&loggerFile=dbMonitor.log"; try { // 加载数据库驱动。 Class.forName(driver).newInstance(); } catch (Exception e) { e.printStackTrace(); } Connection conn = null; Statement statement = null; try { // 创建数据库连接。 conn = DriverManager.getConnection(sourceURL, username, passwd); // 创建表。 statement = conn.createStatement(); String createTableQuery = "CREATE TABLE IF NOT EXISTS mytable (id INT PRIMARY KEY, name VARCHAR(50))"; statement.executeUpdate(createTableQuery); // 插入数据。 String insertQuery = "INSERT INTO mytable (id, name) VALUES (1, 'John')"; statement.executeUpdate(insertQuery); // 查询数据。 String selectQuery = "SELECT * FROM mytable "; ResultSet resultSet = statement.executeQuery(selectQuery); while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("id: " + id + ", name: " + name); } // 删除表。 String dropTableQuery = "DROP TABLE IF EXISTS mytable"; statement.executeUpdate(dropTableQuery); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (statement != null) { statement.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } try { Thread.sleep(10000); } catch (InterruptedException e) { throw new RuntimeException(e); } } } 在日志文件dbMonitor.log中可以看到输出的连接监控信息,具体包括: Nov 23, 2023 10:30:54 AM com.huawei.gaussdb.jdbc.qos.DataProcess saveQosResult FINE: { "Destination host:port" : "localhost:8000",--服务器的IP和端口。 "Delay" : "1.00 ms",--网络时延。 "Jitter" : "0.04ms",--网络抖动。 "Loss" : "0%",--网络丢包率。 "DownloadSpeed" : "0.395Mbps",--网络下行速率。 "UpLoadSpeed" : "0.498Mbps"--网络下行速率。 } Nov 23, 2023 10:30:56 AM com.huawei.gaussdb.jdbc.CollectDBData saveCollectResult FINE: { "openCount": "1",--应用开启数据库连接的次数。 "closeCount": "1",--应用关闭数据库连接的次数。 "abortedCount": "0",--连接异常断开的次数。 "visitCount": "12",--应用对数据库的访问量。 "cpuUsage": "20.39%",--客户端机器CPU的使用率。 "memoryUsage": "98.32%"--客户端机器内存的使用率。 }
  • JDBC数据类型映射关系 数据类型、JAVA变量类型以及JDBC类型索引关系如下(ORA:Oracle兼容,MYSQL:MySQL兼容): 兼容模式 GaussDB数据类型 JAVA变量类型 JDBC类型索引 ORA/MYSQL oid java.lang.Long java.sql.Types.BIGINT ORA/MYSQL numeric java.math.BigDecimal java.sql.Types.NUMERIC ORA/MYSQL tinyint java.lang.Integer java.sql.Types.TINYINT ORA/MYSQL smallint java.lang.Integer java.sql.Types.SMALLINT ORA/MYSQL bigint java.lang.Long java.sql.Types.BIGINT ORA/MYSQL float4 java.lang.Float java.sql.Types.REAL ORA/MYSQL float8 java.lang.Double java.sql.Types.DOUBLE ORA/MYSQL char java.lang.String java.sql.Types.CHAR ORA/MYSQL character java.lang.String java.sql.Types.CHAR ORA/MYSQL bpchar java.lang.String java.sql.Types.CHAR ORA/MYSQL character varying java.lang.String java.sql.Types.VARCHAR ORA/MYSQL varchar java.lang.String java.sql.Types.VARCHAR ORA/MYSQL text java.lang.String java.sql.Types.VARCHAR ORA/MYSQL name java.lang.String java.sql.Types.VARCHAR ORA/MYSQL bytea byte[] java.sql.Types.BINARY ORA/MYSQL blob java.sql.Blob java.sql.Types.BLOB ORA/MYSQL clob java.sql.Clob java.sql.Types.CLOB ORA/MYSQL boolean java.lang.Boolean java.sql.Types.BIT MYSQL date java.sql.Date java.sql.Types.DATE ORA/MYSQL time java.sql.Time java.sql.Types.TIME ORA/MYSQL timetz java.sql.Time java.sql.Types.TIME ORA/MYSQL timestamp java.sql.Timestamp java.sql.Types.TIMESTAMP ORA/MYSQL smalldatetime java.sql.Timestamp java.sql.Types.TIMESTAMP ORA/MYSQL timestamptz java.sql.Timestamp java.sql.Types.TIMESTAMP ORA/MYSQL refcursor java.sql.ResultSet java.sql.Types.REF_CURSOR java.sql.Types.OTHER -10 父主题: 基于JDBC开发
  • 示例:通过本地文件导入导出数据 在使用JAVA语言基于GaussDB进行二次开发时,可以使用CopyManager接口,通过流方式,将数据库中的数据导出到本地文件或者将本地文件导入数据库中,文件支持CSV、TEXT等格式。 示例如下,执行时需要加载GaussDB JDBC驱动,驱动的获取和加载方法请参见JDBC包、驱动类和环境类。 前置条件:在数据库中创建表migration_table和migration_table_1,并在migration_table表中插入数据。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 import java.sql.Connection; import java.sql.DriverManager; import java.io.IOException; import java.io.FileInputStream; import java.io.FileOutputStream; import java.sql.SQLException; import com.huawei.gaussdb.jdbc.copy.CopyManager; import com.huawei.gaussdb.jdbc.core.BaseConnection; public class Copy{ public static void main(String[] args) { String urls = new String("jdbc:gaussdb://$ip:$port/database"); //数据库URL String username = System.getenv("EXAMPLE_USERNAME_ENV"); //用户名 String password = System.getenv("EXAMPLE_PASSWORD_ENV"); //密码 String tablename = new String("migration_table"); //定义表信息 String tablename1 = new String("migration_table_1"); //定义表信息 String driver = "com.huawei.gaussdb.jdbc.Driver"; Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(urls, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(System.out); } catch (SQLException e) { e.printStackTrace(System.out); } // 将SELECT * FROM migration_table查询结果导出到本地文件d:/data.txt中。 try { copyToFile(conn, "d:/data.txt", "(SELECT * FROM migration_table)"); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //将d:/data.txt中的数据导入到migration_table_1中。 try { copyFromFile(conn, "d:/data.txt", tablename1); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 将migration_table_1中的数据导出到本地文件d:/data1.txt中。 try { copyToFile(conn, "d:/data1.txt", tablename1); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // 使用copyIn把数据从文件中导入数据库。 public static void copyFromFile(Connection connection, String filePath, String tableName) throws SQLException, IOException { FileInputStream fileInputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileInputStream = new FileInputStream(filePath); copyManager.copyIn("COPY " + tableName + " FROM STDIN", fileInputStream); } finally { if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } // 使用copyOut把数据从数据库中导出到文件中。 public static void copyToFile(Connection connection, String filePath, String tableOrQuery) throws SQLException, IOException { FileOutputStream fileOutputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileOutputStream = new FileOutputStream(filePath); copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT", fileOutputStream); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 父主题: 基于JDBC开发
  • 在语句中添加单分片执行语法 设置nodeName参数,通过调用Connection对象的setClientInfo("nodeName","dnx")。 Connection conn = getConnection(); conn.setClientInfo("nodeName","datanode1"); 执行SQL语句,其中包括使用Statement对象的executeQuery(String sql)和execute(String sql)以及PreparedStatement对象的executeQuery()和execute()方法。 PreparedStatement pstm = conn.prepareStatement("select * from test"); pstm.execute(); pstm.executeQuery(); Statement stmt=conn.createStatement(); stmt.execute("select * from test"); stmt.executeQuery("select * from test"); 关闭参数,将参数值设置为空字符串。 conn.setClientInfo("nodeName",""); 该功能是基于内核单分片执行功能进行的适配,所以使用前请确认使用的数据库内核是否支持单分片执行。 参数开启后一定要手动关闭参数,否则会对其他查询语句的执行产生影响。 参数一旦开启,当前连接所有的语句执行都会受到影响,到指定的DN上去执行。 参数开启后PreparedStatement对象的缓存机制会受到影响,已经缓存的语句会被清空,之后执行的带单分片查询的语句都不再缓存,直到参数关闭后缓存功能恢复。 参数为连接级参数,所以在同一时间只有一个参数会生效,无法通过此接口做到同一时间两条语句到不同的分片上去执行。
  • 执行批处理 用一条预处理语句处理多条相似的数据,数据库只创建一次执行计划,节省了语句的编译和优化时间。可以按如下步骤执行: 调用Connection的prepareStatement方法创建预编译语句对象。 1 2 3 4 5 6 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); Connection conn = DriverManager.getConnection("url",userName,password); PreparedStatement pstmt = conn.prepareStatement("INSERT INTO customer_t1 VALUES (?)"); 针对每条数据都要调用setShort设置参数,以及调用addBatch确认该条设置完毕。 1 2 pstmt.setShort(1, (short)2); pstmt.addBatch(); 调用PreparedStatement的executeBatch方法执行批处理。 1 int[] rowcount = pstmt.executeBatch(); 调用PreparedStatement的close方法关闭预编译语句对象。 1 pstmt.close(); 在实际的批处理过程中,通常不终止批处理程序的执行,否则会降低数据库的性能。因此在批处理程序时,应该关闭自动提交功能,每几行提交一次。关闭自动提交功能的语句为:conn.setAutoCommit(false)。
  • 调用存储过程 GaussDB支持通过JDBC直接调用事先创建的存储过程,步骤如下: 调用Connection的prepareCall方法创建调用语句对象。 1 2 3 4 5 6 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); Connection myConn = DriverManager.getConnection("url",userName,password); CallableStatement cstmt = myConn.prepareCall("{? = CALL TESTPROC(?,?,?)}"); 调用CallableStatement的setInt方法设置参数。 1 2 3 cstmt.setInt(2, 50); cstmt.setInt(1, 20); cstmt.setInt(3, 90); 调用CallableStatement的registerOutParameter方法注册输出参数。 1 cstmt.registerOutParameter(4, Types.INTEGER); //注册out类型的参数,类型为整型。 调用CallableStatement的execute方法调用。 1 cstmt.execute(); 调用CallableStatement的getInt方法获取输出参数。 1 int out = cstmt.getInt(4); //获取out参数 示例: 1 2 3 4 5 6 7 8 9 10 11 12 //在数据库中已创建了如下存储过程,它带有out参数。 create or replace procedure testproc ( psv_in1 in integer, psv_in2 in integer, psv_inout inout integer ) as begin psv_inout := psv_in1 + psv_in2 + psv_inout; end; / 调用CallableStatement的close方法关闭调用语句。 1 cstmt.close(); 很多数据库类如Connection、Statement和ResultSet都有close()方法,在使用完对象后应把它们关闭。Connection的关闭将间接关闭所有与它关联的Statement,Statement的关闭间接关闭了ResultSet。 一些JDBC驱动程序还提供命名参数的方法来设置参数。命名参数的方法允许根据名称而不是顺序来设置参数,若参数有默认值,则可以不用指定参数值就可以使用此参数的默认值。即使存储过程中参数的顺序发生了变更,也不必修改应用程序。目前GaussDB数据库的JDBC驱动程序不支持此方法。 GaussDB数据库不支持带有输出参数的函数,也不支持存储过程和函数参数默认值。 myConn.prepareCall("{? = CALL TESTPROC(?,?,?)}"),执行存储过程绑定参数时,可以按照占位符的顺序绑定参数,注册第一个参数为出参,也可以按照存储过程中的参数顺序绑定参数,注册第四个参数为出参,上述用例为此场景,注册第四个参数为出参。 当游标作为存储过程的返回值时,如果使用JDBC调用该存储过程,返回的游标将不可用。 存储过程不能和普通SQL在同一条语句中执行。 存储过程中inout类型参数必需注册出参。
  • 执行预编译SQL语句 预编译语句是只编译和优化一次,可以通过设置不同的参数值多次使用。由于已经预先编译好,后续使用会减少执行时间。因此,如果多次执行一条语句,请选择使用预编译语句。可以按以下步骤执行: 调用Connection的prepareStatement方法创建预编译语句对象。 1 PreparedStatement pstmt = con.prepareStatement("UPDATE customer_t1 SET c_customer_name = ? WHERE c_customer_sk = 1"); 调用PreparedStatement的setShort设置参数。 1 pstmt.setShort(1, (short)2); PrepareStatement设置绑定参数后,最终会构建成一个B报文或U报文,在下一步执行SQL语句时发给服务端。但是B报文或U报文有最大长度限制(不能超过1023MB),如果一次绑定数据过大,可能因报文过长导致异常。因此PrepareStatement设置绑定参数时需要注意评估和控制绑定数据的大小,避免出现超出报文上限要求的现象。 调用PreparedStatement的executeUpdate方法执行预编译SQL语句。 1 int rowcount = pstmt.executeUpdate(); 调用PreparedStatement的close方法关闭预编译语句对象。 1 pstmt.close();
  • 执行普通SQL语句 应用程序通过执行SQL语句来操作数据库的数据(不用传递参数的语句),需要按以下步骤执行。 支持对XML类型数据进行SELECT、UPDATE、INSERT、DELETE等操作。 调用Connection的createStatement方法创建语句对象。 1 2 3 4 5 6 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); Connection conn = DriverManager.getConnection("url",userName,password); Statement stmt = conn.createStatement(); 调用Statement的executeUpdate方法执行SQL语句。 1 int rc = stmt.executeUpdate("CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));"); 数据库中收到的一次执行请求(不在事务块中),如果含有多条语句,将会被打包成一个事务,事务块中不支持vacuum操作。如果其中有一个语句失败,那么整个请求都将会被回滚。 使用Statement执行多语句时应以“;”作为各语句间的分隔符,存储过程、函数、匿名块不支持多语句执行。当preferQueryMode=simple,语句执行不进行解析逻辑,此场景下无法使用";"作为多语句间的分隔符。 “/”可用作创建单个存储过程、函数、匿名块、包体的结束符。当preferQueryMode=simple,语句执行不进行解析逻辑,此场景下无法使用"/"作为结束符。 在prepareThreshold=1时,因为preferQueryMode默认模式不对statement进行缓存淘汰,所以statement执行的每条SQL都会缓存语句,可能导致内存膨胀。需要调整preferQueryMode=extendedCacheEverything,对statement进行缓存淘汰。 关闭语句对象。 1 stmt.close();
  • 关闭数据库连接 在使用数据库连接完成相应的数据操作后,需要关闭数据库连接。 关闭数据库连接可以直接调用close方法。 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); Connection conn = DriverManager.getConnection(sourceURL, userName, password); conn.close(); 父主题: 基于JDBC开发
  • 连接数据库(UDS方式) Unix domain socket用于同一主机上不同进程间的数据交换,通过添加junixsocket获取套接字工厂使用。 需要引用的jar包有junixsocket-core-XXX.jar、junixsocket-common-XXX.jar、junixsocket-native-common-XXX.jar。同时需要在URL连接串中添加:socketFactory=org.newsclub.net.unix.AFUNIXSocketFactory$FactoryArg&socketFactoryArg=[path-to-the-unix-socket]。 示例: // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.util.Properties; public class Test { public static void main(String[] args) { String driver = "com.huawei.gaussdb.jdbc.Driver"; String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); Connection conn; try { Class.forName(driver).newInstance(); Properties properties = new Properties(); properties.setProperty("user", userName); properties.setProperty("password", password); conn = DriverManager.getConnection("jdbc:gaussdb://$ip:$port/postgres?socketFactory=org.newsclub" + ".net.unix" + ".AFUNIXSocketFactory$FactoryArg&socketFactoryArg=/data/tmp/.s.PGSQL.8000", properties); System.out.println("Connection Successful!"); Statement statement = conn.createStatement(); statement.executeQuery("select 1"); } catch (Exception e) { e.printStackTrace(); } } } socketFactoryArg参数配置根据真实路径进行配置,与GUC参数unix_socket_directory的值保持一致。 连接主机名必须设置为“localhost”。 父主题: 基于JDBC开发