[200分在线求助] sessionbean + 连接池 出错 你的con在作用结束以后,是否close了?每次作用结束都有close连接,要用到时再连接getDB 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 问题是 con = testbean.getDB(); //在这里就出现错误了只要一getDB就出问题 con = ds.getConnection(); 那应该是在调用这一句的时候出错的了.你不用Rmi在本地调用一下试试 connection不能作为EJB的参数或者返回值,因为它不能垮RMI连接数据库;另外也未必实现serializable接口 liulang203(火的冰点) :con = ds.getConnection(); 那应该是在调用这一句的时候出错的了.你不用Rmi在本地调用一下试试********************************肯定没错,我放到jsp里边调试过的connection不能作为EJB的参数或者返回值,因为它不能垮RMI连接数据库;另外也未必实现serializable接口********************************是否意味着我肯定不能通过SESSIONBEAN 返回一个CONNECTION对象了? catch (Exception e1) { con=null; System.gc(); }这个地方需要修改一下,如果抛出异常,System.gc()的频繁调用会使你的系统严重变慢。从提示信息可以看出来你没有手工关闭connection连接。try下面代码: public Connection getDB() { Connection con = null; try { //创建JNDI上下文 Context ctx = new InitialContext(); //获得数据源 DataSource ds = (DataSource) ctx.lookup("java:/OracleDS"); con = ds.getConnection(); }catch(NamingException e){ //.... }catch(SQLException e){ System.out.println("无法取得数据库连接"); } return con; } public static void free(Connection conn){ try{ if(conn!=null) conn.close(); }catch(Exception e){ conn=null; System.out.println("释放数据库连接失败!"); } } public static void free(Connection conn, Statement stm){ try{ if(stm != null){ stm.close(); stm=null; } }catch(SQLException ex){ } try{ if(conn != null){ conn.close(); conn=null; } }catch(SQLException ex){ }} 而且为什么要这样做呢?直接把data logic放到第一个sessionbean里面不就行了吗? catch (Exception e1) { con=null; System.gc(); }这部分代码需要修改,con=null不代表con被释放。如果发生异常,System.gc()会使你的垃圾回收经常调用,严重影响性能。因为jboss不能自动释放Connection,所以你需要手工操作,try改称下面代码: public Connection getDB() { Connection con = null; try { //创建JNDI上下文 Context ctx = new InitialContext(); //获得数据源 DataSource ds = (DataSource) ctx.lookup("java:/OracleDS"); con = ds.getConnection(); }catch(NamingException e){ //..... }catch(SQLException e){ System.out.println("无法取得数据库连接"); } return con; } public static void free(Connection conn){ try{ if(conn!=null) conn.close(); }catch(Exception e){ conn=null; System.out.println("释放数据库连接失败!"); } } public static void free(Connection conn, Statement stm){ try{ if(stm != null){ stm.close(); stm=null; } }catch(SQLException ex){ } try{ if(conn != null){ conn.close(); conn=null; } }catch(SQLException ex){ }} 这是一个取得Connnection的sessionbean主要内容,绝对可行:private Connection conn;private ConnDb cnnDb;private final String dbJNDI = "java:/OracleDS";public void ejbRemove() { try{ conn.close(); }catch(Exception ex){ ex.printStackTrace(); }}private void getConnection() throws SQLException, NamingException { InitialContext ic = new InitialContext(); DataSource ds = (DataSource) ic.lookup(dbJNDI); conn = ds.getConnection();}public void ejbCreate() throws CreateException { try{ getConnection(); cnndb = new ConnDb(conn);//把conn传给另一个辅助Bean:ConnDb由它去做数据操作, 注意出错了要关闭conn; }catch(Exception ex){ throw new CreateException("ejbCreate Fail!"); }} ConnDb是一个JAVAbean吧,应该不是sessionbean,但是在sessionBEAN中怎么能调用javabean呢? 可是不够灵活啊,我想写个sessionbean返回connection ,让所有的数据库操作都调用它啊 public Connection getDB() { Connection con = null; try { //创建JNDI上下文 Context ctx = new InitialContext(); //获得数据源 DataSource ds = (DataSource) ctx.lookup("java:/OracleDS"); con = ds.getConnection(); }catch (Exception e1) { con=null; System.gc(); } return con; }********************************************然后在同一个sessionbean我们通过getDB得到数据连接public ResultSet resultset(String sql){try{Connection con=getDB();Statement stmt=con.createStatement();ResultSet rs=stmt.execute(sql);}catch(Exception eee){..........}return rs;}**********************************把这个函数作为外部调用接口public Vector ss(String sql,int i){ ResultSet rs=resultset(sql); Vector v=new Vector(); int g=0; while(rs.next()) { for(g=1;g<=i;g++) { v.addElement(rs.getString(g)); } }return v;}*************************************好了,剩下就是在servlet中调用ss(sql,i),然后把Vector解开就OK,灵活,万能的,我一直都用它 果然不错,sanyo_rider的回答最好,我打算给100分,另一100给本贴的顶的人,请sanyo_rider到我开的另一贴拿分 请教关于JAVA读取大量文件的问题 MyEclipse反向工程问题报错 java 货币格式化问题 google退出。言-论-自-由 JAVA web项目 报表问题 聘请上海开发人员 关于Java连接数据库的基本问题 急!!! 再线等待,关于tomcat的配置问题 想知道Struts中,是如何实现"view"部份的,请给个例子,谢谢 询问 lookup EjbJNDI 时的奇怪问题 tomcat 源码应在哪里下载啊 双击启动RESIN和把RESIN作为服务有什么不同吗?
只要一getDB就出问题
你不用Rmi在本地调用一下试试
con = ds.getConnection(); 那应该是在调用这一句的时候出错的了.
你不用Rmi在本地调用一下试试
********************************肯定没错,我放到jsp里边调试过的connection不能作为EJB的参数或者返回值,因为它不能垮RMI连接数据库;另外也未必实现serializable接口
********************************是否意味着我肯定不能通过SESSIONBEAN 返回一个CONNECTION对象了?
{
con=null;
System.gc();
}
这个地方需要修改一下,如果抛出异常,System.gc()的频繁调用会使你的系统严重变慢。从提示信息可以看出来你没有手工关闭connection连接。try下面代码:
public Connection getDB() {
Connection con = null;
try
{
//创建JNDI上下文
Context ctx = new InitialContext();
//获得数据源
DataSource ds = (DataSource) ctx.lookup("java:/OracleDS");
con = ds.getConnection();
}catch(NamingException e){
//....
}catch(SQLException e){
System.out.println("无法取得数据库连接");
}
return con;
} public static void free(Connection conn){
try{
if(conn!=null)
conn.close();
}catch(Exception e){
conn=null;
System.out.println("释放数据库连接失败!");
}
} public static void free(Connection conn, Statement stm){
try{
if(stm != null){
stm.close();
stm=null;
}
}catch(SQLException ex){
}
try{
if(conn != null){
conn.close();
conn=null;
}
}catch(SQLException ex){
}
}
{
con=null;
System.gc();
}
这部分代码需要修改,con=null不代表con被释放。如果发生异常,System.gc()会使你的垃圾回收经常调用,严重影响性能。因为jboss不能自动释放Connection,所以你需要手工操作,try改称下面代码: public Connection getDB() {
Connection con = null;
try
{
//创建JNDI上下文
Context ctx = new InitialContext();
//获得数据源
DataSource ds = (DataSource) ctx.lookup("java:/OracleDS");
con = ds.getConnection();
}catch(NamingException e){
//.....
}catch(SQLException e){
System.out.println("无法取得数据库连接");
}
return con;
}
public static void free(Connection conn){
try{
if(conn!=null)
conn.close();
}catch(Exception e){
conn=null;
System.out.println("释放数据库连接失败!");
}
} public static void free(Connection conn, Statement stm){
try{
if(stm != null){
stm.close();
stm=null;
}
}catch(SQLException ex){
}
try{
if(conn != null){
conn.close();
conn=null;
}
}catch(SQLException ex){
}
}
private Connection conn;
private ConnDb cnnDb;
private final String dbJNDI = "java:/OracleDS";
public void ejbRemove() {
try{
conn.close();
}catch(Exception ex){
ex.printStackTrace();
}
}private void getConnection() throws SQLException, NamingException {
InitialContext ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup(dbJNDI);
conn = ds.getConnection();
}public void ejbCreate() throws CreateException {
try{
getConnection();
cnndb = new ConnDb(conn);//把conn传给另一个辅助Bean:ConnDb由它去做数据操作,
注意出错了要关闭conn;
}catch(Exception ex){
throw new CreateException("ejbCreate Fail!");
}
}
Connection con = null;
try
{
//创建JNDI上下文
Context ctx = new InitialContext();
//获得数据源
DataSource ds = (DataSource) ctx.lookup("java:/OracleDS");
con = ds.getConnection();
}catch (Exception e1)
{
con=null;
System.gc();
}
return con;
}
********************************************
然后在同一个sessionbean我们通过getDB得到数据连接
public ResultSet resultset(String sql)
{
try{
Connection con=getDB();
Statement stmt=con.createStatement();
ResultSet rs=stmt.execute(sql);
}catch(Exception eee){..........}
return rs;
}**********************************把这个函数作为外部调用接口
public Vector ss(String sql,int i)
{
ResultSet rs=resultset(sql);
Vector v=new Vector();
int g=0;
while(rs.next())
{
for(g=1;g<=i;g++)
{
v.addElement(rs.getString(g));
}
}
return v;
}*************************************
好了,剩下就是在servlet中调用ss(sql,i),然后把Vector解开就OK,灵活,万能的,我一直都用它