摘要:對不同驅動分別說明之。,認證與連接池集成方案對情況,比較簡單,滿足兩個代碼塊執行的時序性即可。即確保在連接池實例化前,執行認證的代碼塊。,認證與連接池集成方案考慮到創建是連接池類內部的函數。而認證代碼塊是對創建這一過程本身進行包裹。
1 兩種jbdc驅動,kerberos認證的區別描述 1-1 hive-jdbc驅動與kerberos認證
對于hive-jdbc驅動,kerberos認證的代碼塊與Connection實例化的代碼塊,耦合性不強,保證執行的時序性即可。(kerberos認證在前,Connection實例化在后),如下圖所示。
代碼如下。
// 先執行kerberos認證的代碼塊 // 1. login use keytab System.setProperty("java.security.krb5.realm", "XXX.COM"); System.setProperty("java.security.krb5.kdc", "kdcXXX"); Configuration conf = new Configuration(); conf.set("hadoop.security.authentication", "Kerberos"); UserGroupInformation.setConfiguration(conf); UserGroupInformation ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("test", "test.keytab"); // 接著執行Connection實例化的代碼塊 try { Class.forName(driverName); Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement(); String sql = "show databases;"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ System.out.println(rs.getString(1)); } } catch (Exception e) { e.printStackTrace(); }1-2 impala-jdbc驅動與kerberos認證
對于impala-jdbc驅動,kerberos認證的代碼塊與Connection實例化的代碼塊,兩者強耦合,除了保證執行的時序性(kerberos認證在前,Connection實例化在后),還要求在doAs函數,創建Connection,如下圖所示。
代碼如下所示。
// kerberos認證的代碼塊 // 1. login use keytab System.setProperty("java.security.krb5.realm", "XXX.COM"); System.setProperty("java.security.krb5.kdc", "kdcXXX"); Configuration conf = new Configuration(); conf.set("hadoop.security.authentication", "Kerberos"); UserGroupInformation.setConfiguration(conf); UserGroupInformation ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("test", "test.keytab"); // 在UserGroupInformation的doAs函數中實現Connection的創建 // 2. create impala jdbc connection Class.forName(JDBCDriverName); conn = (Connection) ugi.doAs(new PrivilegedExceptionAction2 kerberos認證與連接池集成方案
對比上述兩段代碼,當引入連接池技術來管理Connection時。對不同驅動分別說明之。
2-1 hive-jdbc,kerberos認證與連接池集成方案 對hive-jdbc情況,比較簡單,滿足兩個代碼塊執行的時序性即可。即確保在連接池實例化前,執行kerberbos認證的代碼塊。具體實現方法:① spring bean中的depends-on標簽(見參考文獻[3])。② 配置Listener。見參考文獻[2])。
這種情況,不是本文章的重點,這里不對它具體展開。
考慮到Connection創建是連接池類內部的函數。而kerberos認證代碼塊是對Connection創建這一過程本身進行包裹。即kerberos認證的代碼塊,與連接池類內部的函數創建Connection的代碼塊,兩者強耦合。如下圖所示。
考慮到上述情況,如何打開連接池類的封裝,對連接池類內部的getConnection函數加上kerberbos認證的邏輯?
換言之,對如何對一個類的方法進行增強?
最樸素的路子是繼承這個類,然后覆寫這個類中的目標增強方法。
以Druid連接池為例,創建一個類繼承DruidSource,對所有getConnection相關的幾個函數重寫,把kerberbos認證相關的代碼塊嵌入到該函數里面。這樣可以通過kerberbos認證,并返回Connection。
public class DruidDataSourceWrapper extends DruidDataSource { // 創建一個函數,指向父類的getConnection(long)方法 public DruidPooledConnection superGetConnection(long maxWaitMillis) throws SQLException { return super.getConnection(maxWaitMillis); } /** * 覆寫父類的getConnection(long)方法,在父類的getConnection(long)方法外面包裹上kerberbos認證的代碼塊 */ @Override public DruidPooledConnection getConnection(final long maxWaitMillis) throws SQLException { // kerberos認證的代碼塊 // 1. login use keytab System.setProperty("java.security.krb5.realm", "XXX.COM"); System.setProperty("java.security.krb5.kdc", "kdcXXX"); Configuration conf = new Configuration(); conf.set("hadoop.security.authentication", "Kerberos"); UserGroupInformation.setConfiguration(conf); UserGroupInformation ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("test", "test.keytab"); // 在UserGroupInformation的doAs函數中實現Connection的創建 // 覆寫父類的getConnection(long)方法,在方法外面包裹上kerberbos認證的代碼塊 DruidDataSourceWrapper _this = this; Connection conn = ugi.doAs(new PrivilegedExceptionAction() { public Connection run() { Connection tcon = null; try { // 父類的getConnection(long)方法 tcon = _this.superGetConnection(maxWaitMillis); } catch (SQLException e) { e.printStackTrace(); } return tcon; } }); // 返回connection return conn; } }
在與spring框架集成時,在連接池相關的xml配置文件中,關于數據庫連接池,class類路徑指向我們封裝的類路徑即可。
2-3集成方案中可能存在的技術點
上述涉及到對一個類的函數功能進行增強,有點連接池類被final修飾,不能被繼承。有沒有其它的方法對不能繼承的類進行增強呢?答案是存在的,是裝飾者模式與動態代理模式。
舉個例子:c3p0連接池,比較適合裝飾者模式對getConnection函數進行增強。
對于Java中增強一個類的幾種方法,具體參考文獻[6]、[7]。
[1] https://blog.csdn.net/tlqfree... (windows環境 java jdbc 連接impala (kerberos認證) - 空谷幽蘭草堂 - CSDN博客)
[2] https://blog.csdn.net/zhanglu... (springmvc集成kerberos認證hive jdbc連接 - 張小竟 - CSDN博客)
[3] http://www.aboutyun.com/forum... (hive + kerberos spring 配置 DruidDataSource 數據庫連接池-Hive-about云開發)
[4] https://www.cnblogs.com/zhish... (Spring depends-on介紹)
[5] https://stackoverflow.com/que... (authentication - Error when connect to impala with JDBC under kerberos authrication - Stack Overflow)
[6] https://blog.csdn.net/friday_... (Java中增強一個類的幾種方法 - friday_PJ的博客 - CSDN博客)
[7] https://www.cnblogs.com/xuzha... (對java方法進行功能增強的三種方法)
如果我的技術博客節約了大家的寶貴的時間,歡迎大家請我喝杯茶,^V^。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75165.html
摘要:從使用到原理學習線程池關于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實現在軟件開發中,分散于應用中多出的功能被稱為橫切關注點如事務安全緩存等。 Java 程序媛手把手教你設計模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經風雨慢慢變老,回首走過的點點滴滴,依然清楚的記得當初愛情萌芽的模樣…… Java 進階面試問題列表 -...
閱讀 923·2023-04-26 01:34
閱讀 3356·2023-04-25 20:58
閱讀 3262·2021-11-08 13:22
閱讀 2108·2019-08-30 14:17
閱讀 2522·2019-08-29 15:27
閱讀 2673·2019-08-29 12:45
閱讀 2996·2019-08-29 12:26
閱讀 2811·2019-08-28 17:51