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()
+ "]");
}
}
}