定義數據連接是將數據庫與設計器進行綁定,通過數據連接,報表就可以從數據庫中讀取、寫入數據和修改數據等。
1. 數據支持類型
FineReport連接數據源的方式多種多樣,支持通過JDBC的方式直接連接數據庫,或者通過JNDI的方式與應用服務器共享數據連接。也指出通過JCO連接SAP系統。
FR在設計器和平臺中都可以新建數據連接,但是平臺僅支持使用JDBC的數據連接的管理。
1.1 JDBC類
|
|
|
|
數據源 |
版本 |
驅動 |
URL |
1.5、2.2 |
org.apache.kylin.jdbc.Driver |
jdbc:kylin://<hostname>:<port>/<kylin_project_name> |
|
Vertica_7.2.1 |
com.vertica.jdbc.Driver |
jdbc:vertica://verticaHost:port/databaseName |
|
DB2_7.2; |
com.ibm.db2.jcc.DB2Driver |
jdbc:db2://hostname:port/dbname |
|
11.7;11.5 |
com.informix.jdbc.IfxDriver |
jdbc:informix-sqli://{host}:{port}/{database}:INFORMIXSERVER={server} |
|
SQL server 2000; |
com.microsoft.sqlserver.jdbc.SQLServerDriver |
jdbc:sqlserver://localhost:1433;databaseName= |
|
MySQL_5.1; MySQL_5.6.28; MySQL_5.6.29; MySQL_5.6.31;MySQL_5.6.34; MySQL_5.6.35; MySQL_6.5 |
【驅動1】com.mysql.jdbc.Driver; |
jdbc:mysql://localhost/dbname |
|
oracle 9i;oracle_9.2; oracle10.2.0; oracle 11g; oracle_11g2; oracle_11.2.0.3; oracle_11.2.0.4; oracle_11.2.3; oracle 12c; oracle 10g AIX版本 |
oracle.jdbc.driver.OracleDriver |
jdbc:oracle:thin:@localhost:1521:databaseName |
|
|
【驅動1】org.postgresql.Driver; |
【對應驅動1】jdbc:postgresql://hostname:port/dbname |
|
postgresql_9.4.7;9.5.0; |
org.postgresql.Driver |
jdbc:postgresql://hostname:port/dbname |
|
|
org.apache.derby.jdbc.ClientDriver |
jdbc:derby://localhost:1527/ |
|
|
com.kingbase.Driver |
jdbc:kingbase://hostname:port |
|
Gbase 8A(基於mysql) |
com.gbase.jdbc.Driver |
jdbc:gbase://hostname:port/dbname |
|
Gbase 8S(基於infomix) |
com.gbasedbt.jdbc.IfxDriver |
jdbc:informix-sqli://{host}:{port}/{database}:INFORMIXSERVER={server} |
|
Gbase 8T(基於informix) |
com.informix.jdbc.IfxDriver |
jdbc:informix-sqli://{host}:{port}/{database}:INFORMIXSERVER={server} |
|
Presto_0.152;0.169 |
com.facebook.presto.jdbc.PrestoDriver |
jdbc:presto://host:port/catalog |
|
|
com.sap.db.jdbc.Driver |
jdbc:sap://hostname:port?reconnect=true |
|
SAP Sybase ASE_12.5;SAP Sybase IQ |
com.sybase.jdbc4.jdbc.SybDriver |
jdbc:sybase:Tds:hostname:2638/databasename |
|
Teradata_v12; TeraData_15.00.06.04 |
com.ncr.teradata.TeraDriver |
jdbc:teradata://localhost/CLIENT_CHARSET=EUC_CN,TMODE=TERA,CHARSET=ASCII,LOB_SUPPORT |
|
impala 2.2; |
com.cloudera.impala.jdbc41.Driver |
jdbc:impala://hostname:port/_impala_builtins |
|
hive_1.1; Hadoop_Hive_1.2;hive2.3; |
org.apache.hive.jdbc.HiveDriver |
jdbc:hive2://hostname:port/databasename |
|
1.6; |
org.apache.hive.jdbc.HiveDriver |
jdbc:hive2://hostname:port/databasename |
|
星環_4.6.4; |
org.apache.hive.jdbc.HiveDriver |
jdbc:hive2://hostname:port/databasename |
|
|
org.apache.phoenix.jdbc.PhoenixDriver |
jdbc:phoenix:hostname:port/dbname |
|
|
com.mysql.jdbc.Driver |
jdbc:mysql://hostname:port/my_ads_db |
|
|
【驅動1】com.amazon.redshift.jdbc4.Driver |
【驅動1】jdbc:redshift://endpoint:port/database |
|
|
org.h2.Driver |
jdbc:h2://${ENV_HOME}/../databaseName |
|
|
com.fr.third.org.hsqldb.jdbcDriver |
jdbc:hsqldb:file:[PATH_TO_DB_FILES] |
|
|
org.sqlite.JDBC |
jdbc:sqlite:[PATH_TO_DB_FILES] |
|
|
org.postgresql.Driver |
jdbc:postgresql://hostname:port/dbname |
|
|
org.postgresql.Driver |
jdbc:postgresql://hostname:port/dbname |
|
|
org.apache.hive.jdbc.HiveDriver |
jdbc:hive2://10.135.0.110:24002,10.135.0.67:24002,10.135.0.66:24002/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;sasl.qop=auth-conf;auth=KERBEROS;zk.principal=zookeeper/hadoop;principal=hive/[email protected]; |
|
|
org.postgresql.Driver |
jdbc:postgresql://hostname:port/dbname |
|
|
org.apache.phoenix.jdbc.PhoenixDriver |
jdbc:phoenix:hostname:port/dbname |
|
|
com.intersys.jdbc.CacheDriver |
|
1.2 多維數據庫類
Microsoft Analysis Services(ssas) |
SAP HANA |
Oracle Essbase |
Tomcat配置JNDI連接 |
Websphere配置JNDI連接——待完善 |
Weblogic配置JNDI連接 |
Jboss配置JNDI連接——待完善 |
1.3 JNDI
|
Websphere配置JNDI連接——待完善 |
Jboss配置JNDI連接——待完善 |
1.4 其他
[設計器]SAPBW數據連接 |
[設計器]MongoDB數據庫連接 |
JSON數據集 |
2 連接池
2.1 連接池原理
連接池主要由三部分組成:連接池的建立、連接池中連接使用的治理、連接池的關閉。
連接池技術的核心思想,是連接複用,通過建立一個數據庫連接池以及一套連接使用、分配、治理策略,使得該連接池中的連接可以得到高效、安全的複用,避免了數據庫連接頻繁建立、關閉的開銷。另外,由於對JDBC中的原始連接進行了封裝,從而方便了數據庫應用對於連接的使用(特別是對於事務處理),提高了開發效率,也正是因爲這個封裝層的存在,隔離了應用的本身的處理邏輯和具體數據庫訪問邏輯,使應用本身的複用成爲可能。
2.2 連接池屬性
FR 連接池屬性,使用的是 DBCP 連接池,下面介紹其設置方法及其屬性中各參數的意義;如果訪問模板時,報連接超時、等待狀態,警告如下:則
則需要把相應連接數調大。
設置方法:
點擊 服務器>定義數據連接,如下圖所示,點擊連接池屬性,彈出連接池屬性編輯框,調整最大活動連接數:
參數說明:
名稱 | 舉例 | 含義 |
---|---|---|
初始化連接數 | initialSize="1" | 初始化線程數,開始自動建立一個與數據庫的連接 |
最大活動連接數 | maxActive="200" | 可以從對象池中取出的對象最大個數,爲0表示沒有限制 |
最大空閒連接數 | maxIdle="100" | 最大等待連接中的數量,設爲負數則沒有限制(對象池中對象最大個數) |
最小空閒連接數 | minIdle="2" | 對象池中對象最小個數 |
最大等待時間(毫秒) | maxWait="1000" | 最大等待時間,單位爲 ms,超出時間會丟出錯誤信息 |
SQL 驗證查詢 | validationQuery="SQL語句" | 驗證連接是否成功,SQL 和 SELECT 指令至少要返回一行 |
獲取連接前檢驗 | testOnBorrow="false" | 取得對象時是否進行驗證,檢查對象是否有效,默認爲 false |
歸還連接前檢驗 | testOnReturn="true" | 返回對象時是否進行驗證,檢查對象是否有效,默認爲 false |
開啓空閒回收器檢驗 | testWhileIdle="true" | 空閒時是否進行驗證,檢查對象是否有效,默認爲 false |
空閒連接回收器休眠時間(毫秒) | timeBetweenEvictionRunsMillis="1000" | 失效檢查線程運行時間間隔,如果小於等於 0,不會啓動檢查線程 |
空閒連接回收檢查數 | numTestsPerEvictionRun="2" | 失效檢查線程運行次數 |
保持空閒最小時間 | minEvictableIdleTimeMillis="18005000" | 大於 0,進行連接空閒時間判斷,或爲 0,對空閒的連接不進行驗證 |
連接池滿問題
若日誌報ORA-12519 TNS:no appropriate service handler found,是數據庫連接失敗的錯誤,12519錯誤是監聽不能提供服務。
原因:
原因是我們定義數據連接後,點擊連接時,此時會用掉一個連接池中的一個連接。
而在定義數據集後,點擊預覽按鈕,此時連接池就會分配連接,可能會使用之前那個連接(之前的連接已釋放),或分配一個其他的連接或新建一個連接。
若此時連接池所有連接都已用完,就會報如下錯誤:
當客戶請求數據庫連接時,首先是查看連接池中是否有空閒連接(指當前沒有分配出去的連接)。
假如存在空閒連接,則把連接分配給用戶,並作相應的處理(即標記該連接爲正在使用,引用計數加1)。
假如沒有空閒連接,則查看當前所開的連接數是不是已經達到maxConn(最大連接數),若沒達到就重新創建一個連接給請求的客戶;
若達到就按設定的maxWaitTime(最大等待時間)進行等待;
若等待maxWaitTime後,仍沒有空閒連接,就拋出無空閒連接的異常給用戶。
解決方案:
若您在FR連接池屬性的設置中,已將最大連接數設置得過大,還出現如上的報錯,此時通常就是數據庫進程(processes)達到上限導致的,可增大數據庫中的連接數目來解決此問題。如下在數據庫中修改最大連接數:
查看當前的連接數
<span style="color:#334356"><span style="color:#1bc1a1"><img data-cke-saved-src="http://help.finereport.com/js/clipboard/clippy.png" src="http://help.finereport.com/js/clipboard/clippy.png" alt="Copy to clipboard" class="clippy" /><code>select count(*) from V$process;</code></span></span>
查看數據庫允許的最大連接數
<span style="color:#334356"><span style="color:#1bc1a1"><img data-cke-saved-src="http://help.finereport.com/js/clipboard/clippy.png" src="http://help.finereport.com/js/clipboard/clippy.png" alt="Copy to clipboard" class="clippy" /><code>select value from V$parameter where name=<span style="color:#dd1144">'processes'</span>;</code></span></span>
修改最大連接數爲1000
<span style="color:#334356"><span style="color:#1bc1a1"><img data-cke-saved-src="http://help.finereport.com/js/clipboard/clippy.png" src="http://help.finereport.com/js/clipboard/clippy.png" alt="Copy to clipboard" class="clippy" /><code>alter system set processes=<span style="color:teal">1000</span> scope=spfile</code></span></span>
重啓數據庫,再查詢最大連接數,數字改變就表示已修改成功。
說明:當客戶釋放數據庫連接時,先判定該連接的引用次數是否已超過規定值,假如超過就刪除該連接,並判定當前連接池內總的連接數是否小於minConn(最小連接數),若小於就將連接池佈滿;假如沒超過就將該連接標記爲開放狀態,可供再次複用。可看出正是這套策略保證了數據庫連接的有效複用,避免頻繁地建立、釋放連接所帶來的系統資源開銷。