在Vert.x中使用SQL - Alexey Soshin
Vert.x是非同步的。在Vert.x中執行資料庫查詢時,您顯然正在傳遞迴調。那麼,它是非同步的?:
conn.updateWithParams("insert into user (email, name, password) values (?, ?, ?)", params, (r) -> { if (r.succeeded()) { System.out.println("Ok!"); } else { if (r.cause() instanceof MySQLException) { MySQLException cause = (MySQLException) r.cause(); if (cause.errorMessage().errorCode() == 1062) { // Duplicate key, ignore } } |
不完全對,看看queryWithParams 方法內部:
public SQLConnection queryWithParams(String sql, JsonArray params, Handler<AsyncResult<ResultSet>> resultHandler) { new JDBCQuery(vertx, helper, options, ctx, sql, params).execute(conn, statementsQueue, resultHandler); return this; } |
JDBCQuery 是一個簡單物件,有趣部分是execute()方法,進入AbstractJDBCAction看看這個方法:
public void execute(Connection conn, TaskQueue statementsQueue, Handler<AsyncResult<T>> resultHandler) { ctx.executeBlocking(future -> handle(conn, future), statementsQueue, resultHandler); } |
注意到呼叫的executeBlocking方法名稱,你可能疑惑ctx來自哪裡,其實來自JDBCClientImpl:
public SQLClient getConnection(Handler<AsyncResult<SQLConnection>> handler) { Context ctx = vertx.getOrCreateContext(); getConnection(ctx, ar -> ctx.runOnContext(v -> handler.handle(ar))); return this; } |
結論是,最後,常規的Vert.x JDBC客戶端沒有任何魔力。它使用了一個簡單的資料來源:預設情況下為C3P0,但如果您願意,也可以使用Hikari。您可能希望將池大小設定得更大,預設為15個連線。
這種實現的主要目標很簡單 - 不阻止事件迴圈(從不阻止事件迴圈)。對大多數用例來說,它實際上非常好。只是不要指望它會用JDBC做一些神奇的事情,就像讓它無阻塞一樣。
相關文章
- 【SQL】SQL中if條件的使用SQL
- Vert.X CompositeFuture 用法
- 使用 Vert.X Future/Promise 編寫非同步程式碼Promise非同步
- sql中limit使用方法SQLMIT
- 使用DataSource-Proxy在Spring Boot中記錄SQL語句 - Vlad MihalceaSpring BootSQL
- 在SQL Server 2008中的SP上使用表型別值引數MHSQLServer型別
- 在登入資料庫的使用!sql資料庫SQL
- 在Golang中如何正確地使用database/sql包訪問資料庫GolangDatabaseSQL資料庫
- 瞭解Vert.x:事件迴圈事件
- Vert.x原始碼分析之Launcher原始碼
- MyBatis的使用三(在sql語句中傳值)MyBatisSQL
- 在檔案上使用 SQL 查詢的示例SQL
- 【OracleEBS】 在PL/SQL中呼叫Oracle ERP請求OracleSQL
- Java 中如何使用 SQL 查詢 TXTJavaSQL
- 使用Vert.x最佳化關聯式資料庫PostgreSQL訪問 | foojay資料庫SQL
- 事件溯源是否屬於過度營銷的銀彈? - Alexey事件
- 在Excel VBA中使用SQL到底優勢在哪兒ExcelSQL
- 在 SQL Server 中使用 Try Catch 處理異常SQLServer
- Vert.x 程式碼結構最佳實踐
- SQL解析在美團點評中的應用SQL
- 在 Azure CentOS VM 中配置 SQL Server 2019 AG - (上)CentOSSQLServer
- 在Pandas中 SQL操作:SQLAlchemy和PyMySQL的區別MySql
- 在SQL Server中完美壓縮.mdf檔案DVSQLServer
- SQL中的替換函式replace()使用SQL函式
- SQL中DATEADD和DATEDIFF的使用方法SQL
- Sql中SYSDATE函式的使用方法SQL函式
- hibernate在JPA規範中在控制檯無法出現SQL語句SQL
- [譯] 在中國使用 FlutterFlutter
- AspectJ 在 Spring 中的使用Spring
- JSON在Python中的使用JSONPython
- Cordova在Android中的使用Android
- LiteDB在.NET中如何使用
- 在 Java 中如何使用 transientJava
- reload在python中的使用Python
- iota 在 Go 中的使用Go
- 在 SQL Server 中 你可以使用以下查詢來找到引用 的 FOREIGN KEY 約束SQLServer
- 一條SQL語句在MySQL中如何執行的MySql
- 一條SQL在 MaxCompute 分散式系統中的旅程SQL分散式