成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

kerberos認(rèn)證+impala-jdbc驅(qū)動(dòng)+連接池,集成到spring框架

Shihira / 2910人閱讀

摘要:對(duì)不同驅(qū)動(dòng)分別說(shuō)明之。,認(rèn)證與連接池集成方案對(duì)情況,比較簡(jiǎn)單,滿足兩個(gè)代碼塊執(zhí)行的時(shí)序性即可。即確保在連接池實(shí)例化前,執(zhí)行認(rèn)證的代碼塊。,認(rèn)證與連接池集成方案考慮到創(chuàng)建是連接池類內(nèi)部的函數(shù)。而認(rèn)證代碼塊是對(duì)創(chuàng)建這一過(guò)程本身進(jìn)行包裹。

1 兩種jbdc驅(qū)動(dòng),kerberos認(rèn)證的區(qū)別描述 1-1 hive-jdbc驅(qū)動(dòng)與kerberos認(rèn)證  

  對(duì)于hive-jdbc驅(qū)動(dòng),kerberos認(rèn)證的代碼塊與Connection實(shí)例化的代碼塊,耦合性不強(qiáng),保證執(zhí)行的時(shí)序性即可。(kerberos認(rèn)證在前,Connection實(shí)例化在后),如下圖所示。

代碼如下。

    // 先執(zhí)行kerberos認(rèn)證的代碼塊
    // 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");

    // 接著執(zhí)行Connection實(shí)例化的代碼塊
    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驅(qū)動(dòng)與kerberos認(rèn)證

  對(duì)于impala-jdbc驅(qū)動(dòng),kerberos認(rèn)證的代碼塊與Connection實(shí)例化的代碼塊,兩者強(qiáng)耦合,除了保證執(zhí)行的時(shí)序性(kerberos認(rèn)證在前,Connection實(shí)例化在后),還要求在doAs函數(shù),創(chuàng)建Connection,如下圖所示。
  

  代碼如下所示。

    // kerberos認(rèn)證的代碼塊
    // 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函數(shù)中實(shí)現(xiàn)Connection的創(chuàng)建
    // 2. create impala jdbc connection
    Class.forName(JDBCDriverName);
    conn = (Connection) ugi.doAs(new PrivilegedExceptionAction() {
      public Object run() {
        Connection tcon = null;
        try {
          tcon = DriverManager.getConnection(connectionUrl);
        } catch (SQLException e) {
          e.printStackTrace();
        }
        return tcon;
      }
    });

    // 3. execute query using conn
2 kerberos認(rèn)證與連接池集成方案

  對(duì)比上述兩段代碼,當(dāng)引入連接池技術(shù)來(lái)管理Connection時(shí)。對(duì)不同驅(qū)動(dòng)分別說(shuō)明之。

2-1 hive-jdbc,kerberos認(rèn)證與連接池集成方案

  對(duì)hive-jdbc情況,比較簡(jiǎn)單,滿足兩個(gè)代碼塊執(zhí)行的時(shí)序性即可。即確保在連接池實(shí)例化前,執(zhí)行kerberbos認(rèn)證的代碼塊。具體實(shí)現(xiàn)方法:① spring bean中的depends-on標(biāo)簽(見(jiàn)參考文獻(xiàn)[3])。② 配置Listener。見(jiàn)參考文獻(xiàn)[2])。
  這種情況,不是本文章的重點(diǎn),這里不對(duì)它具體展開(kāi)。

2-2 impala-jdbc,kerberos認(rèn)證與連接池集成方案

  考慮到Connection創(chuàng)建是連接池類內(nèi)部的函數(shù)。而kerberos認(rèn)證代碼塊是對(duì)Connection創(chuàng)建這一過(guò)程本身進(jìn)行包裹。即kerberos認(rèn)證的代碼塊,與連接池類內(nèi)部的函數(shù)創(chuàng)建Connection的代碼塊,兩者強(qiáng)耦合。如下圖所示。
  

  考慮到上述情況,如何打開(kāi)連接池類的封裝,對(duì)連接池類內(nèi)部的getConnection函數(shù)加上kerberbos認(rèn)證的邏輯?
  換言之,對(duì)如何對(duì)一個(gè)類的方法進(jìn)行增強(qiáng)?
  最樸素的路子是繼承這個(gè)類,然后覆寫(xiě)這個(gè)類中的目標(biāo)增強(qiáng)方法。
  以Druid連接池為例,創(chuàng)建一個(gè)類繼承DruidSource,對(duì)所有g(shù)etConnection相關(guān)的幾個(gè)函數(shù)重寫(xiě),把kerberbos認(rèn)證相關(guān)的代碼塊嵌入到該函數(shù)里面。這樣可以通過(guò)kerberbos認(rèn)證,并返回Connection。

