日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

各种语言如何连接到 OceanBase

發布時間:2023/12/16 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 各种语言如何连接到 OceanBase 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇文章想跟大家分享一下,各種主流開發語言如何連接到 OceanBase 社區版數據庫,進行日常開發。這個問題也是社區群里面問的比較多的一個問題之一,希望通過本篇文章,能給各位參與開發的小伙伴提供一些指導。

0. 前置條件

首先我們在 OceanBase test 數據庫中創建一個 t1 表,并向里面插入 2 條數據,用作后面所有語言的測試基礎表:

1. Java 數據庫連接驅動(JDBC)

首先上來肯定要說一下 Java,說 Java 是第一大應用開發語言應該不為過吧?OceanBase 社區版對 MySQL 5.7 的兼容性最好,所以您可以使用 MySQL 5.7 的 JDBC 包(建議使用 mysql-connector-java-5.1.47 版本,MySQL 5.7 對應的 JDBC 版本為 5.1.x),也可以使用 OceanBase 提供的自有 JDBC 包,下面我們分別用代碼演示一個簡單的示例。

Java 數據庫連接(JDBC)是一種 API,它使 Java 能夠將 SQL 語句發送到對象關系數據庫,如 Oracle、MySQL 數據庫。JDBC 支持為 Java 暴露 SQL 數據類型,并快速訪問 SQL 數據。

1.1 MySQL JDBC 連接 Demo

我們首先從 https://downloads.mysql.com/archives/c-j/ 下載對應的 5.1.47 的 jar 包,創建一個新的 Demo 項目,把剛才的 jar 包加載到類庫中,然后用最樸素的 Java 代碼執行增刪改查操作,如下:

