1. 概述
最近針對某銀行的web項目上線,部署在他們的weblogic機器上,根據銀行的規範,部署在WebLogic Server上的應用程序如果需要訪問數據庫,原則上需要通過WebLogic提供的JDBC連接池來管理數據庫連接。
在WebLogic Server中,通過配置JDBC數據源創建數據庫連接。將數據源定向或部署到服務器或集羣的時候,數據庫連接就建立了。每個數據源包含一組池化的數據庫連接。應用程序按名稱在JNDI樹上查找數據源,獲取數據源連接,完成數據庫操作,調用connection.close()將連接歸還給連接池。
2.配置步驟講解
(1)開啓weblogic管理服務器,進入weblogic管理控制檯,點擊左側【服務】→【數據源】,然後點擊右側【新建】→【一般數據源】。
(2)填寫JDBC數據源的【名稱】、【jndi名稱】,選擇數據庫類型
數據源名稱:是WebLogic用於在本域內唯一標識資源項的,不僅要求一個域內配置的多個數據源不能重名,而且不能與域中配置的其他實體如:主機、集羣、服務器的名稱重名。
JNDI名稱:是應用程序獲取數據源所使用的名稱,由應用決定。
(3)選擇Oracle數據庫的驅動程序。在驅動的種類中,non-XA驅動通常比XA驅動性能好,在非特殊情況下均採用第4種JDBC驅動。如圖所示
(4)事務處理選項,默認即可。
(5)根據所連數據庫的信息,填寫數據庫的連接信息:要連接的數據庫,數據庫的IP地址,連接數據庫時使用的端口號,登錄數據庫時使用的用戶名和密碼。
(6)點擊【測試配置】.按鈕,測試數據源是否正常。
這時候如果出現如下場景:
檢查URL的值,這裏值爲:jdbc:oracle:thin:@10.0.2.55:1521:orcl.localdomain改爲jdbc:oracle:thin:@10.0.2.55:1521/orcl.localdomain。即把服務名前:改爲/。
再次點擊測試配置,出現如下,表示數據源創建成功。
(7)點擊完成,回到數據源界面,目標爲空,點擊數據源鏈接
(8)點擊目標選項卡,選擇要部署數據源的服務器,點擊保存,數據源配置成功。
(9)連接池容量配置建議:
選擇【配置】→【連接池】,可以看到連接池的相關容量配置:
初始容量:根據應用需要配置,對於實時交易類應用系統,一般設置爲能滿足日常運行需求峯值要求,同時考慮數據庫對連接數的限制和容量限制
最大容量:根據應用需要和數據庫連接數限制相應設置
最小容量:一般和初始容量相同。
3.在程序中獲取及還回連接
public class DBUtil {
// 獲取日誌類
private static final Logger log = Logger.getLogger("DBUtil.class");
// 初始化上下文需要用到的工廠類
private static final String INITIAL_CONTEXT_FACTORY = "weblogic.jndi.WLInitialContextFactory";
// weblogic服務器的訪問地址
private static final String PROVIDER_URL = "t://10.0.2.181:8101";
// Weblogic服務器中的JNDI數據源名稱
private static final String JNDI = "JNDI/SplOrcl";
private static Context context = null;
static {
Hashtable<String, String> ht = new Hashtable<String, String>();
ht.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
ht.put(Context.PROVIDER_URL, PROVIDER_URL);
try {
// 初始化weblogic server的JNDI上下文信息
context = new InitialContext(ht);
} catch (NamingException e) {
log.info("DBUtils : Exit -->[Context init error]");
log.error("InitialContext(naming)--[message:" + e.getMessage()
+ "]");
}
}
public static Connection getConnect() {
Context ctx = null;
Connection conn = null;
try {
ctx = context;
// 獲取數據源對象
javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup(JNDI);
// 獲取數據源連接
conn = ds.getConnection();
} catch (SQLException e) {
log.info("DBUtils : Exit-->[getConnection error because : "
+ e.getMessage() + " ]");
log.error("get db connection error(sql)--[errorCode:"
+ e.getErrorCode() + ";message:" + e.getMessage()
+ "]");
} catch (NamingException e) {
log.info("DBUtils : Exit-->[getConnection error because:"
+ e.getMessage() + "]");
log.error("get db connection error(naming)--[message:"
+ e.getMessage() + "]");
} catch (Exception e) {
log.info("DBUtils : Exit-->[getConnection error because:"
+ e.getMessage() + "]");
log.error("get db connection error(other)--[message:"
+ e.getMessage() + "]");
}
return conn;
}
public static void close(ResultSet rs, Statement stat, Connection conn) {
try {
if (rs != null)
rs.close();
if (stat != null)
stat.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
log.info("DBUtils : Exit-->[close resource error because:"
+ e.getMessage() + "]");
log.error("close db connection error--[errorCode:"
+ e.getErrorCode() + ";message:" + e.getMessage()
+ "]");
}
}
}