public class DruidDataSourceWrapper extends DruidDataSource {

    // 創(chuàng)建一個(gè)函數(shù),指向父類的getConnection(long)方法
    public DruidPooledConnection superGetConnection(long maxWaitMillis) throws SQLException {
        return super.getConnection(maxWaitMillis);
    }
    
    /**
     * 覆寫(xiě)父類的getConnection(long)方法,在父類的getConnection(long)方法外面包裹上kerberbos認(rèn)證的代碼塊
     */
    @Override
    public DruidPooledConnection getConnection(final long maxWaitMillis) throws SQLException {

        // kerberos認(rèn)證的代碼塊
        // 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函數(shù)中實(shí)現(xiàn)Connection的創(chuàng)建
        // 覆寫(xiě)父類的getConnection(long)方法,在方法外面包裹上kerberbos認(rèn)證的代碼塊
        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框架集成時(shí),在連接池相關(guān)的xml配置文件中,關(guān)于數(shù)據(jù)庫(kù)連接池,class類路徑指向我們封裝的類路徑即可。


    
    
    
    
2-3集成方案中可能存在的技術(shù)點(diǎn)

  上述涉及到對(duì)一個(gè)類的函數(shù)功能進(jìn)行增強(qiáng),有點(diǎn)連接池類被final修飾,不能被繼承。有沒(méi)有其它的方法對(duì)不能繼承的類進(jìn)行增強(qiáng)呢?答案是存在的,是裝飾者模式與動(dòng)態(tài)代理模式。
  舉個(gè)例子:c3p0連接池,比較適合裝飾者模式對(duì)getConnection函數(shù)進(jìn)行增強(qiáng)。
  對(duì)于Java中增強(qiáng)一個(gè)類的幾種方法,具體參考文獻(xiàn)[6]、[7]。

3 參考文獻(xiàn)

[1] https://blog.csdn.net/tlqfree... (windows環(huán)境 java jdbc 連接impala (kerberos認(rèn)證) - 空谷幽蘭草堂 - CSDN博客)
[2] https://blog.csdn.net/zhanglu... (springmvc集成kerberos認(rèn)證hive jdbc連接 - 張小竟 - CSDN博客)
[3] http://www.aboutyun.com/forum... (hive + kerberos spring 配置 DruidDataSource 數(shù)據(jù)庫(kù)連接池-Hive-about云開(kāi)發(fā))
[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中增強(qiáng)一個(gè)類的幾種方法 - friday_PJ的博客 - CSDN博客)
[7] https://www.cnblogs.com/xuzha... (對(duì)java方法進(jìn)行功能增強(qiáng)的三種方法)

4 結(jié)束語(yǔ)

  如果我的技術(shù)博客節(jié)約了大家的寶貴的時(shí)間,歡迎大家請(qǐng)我喝杯茶,^V^。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75165.html

相關(guān)文章

  • Java深入-框架技巧

    摘要:從使用到原理學(xué)習(xí)線程池關(guān)于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實(shí)現(xiàn)在軟件開(kāi)發(fā)中,分散于應(yīng)用中多出的功能被稱為橫切關(guān)注點(diǎn)如事務(wù)安全緩存等。 Java 程序媛手把手教你設(shè)計(jì)模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經(jīng)風(fēng)雨慢慢變老,回首走過(guò)的點(diǎn)點(diǎn)滴滴,依然清楚的記得當(dāng)初愛(ài)情萌芽的模樣…… Java 進(jìn)階面試問(wèn)題列表 -...

    chengtao1633 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Shihira

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<