Solved

ResultSet.isBeforeFirst() not working in Java 6, WebLogic 10

Posted on 2009-05-12
13
1,249 Views
Last Modified: 2013-12-18
My team is migrating our web application from WebLogic 8.1 to WebLogic 10.3. We have a whole bunch of places where we check for the presence of data in a ResultSet using rs.isBeforeFirst(). The code works on the old server (WLS 8.1, Java 1.4), but not on the new one (WLS 10.3, Java 6). They're both hitting the same Oracle 10g database.

Is there a bug somewhere I'm not aware of? Maybe a configuration variable I need to change? Could it be a jdbc driver issue?

Thanks!
0
Comment
Question by:ftaco96
  • 5
  • 4
  • 3
  • +1
13 Comments
 
LVL 12

Expert Comment

by:Gibu George
ID: 24367375
If anyexceptions are there please post that
0
 
LVL 86

Assisted Solution

by:CEHJ
CEHJ earned 450 total points
ID: 24367425
>>Could it be a jdbc driver issue?

Yes. As it happens, not all drivers support that call. The important point though is that it's quite unnecessary and actually quite an expensive operation. if (rs.next()) will tell you if there's data. Why do you think you need it?
0
 
LVL 9

Author Comment

by:ftaco96
ID: 24367665
We're already using it (in 440 different places) because sometimes we want to check whether there's data before we try to write it. If there's no data, we write out a "No records retrieved" line, for instance. if (rs.next()) moves to the first record, and then screws up the while (rs.next()).

We may not NEED it, but the fact is that we already have it everywhere in the code, and changing all the code is unfeasible.

If we can find the right driver, that would be preferable. We're looking at differences between our old and new environments driver-wise. If you have any suggestions, please let me know. We're connecting to Oracle 10 in both cases.
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 24367723
>>if (rs.next()) moves to the first record, and then screws up the while (rs.next()).

Well if you want to read it, then of course it would be as below.

See the following for checking out scrollability


http://www.exampledepot.com/egs/java.sql/CanSrs.html


boolean noResults = true;

while(rs.next()) {

    noResults = false;

} 

Open in new window

0
 
LVL 9

Author Comment

by:ftaco96
ID: 24368123
So, how do I find out if my driver supports that call and where to get one that does?
0
 
LVL 92

Assisted Solution

by:objects
objects earned 50 total points
ID: 24370025
> Could it be a jdbc driver issue?

not if you haven't changed the driver version

0
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 
LVL 86

Expert Comment

by:CEHJ
ID: 24370035
>>So, how do I find out if my driver supports that call

See the link i posted
0
 
LVL 92

Expert Comment

by:objects
ID: 24370036
> So, how do I find out if my driver supports that call and where to get one that does?

it would throw an exception if that was the problem :)
doubt thats the problem

0
 
LVL 9

Author Comment

by:ftaco96
ID: 24370201
Thanks guys! I'll look into it more tomorrow.
0
 
LVL 92

Expert Comment

by:objects
ID: 24370303
It may be that there was previously a bug (in java) which you were exploiting and now it has been fixed.
Post your code when you have it and I'll have a look at it for you.

0
 
LVL 9

Author Comment

by:ftaco96
ID: 24374718
Well, I don't see how we could be exploiting a bug, since we're using the method as it's documented.

I should mention that this code works in some places in the web app and breaks in other places. Not sure why.

> > Could it be a jdbc driver issue?
>
> not if you haven't changed the driver version

Actually, I believe the driver version did change. I think the driver was in the ojdbc14.jar file in WLS 8.1 but is in ojdbc6.jar in WLS 10.3. Please correct me if I'm wrong.

I attached a code snippet. I want to reiterate, though, that changing all the code is unfeasible, so I don't need to figure out an alternate way to do this.


public ArrayList getAudit(String monthYear, String orderBy)

   throws Exception {

  OracleCallableStatement stmt = null;

  ResultSet rs = null;

  ArrayList arrData = new ArrayList();

  DOAudit doAudit = null;
 

  DOAuditNotes doNotes = null;
 

  try {

    verifyConnection();

    String spcall = "{call PKG_AUDIT.SP_AUDIT_RESULTS(?,?,?)}";

    stmt = (OracleCallableStatement) con.prepareCall(spcall);

    stmt.registerOutParameter(1, OracleTypes.CURSOR);

    stmt.setString(2, monthYear);

    stmt.setString(3, orderBy);
 

    stmt.execute();

    rs = stmt.getCursor(1);
 

    if (rs.isBeforeFirst()) {
 

      while (rs.next()) {

        /*

          a lot of complicated code

        */

      }       

      arrData.add(doAudit); 

    } 
 

  } catch (Exception ex) {

    logger.error("getAudit", ex);

    throw ex;

  } finally {

	ReleaseResources.release(con, stmt, rs);

	rs = null;

	stmt = null;

	con = null;

  }

  return(arrData);

}

Open in new window

0
 
LVL 86

Expert Comment

by:CEHJ
ID: 24374970

>>I should mention that this code works in some places in the web app and breaks in other places. Not sure why.

Could be that different drivers are being loaded in different parts
0
 
LVL 9

Accepted Solution

by:
ftaco96 earned 0 total points
ID: 24379054
It turns out that there is a patch version of the ojdbc6.jar file that can be downloaded from Oracle.

Here's the readme that discusses the fix...
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/111070_readme.html

BUG-6208793
Behavioural difference in isBeforeFirst between thin and oci when fetched as
cursors.

The download page...
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc_111060.html
0

Featured Post

Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

Join & Write a Comment

Cursors in Oracle: A cursor is used to process individual rows returned by database system for a query. In oracle every SQL statement executed by the oracle server has a private area. This area contains information about the SQL statement and the…
From implementing a password expiration date, to datatype conversions and file export options, these are some useful settings I've found in Jasper Server.
Video by: Steve
Using examples as well as descriptions, step through each of the common simple join types, explaining differences in syntax, differences in expected outputs and showing how the queries run along with the actual outputs based upon a simple set of dem…
Via a live example, show how to take different types of Oracle backups using RMAN.

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now