1. 程式人生 > >連線池連線kerberos許可權認證的impala+kudu資料庫

連線池連線kerberos許可權認證的impala+kudu資料庫

啥都不說,先吐槽,吐槽技術中心,吐槽部門,能不能讓我安安全全的使用,不要扔個個東西來就讓我用,在開發環境沒有kerberos,來了上正式,直接給布上,你讓我這連kerberos都不知道是啥的java開發人員咋搞,完,寫一下自己通過連線池連線存在kerberos認證的impala+kudu資料庫。

先說啥是kerberos:

“Kerberos 服務”是一種客戶機/伺服器體系結構,用於在網路上提供安全事務。該服務可提供功能強大的使用者驗證以及完整性和保密性。通過驗證,可保證網路事務的傳送者和接收者的身份真實。該服務還可以檢驗來回傳遞的資料的有效性(完整性),並在傳輸過程中對資料進行加密(保密性)。使用 Kerberos 服務,可以安全登入到其他計算機、執行命令、交換資料以及傳輸檔案。此外,該服務還提供授權服務,這樣,管理員便可限制對服務和計算機的訪問。而且,作為 Kerberos 使用者,您還可以控制其他使用者對您帳戶的訪問。

解決方式及途徑:

當時先在網上找資料,發現網上沒有連線池連線的,只有通過JDBC直連的,程式碼如下:

public class App4 {
    public static void main(String[] args) throws ClassNotFoundException {
        String driverName="org.apache.hive.jdbc.HiveDriver";
        Class.forName("org.apache.hive.jdbc.HiveDriver");
        String url = "jdbc:hive2://135.12.70.35:21055/;principal=impala/
[email protected]
"; Configuration conf = new Configuration(); conf.set("hadoop.security.authentication", "Kerberos"); try { System.setProperty("java.security.krb5.conf", "resource/krb5.conf"); UserGroupInformation.setConfiguration(conf); UserGroupInformation.loginUserFromKeytab("impala/
[email protected]
", "resource/impala.haproxy.keytab"); } catch (IOException e) { e.printStackTrace(); } try { Class.forName(driverName); Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement(); String sql = "select * from test1"; ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { System.out.println(rs.getInt(1)); } stmt.close(); rs.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } }

通過上面發現,咋的,連線前先驗證,但是連線池的init方法根本不用我寫,這個咋搞,這時候我的思維進入了誤區,想是不是需要修改連線池的原始碼,所以我寫了了類繼承DruidDataSource,重寫了init方法在這上面加上kerberos驗證,但是這種方法能實現,其實很錯誤,這可能我受了傳統資料庫的影響,以為每次建立連線都得驗證,其實kerberos是單點登陸的,是伺服器之間的通訊,後來在領導的指導下,我採用了listener在專案啟動時,對專案啟動時驗證,監聽器如下:

public class GetConnListener implements ServletContextListener{
	private static Logger log = LoggerFactory.getLogger(GetConnListener.class) ;
	private static final  Configuration kuduconf = new Configuration();
	public static void initkerberos() throws IOException
	{
		 File directory = new File("");// 引數為空
	     String courseFile = directory.getCanonicalPath();
		 Configuration	conf = getKuduConf();
	     try {
	            System.setProperty("java.security.krb5.conf", courseFile+"/WebRoot/krb5.conf");
	            UserGroupInformation.setConfiguration(conf);
	            UserGroupInformation.loginUserFromKeytab("[email protected]", courseFile+"/WebRoot/impala.haproxy.keytab");
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	       log.info("Kerberos驗證程式") ;
	}
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		
	}
	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		try {
			initkerberos();
		} catch (IOException e) {
			e.printStackTrace();
		}
		log.info("Kerberos初始化完成") ;
	}
	public static Configuration getKuduConf(){
		kuduconf.set("hadoop.security.authentication", "Kerberos");
		return kuduconf;
	}
}

值得注意的是監聽器的順序,認證的這個監聽器放在最上面,如下:

	<listener>
     			<listener-class>sjgl.system.GetConnListener</listener-class>
  	</listener>
	<!-- Spring監聽配置,Web容器啟動自動裝配ApplicationContext的配置資訊-->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

但是不知道我看kerberos好像24小時失效,然後寫了個定時任務及時認證,但是好像認證一次就不需要重複認證,他自己重新整理,我也沒管,保險起見,排程如下:

@Service
public class reloadkbs {
	private static Logger log = LoggerFactory.getLogger(reloadkbs.class) ;
	@Scheduled(fixedRate = 1000*60*60*23)  
	public void reloadkerberos() throws IOException{
		GetConnListener.initkerberos();
		log.info("Kerberos重新驗證完成") ;
	}
}

但是在使用連線池時也遇到過連線池的問題例如,連線池隔一天斷開,重啟服務正常,錯誤提示:[Request processing failed; nested exception is org.hibernate.exception.GenericJDBCException: could not inspect JDBC autocommit mode] with root cause

java.net.SocketException: Software caused connection abort: socket write error

我按照druid的示例配置了最小連線數,以及檢測連線開啟,但是沒用的?請問怎麼看druid的保持連線池最小連線的檢測日誌輸出???我看看有沒有檢測連線。

解決方案:首先更改wait_timeout是不好的。

用如下配置可以解決:

<property name="validationQuery" value="select 1" />
  <property name="testWhileIdle" value="true" />
  <property name="testOnBorrow" value="false" />
  <property name="testOnReturn" value="false" />
  <property name="timeBetweenEvictionRunsMillis" value="600000" />

testWhileIdle:建議配置為true,不影響效能,並且保證安全性。申請連線的時候檢測,如果空閒時間大於

timeBetweenEvictionRunsMillis,執行validationQuery檢測連線是否有效。

testOnBorrow:申請連線時執行validationQuery檢測連線是否有效,做了這個配置會降低效能。

testOnReturn:歸還連線時執行validationQuery檢測連線是否有效,做了這個配置會降低效能

另外:大家七夕快樂,今年七夕我還是一個人。

相關推薦

連線連線kerberos許可權認證impala+kudu資料庫

啥都不說,先吐槽,吐槽技術中心,吐槽部門,能不能讓我安安全全的使用,不要扔個個東西來就讓我用,在開發環境沒有kerberos,來了上正式,直接給布上,你讓我這連kerberos都不知道是啥的java開發人員咋搞,完,寫一下自己通過連線池連線存在kerberos認證的impal

JDBC資料庫連線連線資料庫資料庫操作DAO層設計通用更新及查詢方法(二)

上篇文章主要介紹了通過資料庫連線池連線資料庫,然後設計了對資料庫通用更新和查詢方法,本篇文章主要通過例項介紹上篇文章定義的對資料庫操作的幾個方法的使用:     首先我們先在資料庫建立一個學生資訊表Student欄位如圖: 建立好表將配置檔案的資訊改好然後需要建立一

JDBC資料庫連線連線資料庫資料庫操作DAO層設計通用更新及查詢方法(一)

該篇文章介紹了資料庫連線池獲取資料庫連線以及資料庫操作的基本使用,然後主要提供了java專案案例中dao層的一種設計,利用反射的原理定義了通用的查詢方法可以對應所有的表和例項。文章中的每段程式碼都提供了詳細的註釋及邏輯步驟 首先匯入資料庫連線的所需要的jar包:    

1112_maven專案使用Druid連線配置步驟和注意事項[mysql資料庫]

maven專案使用Druid連線池配置步驟和注意事項[mysql資料庫] 2018年06月13日 17:09:25 個人分類: java 注:這兩天搭建專案時,使用Druid連線池入了不少坑;以此記錄; MySQL Server 5.7.21 + mysql-connector-j

Mybatis 搭配 阿里druid連線 連線 oracle 或 mysql

DRUID介紹     DRUID是阿里巴巴開源平臺上一個資料庫連線池實現,它結合了C3P0、DBCP、PROXOOL等DB池的優點,同時加入了日誌監控,可以很好的監控DB池連線和SQL的執行情況,可以說是針對監控而生的DB連線池(據說是目前最好的連線池,不知道速

Nodejs:連線連線mysql

OptPool.js var mysql = require("mysql");//呼叫mysql模組 function OptPool() { this.flag = true;//是否連線過 this.pool = mysql.createPool({

連線資料庫(java驅動連線連線連線

使用java驅動連線資料庫:        String url ="jdbc:mysql://localhost:3306/zhongruan";        String usernam

Java Web開發7___通過資料庫連線連線MySQL 資料庫

本博文 給出一個使用資料庫連線池的例子, 將使用webdb 資料來源 獲取一個MySQL 資料庫連線,並查詢其中的t_dirctionary表, 最後將查詢結果顯示在客戶端瀏覽器。 以下ViewDictionary 類 演示了怎麼樣 使用資料庫連線池獲取資料庫連線, 程式碼如下: i

通過jdbc建立連線連線資料庫

一、匯入相關jar包 ojdbc14.jar(Oracle用的) 或 mysql-connector-java-5.1.17.jar(mysql用的)、jsonplugin-0.34.jar(業務中封裝資料用到,可生成json格式的資料)、commons-pool-1.5.

使用連線連線資料庫

連線資料庫的步驟 我在網上看到的一個教程,感覺那個老師總結的特別好,他是引用<紅樓夢>中的人物,將連線資料庫的步驟進行了總結。 “賈璉欲執事” 賈:載入註冊驅動。 璉:連線資料庫 欲:獲取預編譯語句物件 執:執行預編譯語句 事:釋放資源 匯入jar包

使用JDBC連線Oracle資料庫和使用連線連線Oracle資料庫的程式碼解析

這裡連線的是oracle資料庫。 JDBC是什麼:JDBC是java資料庫連線技術的簡稱,提供連線各種常用資料庫的能力。 客戶端傳送請求給應用伺服器,應用伺服器通過JDBC連線到資料庫伺服器,查詢資料庫中的資料,返回一個結果集,再把結果集轉換成實體類傳遞給客戶端。 JDBC

Java中使用Redis(jedis連線連線redis/spring整合redis)

開始在 Java 中使用 Redis 前, 我們需要確保已經安裝了 redis 服務及 Java redis 驅動1、下載最新驅動包:https://mvnrepository.com/artifact/redis.clients/jedis;jedis-2.9.0.jar;

封裝一個數據庫連線工具類(connection與threadlocal與資料庫連線和事務)

package com.itheima.utils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.St

使用proxool連線 ,連線沒有關閉的原因

遇到的問題:      使用如下方法查詢,連線不能正常關閉:          方式1:   SQLQuery query=getSession().createSQLQuery(sql.toString());            如果事務配置正確的話,方式1可以.  

使用資料庫連線連線資料庫

資料庫連線池是什麼? 資料庫連線池(Connection pooling)是程式啟動時建立足夠的資料庫連線,並將這些連線組成一個連線池,由程式動態地對池中的連線進行申請,使用,釋放。 在對資料庫進行操

[轉載]跟蹤 c3p0 連線連線洩漏

最近的專案碰到了連線洩漏的問題。 專案用的是Spring + Hibernate + c3p0,具體表現為,系統 執行一段時間後,使用者開啟登入頁後,執行登入無響應,檢視後臺日誌,提示Could not open Connection。將c3p0日誌級別調成debug之

C3P0連線連線異常錯誤解決

當併發量大的時候,C3P0連線池會出現如下異常資訊: Caused by: java.sql.SQLException: An attempt by a client to checkout a Connection has timed out. at com.mchang

檢視連線連線

select count(*) from v$process;          ---------------檢視活動的連線數 select value from v$parameter where name = 'processes';        -----------------------檢視

Weblogic連線屬性(PinnedToThread )導致連線連線不斷增長

最近專案遇到棘手的問題,weblogic連線池不斷增長導致連線爆滿。 後來經過仔細查詢發現weblogic連線池設定勾選了PinnedToThread 屬性導致的,下面先看下官方對這個屬性的介紹吧: PinnedToThread 是一個能夠改善效能的選項,它啟用執行執行緒

利用C3P0連線連線mysql資料庫,超過幾小時後連線報wait_timeout錯誤

之前做了一個小專案,用的是C3P0連線池連線mysql資料庫,由於連線數目較小,隔天再連線發現報如下異常錯誤,然後重新重新整理後又正常: 之後檢視資料後發現是因為 :MySQL 的預設設定下,當一個連線的空閒時間超過8小時後,MySQL 就會斷開該連線,而 c3p0 連線