使用websphere连接池出现一个问题,请大家帮忙.
请大家帮忙看下,服务器上的配置应该没有问题,我怀疑是操作池出现了问题,大家帮忙看下,或者给我一个比较好的使用websphere jndi连接池 的示例.
1.错误如下
[08-6-24 20:59:45:000 CST] 00000055 MCWrapper E J2CA0081E: 尝试在资源 jdbc/searchOil 的 ManagedConnection WSRdbManagedConnectionImpl@158e71a2 上执行方法 cleanup 时方法 cleanup 失败。捕获到异常:java.lang.NullPointerException
at com.ibm.ws.rsadapter.jdbc.WSJdbcObject.closeChildWrappers(WSJdbcObject.java:162)
at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.dissociate(WSJdbcConnection.java:1204)
at com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.dissociateConnections(WSRdbManagedConnectionImpl.java:845)
at com.ibm.ejs.j2c.MCWrapper.cleanup(MCWrapper.java:1336)
at com.ibm.ejs.j2c.poolmanager.FreePool.returnToFreePool(FreePool.java:447)
at com.ibm.ejs.j2c.poolmanager.PoolManager.release(PoolManager.java:1508)
at com.ibm.ejs.j2c.MCWrapper.releaseToPoolManager(MCWrapper.java:1945)
at com.ibm.ejs.j2c.LocalTransactionWrapper.afterCompletion(LocalTransactionWrapper.java:1130)
at com.ibm.ws.LocalTransaction.LocalTranCoordImpl.informSynchronizations(LocalTranCoordImpl.java:1472)
at com.ibm.ws.LocalTransaction.LocalTranCoordImpl.cleanup(LocalTranCoordImpl.java:1180)
at com.ibm.ws.LocalTransaction.LocalTranCoordImpl.end(LocalTranCoordImpl.java:1285)
at com.ibm.ws.webcontainer.webapp.WebAppTransactionCollaborator.postInvoke(WebAppTransactionCollaborator.java:254)
at com.ibm.ws.webcontainer.webapp.WebApp.transactionPostInvoke(WebApp.java:3092)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:874)
at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:80)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:1802)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:84)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:469)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:408)
at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:101)
at com.ibm.ws.ssl.channel.impl.SSLReadServiceContext$SSLReadCompletedCallback.complete(SSLReadServiceContext.java:1686)
at com.ibm.ws.tcp.channel.impl.WorkQueueManager.requestComplete(WorkQueueManager.java:566)
at com.ibm.ws.tcp.channel.impl.WorkQueueManager.attemptIO(WorkQueueManager.java:619)
at com.ibm.ws.tcp.channel.impl.WorkQueueManager.workerRun(WorkQueueManager.java:952)
at com.ibm.ws.tcp.channel.impl.WorkQueueManager$Worker.run(WorkQueueManager.java:1039)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1455)
[08-6-24 20:59:45:063 CST] 00000055 MCWrapper E J2CA0081E: 尝试在资源 No longer available 的 ManagedConnection WSRdbManagedConnectionImpl@158e71a2 上执行方法 destroy 时方法 destroy 失败。捕获到异常:java.lang.NullPointerException
at com.ibm.ws.rsadapter.jdbc.WSJdbcObject.closeChildWrappers(WSJdbcObject.java:162)
at com.ibm.ws.rsadapter.jdbc.WSJdbcObject.close(WSJdbcObject.java:125)
at com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.closeHandles(WSRdbManagedConnectionImpl.java:3405)
at com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.destroy(WSRdbManagedConnectionImpl.java:2746)
at com.ibm.ejs.j2c.MCWrapper.destroy(MCWrapper.java:1544)
at com.ibm.ejs.j2c.poolmanager.FreePool.returnToFreePool(FreePool.java:460)
at com.ibm.ejs.j2c.poolmanager.PoolManager.release(PoolManager.java:1508)
at com.ibm.ejs.j2c.MCWrapper.releaseToPoolManager(MCWrapper.java:1945)
at com.ibm.ejs.j2c.LocalTransactionWrapper.afterCompletion(LocalTransactionWrapper.java:1130)
at com.ibm.ws.LocalTransaction.LocalTranCoordImpl.informSynchronizations(LocalTranCoordImpl.java:1472)
at com.ibm.ws.LocalTransaction.LocalTranCoordImpl.cleanup(LocalTranCoordImpl.java:1180)
at com.ibm.ws.LocalTransaction.LocalTranCoordImpl.end(LocalTranCoordImpl.java:1285)
at com.ibm.ws.webcontainer.webapp.WebAppTransactionCollaborator.postInvoke(WebAppTransactionCollaborator.java:254)
at com.ibm.ws.webcontainer.webapp.WebApp.transactionPostInvoke(WebApp.java:3092)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:874)
at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:80)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:1802)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:84)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:469)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:408)
at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:101)
at com.ibm.ws.ssl.channel.impl.SSLReadServiceContext$SSLReadCompletedCallback.complete(SSLReadServiceContext.java:1686)
at com.ibm.ws.tcp.channel.impl.WorkQueueManager.requestComplete(WorkQueueManager.java:566)
at com.ibm.ws.tcp.channel.impl.WorkQueueManager.attemptIO(WorkQueueManager.java:619)
at com.ibm.ws.tcp.channel.impl.WorkQueueManager.workerRun(WorkQueueManager.java:952)
at com.ibm.ws.tcp.channel.impl.WorkQueueManager$Worker.run(WorkQueueManager.java:1039)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1455)
2.配置的JNDI连接池,测试过连接正常,但是连接次数过过就会提示如上错误,或者直接提示connction未关闭.
我把我写的辅助类,和配置文件,以及调用类发出来,大家帮我看下.
配置文件:
dataSourceName=jdbc/searchOil
factory=com.ibm.websphere.naming.WsnInitialContextFactory
url=iiop://localhost:2809/
DataProvider=OracleDB
CoreDataProvider=OracleDB
辅助类:
public class DBConnection
{
private java.sql.Connection FConnection = null;
private static DBConnection FInstance = new DBConnection();
private Context FContext = null;
/**
* 初始化
*/
private void InitContext()
{
try
{
Hashtable env = new Hashtable();
env.put( Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
FContext = new InitialContext(env);
System.out.print("-----" + FContext);
//FContext = new InitialContext();
} catch(Exception e)
{
System.out.println("不能初始化连接工厂环境,"+e.toString() );
}
}
/**
* 获取给定JNDI名的数据源
*/
public DataSource getDataSource(String JNDIName)
{
javax.sql.DataSource ds = null;
try
{
ds = ( javax.sql.DataSource)FContext.lookup(JNDIName) ;
} catch( Exception e1)
{
System.out.println( "查找数据源异常," + e1.toString() );
}
return ds;
}
private String getJNDIName()
{
String result = "";
try
{
java.net.URL url =DBConnection.class.getResource("/db_config.properties");
System.out.println("url"+url);
InputStream is = (InputStream) url.getContent();
Properties props = new Properties();
props.load(is);
result = props.getProperty( "dataSourceName");
//System.out.println( result);
} catch (Exception e)
{
e.printStackTrace();
}
return result;
}
/**
* 构造函数,完成Context初始化并获取数据连接
*/
private DBConnection()
{
InitContext();
String jndi = getJNDIName();
DataSource ds = getDataSource( jndi);
if( ds == null)
{
System.out.println( "无法获得指定名称的jndi!");
}
try
{
FConnection = ds.getConnection();
} catch( Exception e)
{
System.out.println( "获取连接错误," + e.toString());
}
}
synchronized public static DBConnection getInstance()
{
return FInstance;
}
public Connection getConnection()
{
return FConnection;
}
public Statement newStatement()
{
if( FConnection == null)
return null;
Statement st = null;
try
{
st = FConnection.createStatement();
} catch( Exception e)
{
e.printStackTrace();
System.out.println( "Error Trace in NewStatement() : " + e.getMessage());
}
return st;
}
public static void main(String[] args)
{
DBConnection db = DBConnection.getInstance();
db.getConnection();
System.out.println( "hello,world!");
}
}
调用方法
try {
java.sql.ResultSet rs = null;
Statement stmt = null;
DBConnection db = DBConnection.getInstance();
stmt = db.newStatement();
String sql = "select jd_id from km_a04 where sjjd_id = '"+id+"'";
rs = stmt.executeQuery(sql);
while(rs.next()) {
jdId.add(rs.getString(1));
getMorejdId(jdId,rs.getString(1));
}
rs.close();
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}