import java.sql.*; public class JavaDemo {public static void main(String[] args) throws ClassNotFoundException,SQLException {//1.加載驅動Class.forName("com.mysql.jdbc.Driver");//固定寫法,加載驅動//2.用戶信息和urlString url="jdbc:mysql://10.211.55.73:2883/test?useUnicode=true&characterEncoding=utf8&&useSSL=true";String username = "root";String password = "observer";//3.連接成功,連接數據庫對象 ConnectionConnection connection = DriverManager.getConnection(url,username,password);//4.執行SQL對象 StatementStatement statement = connection.createStatement();//5.執行SQL可能存在的結果,查看返回的結果System.out.println("-------------------當前查詢到的數據如下-------------------");ResultSet resultSet = statement.executeQuery("SELECT * FROM t1");//返回的結果集,封裝了查詢出來的全部結果while(resultSet.next()) {System.out.println("id="+resultSet.getObject("id"));System.out.println("name="+resultSet.getObject("NAME"));}System.out.println("-------------------當前數據庫的行數如下-------------------");ResultSet curCount = statement.executeQuery("select count(*) from t1");while(curCount.next()) {System.out.println("當前數據庫有數據 "+curCount.getInt(1)+" 行!");}System.out.println("-------------------向該數據庫中插入數據-------------------");String insertSql = "insert into t1 values(3,'c')";statement.execute(insertSql);//返回的結果System.out.println("-------------------插入數據后的行數如下-------------------");ResultSet afinCount = statement.executeQuery("select count(*) from t1");while(afinCount.next()) {System.out.println("當前數據庫有數據 "+afinCount.getInt(1)+" 行!");}System.out.println("-------------------嘗試更新插入進去的數據-------------------");Integer updCount = statement.executeUpdate("update t1 set id=4 where name='c'");System.out.println("更新了 "+updCount+" 行數據!");System.out.println("-------------------嘗試進行數據刪除-------------------");Boolean del = statement.execute("delete from t1 where name = 'c'");ResultSet afdelCount = statement.executeQuery("select count(*) from t1");while(afdelCount.next()) {System.out.println("當前數據庫有數據 "+afdelCount.getInt(1)+" 行!");}//6.釋放連接resultSet.close();statement.close();connection.close();} }

執行結果也一目了然,沒問題:

1.2 OB 自研 JDBC 連接 Demo

OceanBase 官方提供了自研的 JDBC 包,名字叫做:oceanbase-client-1.1.10.jar。選用這個包的話,整體的操作方法跟 1.1 部分類似,主要區別為驅動加載和 url 部分的定義

//1.加載驅動Class.forName("com.alipay.oceanbase.jdbc.Driver");//固定寫法,加載驅動//2.用戶信息和urlString url="jdbc:oceanbase://10.211.55.73:2883/test";

按照慣例來說,官方自研的 JDBC 驅動在性能和語法兼容性上肯定會更好,當然我沒有真正測過性能,大家可以自己測測試試。下面是一個完整 Demo 的增刪改查代碼:

import java.sql.*;public class JavaOBDemo {public static void main(String[] args) throws ClassNotFoundException,SQLException {//1.加載驅動Class.forName("com.alipay.oceanbase.jdbc.Driver");//固定寫法,加載驅動//2.用戶信息和urlString url="jdbc:oceanbase://10.211.55.73:2883/test";String username = "root";String password = "observer";//3.連接成功,連接數據庫對象 ConnectionConnection connection = DriverManager.getConnection(url,username,password);//4.執行SQL對象 StatementStatement statement = connection.createStatement();//5.執行SQL可能存在的結果,查看返回的結果System.out.println("-------------------當前查詢到的數據如下-------------------");ResultSet resultSet = statement.executeQuery("SELECT * FROM t1");//返回的結果集,封裝了查詢出來的全部結果while(resultSet.next()) {System.out.println("id="+resultSet.getObject("id"));System.out.println("name="+resultSet.getObject("NAME"));}System.out.println("-------------------當前數據庫的行數如下-------------------");ResultSet curCount = statement.executeQuery("select count(*) from t1");while(curCount.next()) {System.out.println("當前數據庫有數據 "+curCount.getInt(1)+" 行!");}System.out.println("-------------------向該數據庫中插入數據-------------------");String insertSql = "insert into t1 values(3,'c')";statement.execute(insertSql);//返回的結果System.out.println("-------------------插入數據后的行數如下-------------------");ResultSet afinCount = statement.executeQuery("select count(*) from t1");while(afinCount.next()) {System.out.println("當前數據庫有數據 "+afinCount.getInt(1)+" 行!");}System.out.println("-------------------嘗試更新插入進去的數據-------------------");Integer updCount = statement.executeUpdate("update t1 set id=4 where name='c'");System.out.println("更新了 "+updCount+" 行數據!");System.out.println("-------------------嘗試進行數據刪除-------------------");Boolean del = statement.execute("delete from t1 where name = 'c'");ResultSet afdelCount = statement.executeQuery("select count(*) from t1");while(afdelCount.next()) {System.out.println("當前數據庫有數據 "+afdelCount.getInt(1)+" 行!");}//6.釋放連接resultSet.close();statement.close();connection.close();} }

有關 OB 自研 JDBC 的參數調優,請參考官方文檔:https://open.oceanbase.com/docs/observer-cn/V3.1.4/10000000000450598

1.3 對常用框架的支持

這也是個經常被問到的問題,我在社區群中不止一次看到有人問 OceanBase 對通用框架/連接池支持怎么樣?大家想想,OB 在阿里內部及很多企業級客戶都有很深入的應用了,對通用框架的支持已經不會是一個大問題了,簡言之:支持的很不錯。下面我列舉幾個官方給出的常用框架支持方式,供大家參考:

1.3.1 MyBatis 連接示例

MyBatis 作為一款應用量排名靠前的框架,深受大家的喜愛。下面給出了一些常用的配置信息,供您參考:

配置依賴

<dependency><groupId>com.alipay.oceanbase</groupId><artifactId>oceanbase-client</artifactId><version>3.2.3</version> </dependency> <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.4</version> </dependency>

mybatis-config.xml 配置文件

<?xml version="1.0" encoding="UTF8"?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.alipay.oceanbase.jdbc.Driver"/><property name="url" value="jdbc:oceanbase://10.100.xxx.xxx:18817/test?useUnicode=true&amp;characterEncoding=utf-8&amp;useServerPrepStmts=false&amp;useCursorFetch=true"/><property name="username" value="admin@mysql"/><property name="password" value="admin"/></dataSource></environment></environments><!--注冊mapper(mapper.xml所在地址)--><mappers><mapper resource="com/test/UserMapper.xml"></mapper></mappers> </configuration>

mapper.xml 配置文件

<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--namespace 是mapper接口,不能填錯--> <mapper namespace="com.test.UserMapper"><select id="selectUser" resultType="com.test.User" fetchSize="40000">select * from user;</select><delete id="delete" >delete from user;</delete> </mapper>

1.3.2 HiKariCP 連接池配置示例

HiKariCP 以代碼輕量且速度非常快著稱,以下信息展示了 OceanBase 與該框架的集成方法:

配置依賴 pom.xml

<dependency><groupId>com.alipay.oceanbase</groupId><artifactId>oceanbase-client</artifactId><version>3.2.3</version> </dependency> <dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>3.3.1</version> </dependency>

配置文件 jdbc.properties

jdbcUrl=jdbc:oceanbase://10.100.xxx.xxx:18817/test?useSSL=false&useServerPrepStmts=true&serverTimezone=UTC username=admin@mysql password=admin dataSource.cachePrepStmts=true dataSource.prepStmtCacheSize=250 dataSource.prepStmtCacheSqlLimit=2048 dataSource.useServerPrepStmts=true dataSource.useLocalSessionState=true dataSource.rewriteBatchedStatements=true dataSource.cacheResultSetMetadata=true dataSource.cacheServerConfiguration=true dataSource.elideSetAutoCommits=true dataSource.maintainTimeStats=false

示例代碼

@Testpublic void hikariTest() throws SQLException {HikariConfig config = new HikariConfig("/jdbc.properties");Connection conn = new HikariDataSource(config).getConnection();PreparedStatement drop_table_data_test = conn.prepareStatement("drop table data_test");Statement stmt = conn.createStatement();try {drop_table_data_test.execute();} catch (SQLException e) {}conn.prepareStatement("create table data_test(test1 int)").execute();for (int i = 0; i <= 10; i++) {stmt.executeUpdate("insert into data_test values("+i+")");}ResultSet rs = conn.prepareStatement("select * from data_test;").executeQuery();while (rs.next()){System.out.print(rs.getObject(1)+"\t");}System.out.println();System.out.println("------------------------");stmt.executeUpdate("update data_test set test1 = 100;");ResultSet rs1 = conn.prepareStatement("select * from data_test;").executeQuery();while (rs1.next()){System.out.print(rs1.getObject(1)+"\t");}System.out.println();System.out.println("------------------------");stmt.executeUpdate("delete from data_test");ResultSet rs2 = stmt.executeQuery("select * from data_test;");if (!rs2.next()){System.out.println("數據刪除成功");}stmt.close();drop_table_data_test.execute();drop_table_data_test.close();rs.close();conn.close();}

1.3.3 SpringJDBC 連接示例

SpringJDBC 是老牌的持久層框架了,下面也來一個簡單的 Demo:

配置依賴

<dependency><groupId>com.alipay.oceanbase</groupId><artifactId>oceanbase-client</artifactId><version>3.2.3</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.0.9.RELEASE</version> </dependency>

示例代碼

預加載靜態代碼塊(為方便測試,此處使用 druid 連接池):

static {Map<String, String> map = new HashMap<String, String>();map.put("url", "jdbc:oceanbase://10.100.xxx.xxx:18815/test");map.put("driverClassName", "com.alipay.oceanbase.jdbc.Driver");map.put("username", "admin@mysql");map.put("password", "admin");try {Class.forName(map.get("driverClassName"));jdbcTemplate = new JdbcTemplate(DruidDataSourceFactory.createDataSource(map));//防止異常語句,沒有這兩句,會出錯jdbcTemplate.execute("set transaction_isolation = 'READ-COMMITTED';");jdbcTemplate.execute("set tx_isolation = 'READ-COMMITTED';");} catch (Exception e) {e.printStackTrace();} } @Testpublic void createByOrcTypeDate(){sql ="create table D_DPRECORD(DEV_ID VARCHAR2(50),"+"CAR_SPEED NUMBER(3),"+"CAP_DATE TIMESTAMP WITH LOCAL TIME ZONE," +"DEV_CHNID VARCHAR2(50) not null," +"TRSFMARK NUMBER(1) default 0," +"CREATE_TIME DATE default sysdate" +");";jdbcTemplate.execute(sql);} @Testpublic void addTest(){int i = 1;for (;i<=100;i++){sql = "insert into orc_type_test values ("+i+",'測試數據"+i+"');";jdbcTemplate.execute(sql);}} @Testpublic void selectTest(){sql = "select * from orc_type_test;";List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);for (Map<String,Object> m : maps){System.out.println(m);}} @Testpublic void rownumQueryTest() {sql = "select * from D_DPRECORD where rownum <=70 minus (select * from D_DPRECORD where rownum<60);";List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);for (Map<String, Object> m : maps) {System.out.println(m);}}

1.3.4 其他連接池和框架

這里引入介紹了部分內容,因為 Java 的連接池和框架太多了,所以為了保持篇幅不至于太冗長,不一一列舉了,如果大家對其他內容感興趣,歡迎參考官方文檔的《設計規范和約束》–> 《數據庫設計最佳實踐》中的連接池和框架部分。

2. C/C++ 語言數據庫連接驅動

OceanBase Connector/C 是一個基于 C/C++ 的 OceanBase 客戶端開發組件,支持 C API Lib 庫,我們通常也叫它 libobclient 。允許 C/C++ 程序以一種較為底層的方式訪問 OceanBase 分布式數據庫集群,以進行數據庫連接、數據訪問、錯誤處理和 Prepared Statement 處理等操作。當然您也可以使用 MySQL 官方的客戶端開發組件:MySQL C API。但是優先推薦采用 libobclient 進行開發。

2.1 安裝 libobclient

在使用該庫之前,我們需要先在對應的服務器上安裝,例如執行如下命令,從 OceanBase 遠程倉庫安裝,并復制一份到 lib64:

sudo yum install libobclient sudo cp -r /u01/obclient/lib/libobclnt.so.20 /usr/lib64/

2.2 C++ 語言 Demo

完成了上面的基礎庫安裝后,下面我們還是通過一個例子來展示如何編寫 C++ 代碼:

#include <iostream> #include <cstdio> #include <cstdlib> #include "mysql.h"using namespace std;void process_result_set(MYSQL *mysql, MYSQL_RES *result) {printf("row nums: %d\n", mysql_num_rows(result)); //獲取行數int j = mysql_num_fields(result);MYSQL_ROW row = mysql_fetch_row(result);// 輸出每行結果if (row) {for (int i = 0; i < j; i++) {printf("%s \n", row[i]);}if (mysql_errno(mysql)) {printf("retrive faile: %s\n", mysql_error(mysql));return;}} } int main() {mysql_library_init(0, NULL, NULL);MYSQL *mysql = mysql_init(NULL);char host[] = "10.211.55.73"; char user[] = "root";char passwd[] = "observer";char db[] = "test"; //沒有數據庫可以選擇NULLunsigned int port = 2883;// 使用obclient連接ob的方式如下// obclient -h123.10.12.123 -P2883 -uroot@sys -pobserver/* 使用 CLIENT_MULTI_STATEMENTS 選項連接服務器 (必選)*/if (mysql_real_connect (mysql, host, user, passwd,NULL, port, NULL, CLIENT_MULTI_STATEMENTS) == NULL){printf("mysql_real_connect() failed\n");mysql_close(mysql);mysql_library_end();exit(1);}/*執行多條語句 */int status = mysql_query(mysql,"show parameters like '%obconfig_url%';");if (status){printf("Could not execute statement(s), ret = %d\n", status);mysql_close(mysql);mysql_library_end();exit(0);}/* 處理每個語句的結果 */do {/* 當前語句是否返回數據? */MYSQL_RES* result = mysql_store_result(mysql);if (result){/* 是的; 則處理行并釋放結果集 */process_result_set(mysql, result); // 處理執行成功的語句mysql_free_result(result);}else /* 沒有結果集或報錯 */{if (mysql_field_count(mysql) == 0){printf("%lld rows affected\n",mysql_affected_rows(mysql));}else /* 發生報錯 */{printf("Could not retrieve result set\n");break;}}/* 是否有更多結果? -1 = 否,>0 = 報錯,0 = 是(繼續循環)*/if ((status = mysql_next_result(mysql)) > 0)printf("Could not execute statement\n");} while (status == 0);mysql_close(mysql);mysql_library_end();return 0; }

編譯執行返回的結果如下:

[chris@obd ~]$ g++ test.cpp -I /u01/obclient/include -L /u01/obclient/lib -lobclnt -o test [chris@obd ~]$ ./test row nums: 3 zone3 observer 10.211.55.76 2882 obconfig_url (null)URL for OBConfig service OBSERVER CLUSTER DEFAULT DYNAMIC_EFFECTIVE

4. Python 連接數據庫指南

Python 在很多場景下被大量使用,大家所熟知的 OceanBase Deployer,即 obd 也是用 Python 開發的。我們可以通過兩個不同的庫(Python 2 和 Python 3 有所區別)連接到 OceanBase。下面分別展開:

4.1 Python 3 連接方式

官方推薦在 Python 3 環境下,選用 PyMySQL 庫來連接 OceanBase,首先如果您本地沒有下載該庫,需要先執行 pip 進行安裝:

python3 -m pip install PyMySQL

安裝完成后,可以通過如下代碼進行數據庫訪問,主要就是注意 import 庫的導入:

import pymysqlconn = pymysql.connect(host="10.211.55.73", port=2883,user="root", passwd="observer", db="test")try:with conn.cursor() as cur:cur.execute('SELECT * FROM t1')rows = cur.fetchall()for row in rows:print(f'{row[0]} {row[1]}')finally:conn.close()

執行如上代碼返回結果也正常:

4.2 Python 2 連接方式

MySQL-python 是 Python2.X 版本中用于連接 MySQL 服務器的一個庫。官方推薦采用該庫在 Python 2 上連接 OceanBase。

首先也是需要手工安裝該庫:

sudo pip install MySQL-python

示例代碼及返回結果如下:

import MySQLdbconn= MySQLdb.connect(host='10.211.55.73',port = 2883,user='root',passwd='observer',db ='test' )try:cur = conn.cursor()cur.execute('SELECT * from t1')ans = cur.fetchall()print(ans)finally:conn.close() [chris@obd ~]$ python test.py ((1L, 'a'), (2L, 'b'))

5. Golang 驅動鏈接 OceanBase Demo

在 Golang 開發環境下,推薦采用 Go-SQL-Driver/MySQL 來進行連接。這要求 Go 的版本要在 1.13 之上。

5.1 下載對應的庫

go get -u github.com/go-sql-driver/mysql

5.2 Demo 演示

package mainimport ("database/sql""fmt""log"_ "github.com/go-sql-driver/mysql" )type TS struct {Id intName string }func select_all() {conn := "root:obsever@tcp(10.211.55.73:2883)/test"db, err := sql.Open("mysql", conn)if err != nil {log.Fatal(err)}defer db.Close()if err != nil {log.Fatal(err)}res, err := db.Query("SELECT * FROM t1")if err != nil {log.Fatal(err)}defer res.Close()if err != nil {log.Fatal(err)}for res.Next() {var t TSerr := res.Scan(&t.Id, &t.Name)if err != nil {log.Fatal(err)}fmt.Printf("%v\n", t)} }func main() {select_all() }

執行結果截圖如下,此處注意環境變量 GO111MODULE的設置,否則會去查找 mod 文件并導致無法執行:

總結

以上是生活随笔為你收集整理的各种语言如何连接到 OceanBase的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。