关于WebLogic中连接池的问题

来源:互联网 发布:yum卸载 保留依赖 编辑:程序博客网 时间:2024/05/01 05:54

    weblogic 中连接池的配置没有什么可说的,按照教程一步步配下来一般都是能成功通过的,但在java中调用时如果由于取得连接的方法不当,就有可能出现当连接数达到一定数量时便取不到连接的情况,出现如下异常:­

weblogic.jdbc.extensions.PoolLimitSQLException: weblogic.common.resourcepool.ResourceLimitException: No resources currently available in pool JDBC Data Source-4 to allocate to applications, please increase the size of the pool and retry..­

经过分析发现造成这种原因的关键之一是对DataSuorce的管理不当造成的,因为weblogic和DataSuorce都能对连接池进行管理,如果DataSuorce在取得连接时需要得到新的DataSuorce的话,我们实际不是连接不够用,而是DataSuorce不够用,发现这个问题后,把DataSuorce置为静态或采用单态方式能有效的解决上面的异常问题,以下是实例代码:­

package com.youlin.tool;­

­

import java.sql.*;­

import javax.sql.*;­

import javax.naming.*;­

import java.io.*;­

import java.util.*;­

­

public class DBConnection {­

private static DataSource ds;­

­

private static String PROPERTIES_NAME = "database.properties";­

static {­

InputStream is = DBConnection.class­

.getResourceAsStream(DBConnection.PROPERTIES_NAME);­

Properties property = new Properties();­

try {­

property.load(is);­

} catch (IOException e1) {­

e1.printStackTrace();­

String jndiurl = property.getProperty("jndi.url");­

String jndiname = property.getProperty("jndi.name");­

System.out.println("jndiurl=" + jndiurl + "/njndiname=" + jndiname);­

Connection con = null; // 连接对象­

Context ctx = null;­

Hashtable ht = new Hashtable();­

try {­

ht.put(Context.INITIAL_CONTEXT_FACTORY,­

"weblogic.jndi.WLInitialContextFactory");­

ht.put(Context.PROVIDER_URL, jndiurl);­

// 创建一个初始上下文环境­

ctx = new InitialContext(ht);­

// 查询weblogic server的JNDI名字服务,JNDI 会指明访问的数据源所在位置。DataSource­

// 数据源与配置的名字是一样­

DataSource ds = (DataSource) ctx.lookup(jndiname);­

// 利用DataSource调用getConnection()方法,获取数据库的配置信息。­

con = ds.getConnection();­

if (con == null) {­

System.out.println("数据库连接失败");­

} catch (Exception e) {­

e.printStackTrace();­

} finally {­

try {­

is.close();­

} catch (IOException e) {­

e.printStackTrace();­

try {­

ctx.close();­

} catch (NamingException e) {­

e.printStackTrace();­

­

public Connection getConnection(String properties) throws Exception {­

return ds.getConnection();­

­

/**­

* 关闭数据库连接­

* ­

* @param conn­

*/­

public void closeAll(Connection conn) {­

if (conn != null) {­

try {­

conn.close();­

} catch (SQLException e) {­

e.printStackTrace();­

­

public void closeAll(Connection conn, ResultSet rs) {­

try {­

if (rs != null) {­

rs.close();­

if (conn != null) {­

conn.close();­

} catch (SQLException e) {­

e.printStackTrace();­

­

public void closeAll(Connection conn, Statement sta, ResultSet rs) {­

try {­

if (rs != null) {­

rs.close();­

if (sta != null) {­

sta.close();­

if (conn != null) {­

conn.close();­

} catch (SQLException e) {­

e.printStackTrace();­

­

public static void main(String[] args) {­

DBConnection dbcon = new DBConnection();­

Connection con = null;­

Statement stm = null;­

ResultSet rs = null;­

try {­

con = dbcon.getConnection(dbcon.PROPERTIES_NAME);­

stm = con.createStatement();­

String sqlstr = "select count(*) re from kjks_stu"; // 书写SQL语句­

rs = stm.executeQuery(sqlstr); // 执行SQL语句,返回查询结果­

while (rs.next()) {­

System.out.print(rs.getString("re"));­

System.out.print("/t");­

System.out.print("/n");­

} catch (Exception e) {­

e.printStackTrace();­

} finally {­

dbcon.closeAll(con, stm, rs);­

------------

database.properties

------------

jndi.url=t3://localhost:7001
jndi.name=jndi/kjks

------------------------

    经100线程的并发测试,没有发现异常,问题得到解决。­