1. 程式人生 > >Esper學習之十:EPL語法(六)

Esper學習之十:EPL語法(六)

轉載請註明出處:http://blog.csdn.net/luonanqin

       2014是新的一年,正好也是本人的本命年。既然是本命年,看來今年也是本人興旺之年了。。。開了個小玩笑,同時也祝各位同行今年少調bug多漲工資,這才是最實際的。

       年前的最後一篇說的是子查詢和join,基本上epl的大部分簡單語法都說完了。之前有朋友問我epl怎麼和資料庫互動,正好今天這篇就是來專門解釋這個問題。但是要提醒各位,本篇只是說明了在epl中如何與資料庫互動,並且只能算是簡單的互動。而高階的用法會在esperio裡有詳細的指導(esperio的文件可在esper的官網找到)。

       在esper的文件中,epl訪問資料庫的配置放在了比較靠後的位置,不過為了方便各位學習,這裡會先說明和資料庫互動的相關配置,然後再說epl怎麼訪問資料庫。

配置檔案在官方esper包的etc資料夾下,大家可以參考著學習。

1.連線資料庫

a.JNDI獲取連線

配置如下:

  1. <database-referencename="mydb1">
  2.   <datasource-connectioncontext-lookup-name="java:comp/env/jdbc/mydb">
  3.     <env-property
    name="java.naming.factory.initial"value ="com.myclass.CtxFactory"/>
  4.     <env-propertyname="java.naming.provider.url"value ="iiop://localhost:1050">
  5.   </datasource-connection>
  6. </database-reference>
database-reference的name是要連線的資料庫名字,其餘的配置可參考JNDI的文件

使用方法:

  1. if (envProperties.size() > 
    0) {  
  2.   initialContext = new InitialContext(envProperties);  
  3. else {  
  4.   initialContext = new InitialContext();  
  5. }  
  6. DataSource dataSource = (DataSource) initialContext.lookup(lookupName);  
  7. Connection connection = dataSource.getConnection();  

更多內容可參考JNDI的文件

b.從連線池獲取連線

配置如下:(以dbcp為例)

  1. <database-referencename="mydb3">
  2.   <!-- For a complete list of properties see Apache DBCP. -->
  3.   <datasourcefactory-connectionclass-name="org.apache.commons.dbcp.BasicDataSourceFactory">
  4.     <env-propertyname="username"value ="myusername"/>
  5.     <env-propertyname="password"value ="mypassword"/>
  6.     <env-propertyname="driverClassName"value ="com.mysql.jdbc.Driver"/>
  7.     <env-propertyname="url"value ="jdbc:mysql://localhost/test"/>
  8.     <env-propertyname="initialSize"value ="2"/>
  9.     <env-propertyname="validationQuery"value ="select 1 from dual"/>
  10.   </datasourcefactory-connection>
  11. <connection-lifecyclevalue="pooled"/>
</database-reference> 相同的配置可以使用esper的api達到同樣的效果。程式碼如下:
  1. Properties props = new Properties();  
  2. props.put("username""myusername");  
  3. props.put("password""mypassword");  
  4. props.put("driverClassName""com.mysql.jdbc.Driver");  
  5. props.put("url""jdbc:mysql://localhost/test");  
  6. props.put("initialSize"2);  
  7. props.put("validationQuery""select 1 from dual");  
  8. ConfigurationDBRef configDB = new ConfigurationDBRef();  
  9. // BasicDataSourceFactory is an Apache DBCP import
  10. configDB.setDataSourceFactory(props, BasicDataSourceFactory.class.getName());  
  11. configDB.setConnectionLifecycleEnum(ConfigurationDBRef.ConnectionLifecycleEnum.POOLED);  
  12. Configuration configuration = new Configuration();  
  13. configuration.addDatabaseReference("mydb3", configDB);  
同樣,也可以自己實現資料來源。示例如下:
  1. configDB.setDataSourceFactory(props, MyOwnDataSourceFactory.class.getName());  
  2. ...  
  3. class MyOwnDataSourceFactory {  
  4.   publicstatic DataSource createDataSource(Properties properties) {  
  5.     returnnew MyDataSourceImpl(properties);  
  6.   }   
  7. }  

c.JDBC獲取連線

前提是要將對應的jdbc驅動假如classpath

  1. <database-referencename="mydb2">
  2.   <drivermanager-connectionclass-name="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/mydb2"user="myuser"password="mypassword">
  3.     <connection-argname="user"value ="myuser"/>
  4.     <connection-argname="password"value ="mypassword"/>
  5.     <connection-argname="somearg"value ="someargvalue"/>
  6.   </drivermanager-connection>
  7. </database-reference>
注意:drivermanager-connection中的user和password屬性必須填寫,即使增加了connection-arg引數也不行。所以實際上connection-arg的user和password是不需要寫的。這點我覺得esper做的不夠人性化。

d.其他關於資料庫連線的配置

下面是一些和資料庫互動的配置,更多配置可參考Javadoc

  1. <database-referencename="mydb2">
  2. ... configure data source or driver manager settings...  
  3.   <connection-settingsauto-commit="true"catalog="mycatalog"read-only="true"transaction-isolation="1"/>
  4. </database-reference>
下面是關於連線的生命週期的配置
  1. <database-referencename="mydb2">
  2. ... configure data source or driver manager settings...  
  3.     <connection-lifecyclevalue="pooled"/><!-- retain -->
  4. </database-reference>
如果引數值為pooled,當配置了連線池,則會將每次獲取的連線還給連線池。若沒配置連線池,則每次獲取的連線用完後就關閉。

如果引數值為retain,則會將連線快取到esper引擎中,這個epl用完後,另一個epl可以接著用

2.查詢結果快取策略
EPL和資料庫互動時會產生查詢結果,所以引擎若能快取查詢結果將大大提高執行效率,因此esper提供了兩種快取模式。

a.LRU Cache
LRU即least-recently-used,中文釋義為“最近最少使用”,學過OS的應該知道記憶體快取策略裡也有這個演算法,不明白的請自行搜尋。配置如下:

  1. <database-reference

    相關推薦

    Esper學習EPL語法

    轉載請註明出處:http://blog.csdn.net/luonanqin        2014是新的一年,正好也是本人的本命年。既然是本命年,看來今年也是本人興旺之年了。。。開了個小玩笑,同時也祝各位同行今年少調bug多漲工資,這才是最實際的。

    Esper學習EPL語法

    轉載請註明出處:http://blog.csdn.net/luonanqin        暫停更新三個多月,轉眼間就2014年了。年底相信都是大家最忙碌的時候,我也不例外,以至於真的是沒騰出手來繼續更新,好在年初這段時間可以休息一陣了,所以趕著這段

    Esper學習筆記五EPL語法3

    1.Aggregation 類似於SQL中的聚合函式,EPL中聚合函式格式如下: aggregate_function([all|distinct] expression) aggregate_function就是聚合函式的名字,比如avg,sum等。expression通常是事件

    Esper學習筆記四EPL語法2

    1.select 查詢所有屬性或特定屬性 EPL的select和SQL的select很相近,SQL用*表示查詢表的所有欄位,而EPL用*表示查詢事件流的所有屬性值。SQL查詢某個欄位名,直接在select後跟欄位名就ok,EPL也是將要查詢的屬性名放在select之後。若查多個屬

    Esper學習筆記三EPL語法1

    1.EPL語法簡介 EPL全稱Event Processing Language,是一種類似SQL的語言,包含了SELECT, FROM, WHERE, GROUP BY, HAVING 和 ORDER BY子句,同時用事件流代替了table作為資料來源,並且能像SQL那樣join,fil

    Esper學習EPL語法

    轉載請註明出處:http://blog.csdn.net/luonanqin        元宵過後回公司上班,換了個部門,換了個領導,做的事也換了,不過Esper還是會繼續搞,所以部落格也會慢慢寫的,大家別急。^_^        上一篇說到了EPL如何訪問關係型資料

    Esper學習EPL語法

    轉載請註明出處:http://blog.csdn.net/luonanqin         中秋三天,說閒也不閒,調調工作的程式碼,倒還解決不少問題。不過也是因為最近工作忙的緣故,Esper被我冷落不少日子了,趁著今天最後一天,趕緊寫一篇出來。         從

    機器學習大經典演算法 PageRank演算法

    PageRank演算法        (一)  PageRank演算法簡介:        Google的創始人之一LarryPage於1998年提出了PageRank,並應用在Google搜尋引擎的檢索結果排序上,該技術也是Google早期的核心技術之一。        L

    Linux學習多執行緒程式設計

    言之者無罪,聞之者足以戒。 ——《詩序》 4、執行緒私有屬性 應用程式設計中有必要提供一種變數,使得多個函式多個執行緒都可以訪問這個變數(看起來是個全域性變數),但是執行緒對這個變數的訪問都不會彼此產生影響(貌似不是全域性變數哦),但是你需要這樣的資料,比如errno。那

    程式設計菜鳥到大佬計算機作業系統

    處理器管理 中斷 中斷的概念 中斷是指程式執行過程中, 遇到急需處理的事件時, 暫時中止CPU上現行程式的執行,轉去執行相應的事件處理程式, 待處理完成後再返回原程式被中斷處或排程其他程式執行的過程。 作業系統是“中斷驅動” 的; 換言之, 中斷是啟用

    Esper學習Pattern

    轉載請註明出處:http://blog.csdn.net/luonanqin        上一篇開始了新一輪語法——Pattern的講解,一開始為大家普及了幾個基礎知識,其中有說到操作符。當時只是把它們都列舉出來了,所以今天這篇就是專門詳解這些操作符的,但是由於篇幅限制

    機器學習支持向量機核函數和KKT條件的理解

    麻煩 ron 現在 調整 所有 核函數 多項式 err ges 註:關於支持向量機系列文章是借鑒大神的神作,加以自己的理解寫成的;若對原作者有損請告知,我會及時處理。轉載請標明來源。 序: 我在支持向量機系列中主要講支持向量機的公式推導,第一部分講到推出拉格朗日對偶函數的對

    機器學習支持向量機支持向量機的公式推導

    根據 監督式 art 通用 利用 哪些 這就是 在線 方法 註:關於支持向量機系列文章是借鑒大神的神作,加以自己的理解寫成的;若對原作者有損請告知,我會及時處理。轉載請標明來源。 序: 我在支持向量機系列中主要講支持向量機的公式推導,第一部分講到推出拉格朗日對偶函數的對偶因

    在Ubuntu上學習OpenStack網絡計算節點上網絡補充配置

    分享 ini onf stack -a ubunt con openstac bubuko (註意:前面已經為計算+網絡節點配置了兩塊網卡eth0和eth1) v 執行如下命令: sudo ovs-vsctl add-br br-eth1 sudo ovs-vsctl ad

    Keras學習3迴歸問題boston_housing資料為例

         本實驗使用boston_housing資料集對房價資料進行迴歸分析,資料來自1970年代,波斯頓周邊地區的房價,是用於機器學習的經典資料集。該資料集很小,共計506條資料,分為404個訓練樣本和102個測試樣本,因此需要採用K-Fold,這裡取K=4。每條資料包含1

    深度學習正則化系列2資料集增強資料增廣

    讓機器學習模型泛化得更好的最好辦法是使用更多的資料進行訓練。當然,在實踐中,我們擁有的資料量是很有限的。解決這個問題的一種方法是建立假資料並新增到訓練集中。對於一些機器學習任務,建立新的假資料相當簡單。對分類來說這種方法是最簡單的。分類器需要一個複雜的高維輸入

    強化學習雙臂賭博機Two-armed Bandit

    本文是對Arthur Juliani在Medium平臺釋出的強化學習系列教程的個人中文翻譯,該翻譯是基於個人分享知識的目的進行的,歡迎交流!(This article is my personal translation for the tutorial wri

    資料結構實驗棧與佇列走迷宮DFS

    Problem Description 一個由n * m 個格子組成的迷宮,起點是(1, 1), 終點是(n, m),每次可以向上下左右四個方向任意走一步,並且有些格子是不能走動,求從起點到終點經過每個格子至多一次的走法數。 Input        第一行一個整數T

    【Unity 3D】學習筆記GUI Skin圖形使用者介面面板

    Unity 學習筆記十 學習資料:《Unity 3D遊戲開發》 宣雨鬆 在這之前的學習的大部分控制元件用來開發遊戲還是太簡陋,為了讓遊戲更具娛樂性和美觀,所以我們就需要學習GUI Skin空間來為遊戲新增色彩。 首先在Project檢視中點選create---->

    Echarts學習series-bar柱形圖詳解

    mytextStyle={ color:"#333", //文字顏色 fontStyle:"normal", //italic斜體 oblique傾斜 fontWeight:"normal",